From 57457fadb8265d738492a392ce81cc8ae5f48472 Mon Sep 17 00:00:00 2001 From: raykim1996 Date: Wed, 29 Sep 2021 23:35:41 -0400 Subject: [PATCH 01/10] submit --- .gitignore | 1 + dist/bundle.js | 10798 +++++++++++++++++++++++++++ dist/bundle.js.map | 1 + dist/index.html | 20 + img/HW00-CustomShader-01.png | Bin 0 -> 164519 bytes img/HW00-CustomShader-02.png | Bin 0 -> 134945 bytes img/HW00-LambertShader.png | Bin 0 -> 109008 bytes package-lock.json | 3120 ++++++++ package.json | 22 + src/Camera.ts | 41 + src/geometry/Cube.ts | 99 + src/geometry/Icosphere.ts | 179 + src/geometry/Square.ts | 47 + src/globals.ts | 5 + src/main.ts | 178 + src/rendering/gl/Drawable.ts | 67 + src/rendering/gl/OpenGLRenderer.ts | 46 + src/rendering/gl/ShaderProgram.ts | 154 + src/shaders/custom-frag.glsl | 101 + src/shaders/custom-vert.glsl | 135 + src/shaders/lambert-frag.glsl | 47 + src/shaders/lambert-vert.glsl | 55 + src/shaders/moon-frag.glsl | 156 + src/shaders/moon-vert.glsl | 62 + src/shaders/planet-frag.glsl | 293 + src/shaders/planet-vert.glsl | 280 + tsconfig.json | 11 + webpack.config.js | 37 + 28 files changed, 15955 insertions(+) create mode 100644 .gitignore create mode 100644 dist/bundle.js create mode 100644 dist/bundle.js.map create mode 100644 dist/index.html create mode 100644 img/HW00-CustomShader-01.png create mode 100644 img/HW00-CustomShader-02.png create mode 100644 img/HW00-LambertShader.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/Camera.ts create mode 100644 src/geometry/Cube.ts create mode 100644 src/geometry/Icosphere.ts create mode 100644 src/geometry/Square.ts create mode 100644 src/globals.ts create mode 100644 src/main.ts create mode 100644 src/rendering/gl/Drawable.ts create mode 100644 src/rendering/gl/OpenGLRenderer.ts create mode 100644 src/rendering/gl/ShaderProgram.ts create mode 100644 src/shaders/custom-frag.glsl create mode 100644 src/shaders/custom-vert.glsl create mode 100644 src/shaders/lambert-frag.glsl create mode 100644 src/shaders/lambert-vert.glsl create mode 100644 src/shaders/moon-frag.glsl create mode 100644 src/shaders/moon-vert.glsl create mode 100644 src/shaders/planet-frag.glsl create mode 100644 src/shaders/planet-vert.glsl create mode 100644 tsconfig.json create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/dist/bundle.js b/dist/bundle.js new file mode 100644 index 00000000..7a21c7b2 --- /dev/null +++ b/dist/bundle.js @@ -0,0 +1,10798 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/3d-view-controls/camera.js": +/*!*************************************************!*\ + !*** ./node_modules/3d-view-controls/camera.js ***! + \*************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = createCamera + +var now = __webpack_require__(/*! right-now */ "./node_modules/right-now/browser.js") +var createView = __webpack_require__(/*! 3d-view */ "./node_modules/3d-view/view.js") +var mouseChange = __webpack_require__(/*! mouse-change */ "./node_modules/mouse-change/mouse-listen.js") +var mouseWheel = __webpack_require__(/*! mouse-wheel */ "./node_modules/mouse-wheel/wheel.js") +var mouseOffset = __webpack_require__(/*! mouse-event-offset */ "./node_modules/mouse-event-offset/index.js") +var hasPassive = __webpack_require__(/*! has-passive-events */ "./node_modules/has-passive-events/index.js") + +function createCamera(element, options) { + element = element || document.body + options = options || {} + + var limits = [ 0.01, Infinity ] + if('distanceLimits' in options) { + limits[0] = options.distanceLimits[0] + limits[1] = options.distanceLimits[1] + } + if('zoomMin' in options) { + limits[0] = options.zoomMin + } + if('zoomMax' in options) { + limits[1] = options.zoomMax + } + + var view = createView({ + center: options.center || [0,0,0], + up: options.up || [0,1,0], + eye: options.eye || [0,0,10], + mode: options.mode || 'orbit', + distanceLimits: limits + }) + + var pmatrix = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + var distance = 0.0 + var width = element.clientWidth + var height = element.clientHeight + + var camera = { + view: view, + element: element, + delay: options.delay || 16, + rotateSpeed: options.rotateSpeed || 1, + zoomSpeed: options.zoomSpeed || 1, + translateSpeed: options.translateSpeed || 1, + flipX: !!options.flipX, + flipY: !!options.flipY, + modes: view.modes, + tick: function() { + var t = now() + var delay = this.delay + view.idle(t-delay) + view.flush(t-(100+delay*2)) + var ctime = t - 2 * delay + view.recalcMatrix(ctime) + var allEqual = true + var matrix = view.computedMatrix + for(var i=0; i<16; ++i) { + allEqual = allEqual && (pmatrix[i] === matrix[i]) + pmatrix[i] = matrix[i] + } + var sizeChanged = + element.clientWidth === width && + element.clientHeight === height + width = element.clientWidth + height = element.clientHeight + if(allEqual) { + return !sizeChanged + } + distance = Math.exp(view.computedRadius[0]) + return true + }, + lookAt: function(center, eye, up) { + view.lookAt(view.lastT(), center, eye, up) + }, + rotate: function(pitch, yaw, roll) { + view.rotate(view.lastT(), pitch, yaw, roll) + }, + pan: function(dx, dy, dz) { + view.pan(view.lastT(), dx, dy, dz) + }, + translate: function(dx, dy, dz) { + view.translate(view.lastT(), dx, dy, dz) + } + } + + Object.defineProperties(camera, { + matrix: { + get: function() { + return view.computedMatrix + }, + set: function(mat) { + view.setMatrix(view.lastT(), mat) + return view.computedMatrix + }, + enumerable: true + }, + mode: { + get: function() { + return view.getMode() + }, + set: function(mode) { + view.setMode(mode) + return view.getMode() + }, + enumerable: true + }, + center: { + get: function() { + return view.computedCenter + }, + set: function(ncenter) { + view.lookAt(view.lastT(), ncenter) + return view.computedCenter + }, + enumerable: true + }, + eye: { + get: function() { + return view.computedEye + }, + set: function(neye) { + view.lookAt(view.lastT(), null, neye) + return view.computedEye + }, + enumerable: true + }, + up: { + get: function() { + return view.computedUp + }, + set: function(nup) { + view.lookAt(view.lastT(), null, null, nup) + return view.computedUp + }, + enumerable: true + }, + distance: { + get: function() { + return distance + }, + set: function(d) { + view.setDistance(view.lastT(), d) + return d + }, + enumerable: true + }, + distanceLimits: { + get: function() { + return view.getDistanceLimits(limits) + }, + set: function(v) { + view.setDistanceLimits(v) + return v + }, + enumerable: true + } + }) + + element.addEventListener('contextmenu', function(ev) { + ev.preventDefault() + return false + }) + + var lastX = 0, lastY = 0, lastMods = {shift: false, control: false, alt: false, meta: false} + mouseChange(element, handleInteraction) + + //enable simple touch interactions + element.addEventListener('touchstart', function (ev) { + var xy = mouseOffset(ev.changedTouches[0], element) + handleInteraction(0, xy[0], xy[1], lastMods) + handleInteraction(1, xy[0], xy[1], lastMods) + + ev.preventDefault() + }, hasPassive ? {passive: false} : false) + + element.addEventListener('touchmove', function (ev) { + var xy = mouseOffset(ev.changedTouches[0], element) + handleInteraction(1, xy[0], xy[1], lastMods) + + ev.preventDefault() + }, hasPassive ? {passive: false} : false) + + element.addEventListener('touchend', function (ev) { + var xy = mouseOffset(ev.changedTouches[0], element) + handleInteraction(0, lastX, lastY, lastMods) + + ev.preventDefault() + }, hasPassive ? {passive: false} : false) + + function handleInteraction (buttons, x, y, mods) { + var scale = 1.0 / element.clientHeight + var dx = scale * (x - lastX) + var dy = scale * (y - lastY) + + var flipX = camera.flipX ? 1 : -1 + var flipY = camera.flipY ? 1 : -1 + + var drot = Math.PI * camera.rotateSpeed + + var t = now() + + if(buttons & 1) { + if(mods.shift) { + view.rotate(t, 0, 0, -dx * drot) + } else { + view.rotate(t, flipX * drot * dx, -flipY * drot * dy, 0) + } + } else if(buttons & 2) { + view.pan(t, -camera.translateSpeed * dx * distance, camera.translateSpeed * dy * distance, 0) + } else if(buttons & 4) { + var kzoom = camera.zoomSpeed * dy / window.innerHeight * (t - view.lastT()) * 50.0 + view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1)) + } + + lastX = x + lastY = y + lastMods = mods + } + + mouseWheel(element, function(dx, dy, dz) { + var flipX = camera.flipX ? 1 : -1 + var flipY = camera.flipY ? 1 : -1 + var t = now() + if(Math.abs(dx) > Math.abs(dy)) { + view.rotate(t, 0, 0, -dx * flipX * Math.PI * camera.rotateSpeed / window.innerWidth) + } else { + var kzoom = camera.zoomSpeed * flipY * dy / window.innerHeight * (t - view.lastT()) / 100.0 + view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1)) + } + }, true) + + return camera +} + + +/***/ }), + +/***/ "./node_modules/3d-view/view.js": +/*!**************************************!*\ + !*** ./node_modules/3d-view/view.js ***! + \**************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = createViewController + +var createTurntable = __webpack_require__(/*! turntable-camera-controller */ "./node_modules/turntable-camera-controller/turntable.js") +var createOrbit = __webpack_require__(/*! orbit-camera-controller */ "./node_modules/orbit-camera-controller/orbit.js") +var createMatrix = __webpack_require__(/*! matrix-camera-controller */ "./node_modules/matrix-camera-controller/matrix.js") + +function ViewController(controllers, mode) { + this._controllerNames = Object.keys(controllers) + this._controllerList = this._controllerNames.map(function(n) { + return controllers[n] + }) + this._mode = mode + this._active = controllers[mode] + if(!this._active) { + this._mode = 'turntable' + this._active = controllers.turntable + } + this.modes = this._controllerNames + this.computedMatrix = this._active.computedMatrix + this.computedEye = this._active.computedEye + this.computedUp = this._active.computedUp + this.computedCenter = this._active.computedCenter + this.computedRadius = this._active.computedRadius +} + +var proto = ViewController.prototype + +proto.flush = function(a0) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].flush(a0) + } +} +proto.idle = function(a0) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].idle(a0) + } +} +proto.lookAt = function(a0, a1, a2, a3) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].lookAt(a0, a1, a2, a3) + } +} +proto.rotate = function(a0, a1, a2, a3) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].rotate(a0, a1, a2, a3) + } +} +proto.pan = function(a0, a1, a2, a3) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].pan(a0, a1, a2, a3) + } +} +proto.translate = function(a0, a1, a2, a3) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].translate(a0, a1, a2, a3) + } +} +proto.setMatrix = function(a0, a1) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].setMatrix(a0, a1) + } +} +proto.setDistanceLimits = function(a0, a1) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].setDistanceLimits(a0, a1) + } +} +proto.setDistance = function(a0, a1) { + var cc = this._controllerList + for (var i = 0; i < cc.length; ++i) { + cc[i].setDistance(a0, a1) + } +} + +proto.recalcMatrix = function(t) { + this._active.recalcMatrix(t) +} + +proto.getDistance = function(t) { + return this._active.getDistance(t) +} +proto.getDistanceLimits = function(out) { + return this._active.getDistanceLimits(out) +} + +proto.lastT = function() { + return this._active.lastT() +} + +proto.setMode = function(mode) { + if(mode === this._mode) { + return + } + var idx = this._controllerNames.indexOf(mode) + if(idx < 0) { + return + } + var prev = this._active + var next = this._controllerList[idx] + var lastT = Math.max(prev.lastT(), next.lastT()) + + prev.recalcMatrix(lastT) + next.setMatrix(lastT, prev.computedMatrix) + + this._active = next + this._mode = mode + + //Update matrix properties + this.computedMatrix = this._active.computedMatrix + this.computedEye = this._active.computedEye + this.computedUp = this._active.computedUp + this.computedCenter = this._active.computedCenter + this.computedRadius = this._active.computedRadius +} + +proto.getMode = function() { + return this._mode +} + +function createViewController(options) { + options = options || {} + + var eye = options.eye || [0,0,1] + var center = options.center || [0,0,0] + var up = options.up || [0,1,0] + var limits = options.distanceLimits || [0, Infinity] + var mode = options.mode || 'turntable' + + var turntable = createTurntable() + var orbit = createOrbit() + var matrix = createMatrix() + + turntable.setDistanceLimits(limits[0], limits[1]) + turntable.lookAt(0, eye, center, up) + orbit.setDistanceLimits(limits[0], limits[1]) + orbit.lookAt(0, eye, center, up) + matrix.setDistanceLimits(limits[0], limits[1]) + matrix.lookAt(0, eye, center, up) + + return new ViewController({ + turntable: turntable, + orbit: orbit, + matrix: matrix + }, mode) +} + +/***/ }), + +/***/ "./node_modules/binary-search-bounds/search-bounds.js": +/*!************************************************************!*\ + !*** ./node_modules/binary-search-bounds/search-bounds.js ***! + \************************************************************/ +/***/ ((module) => { + +"use strict"; + + +// (a, y, c, l, h) = (array, y[, cmp, lo, hi]) + +function ge(a, y, c, l, h) { + var i = h + 1; + while (l <= h) { + var m = (l + h) >>> 1, x = a[m]; + var p = (c !== undefined) ? c(x, y) : (x - y); + if (p >= 0) { i = m; h = m - 1 } else { l = m + 1 } + } + return i; +}; + +function gt(a, y, c, l, h) { + var i = h + 1; + while (l <= h) { + var m = (l + h) >>> 1, x = a[m]; + var p = (c !== undefined) ? c(x, y) : (x - y); + if (p > 0) { i = m; h = m - 1 } else { l = m + 1 } + } + return i; +}; + +function lt(a, y, c, l, h) { + var i = l - 1; + while (l <= h) { + var m = (l + h) >>> 1, x = a[m]; + var p = (c !== undefined) ? c(x, y) : (x - y); + if (p < 0) { i = m; l = m + 1 } else { h = m - 1 } + } + return i; +}; + +function le(a, y, c, l, h) { + var i = l - 1; + while (l <= h) { + var m = (l + h) >>> 1, x = a[m]; + var p = (c !== undefined) ? c(x, y) : (x - y); + if (p <= 0) { i = m; l = m + 1 } else { h = m - 1 } + } + return i; +}; + +function eq(a, y, c, l, h) { + while (l <= h) { + var m = (l + h) >>> 1, x = a[m]; + var p = (c !== undefined) ? c(x, y) : (x - y); + if (p === 0) { return m } + if (p <= 0) { l = m + 1 } else { h = m - 1 } + } + return -1; +}; + +function norm(a, y, c, l, h, f) { + if (typeof c === 'function') { + return f(a, y, c, (l === undefined) ? 0 : l | 0, (h === undefined) ? a.length - 1 : h | 0); + } + return f(a, y, undefined, (c === undefined) ? 0 : c | 0, (l === undefined) ? a.length - 1 : l | 0); +} + +module.exports = { + ge: function(a, y, c, l, h) { return norm(a, y, c, l, h, ge)}, + gt: function(a, y, c, l, h) { return norm(a, y, c, l, h, gt)}, + lt: function(a, y, c, l, h) { return norm(a, y, c, l, h, lt)}, + le: function(a, y, c, l, h) { return norm(a, y, c, l, h, le)}, + eq: function(a, y, c, l, h) { return norm(a, y, c, l, h, eq)} +} + + +/***/ }), + +/***/ "./node_modules/cubic-hermite/hermite.js": +/*!***********************************************!*\ + !*** ./node_modules/cubic-hermite/hermite.js ***! + \***********************************************/ +/***/ ((module) => { + +"use strict"; + + +function dcubicHermite(p0, v0, p1, v1, t, f) { + var dh00 = 6*t*t-6*t, + dh10 = 3*t*t-4*t + 1, + dh01 = -6*t*t+6*t, + dh11 = 3*t*t-2*t + if(p0.length) { + if(!f) { + f = new Array(p0.length) + } + for(var i=p0.length-1; i>=0; --i) { + f[i] = dh00*p0[i] + dh10*v0[i] + dh01*p1[i] + dh11*v1[i] + } + return f + } + return dh00*p0 + dh10*v0 + dh01*p1[i] + dh11*v1 +} + +function cubicHermite(p0, v0, p1, v1, t, f) { + var ti = (t-1), t2 = t*t, ti2 = ti*ti, + h00 = (1+2*t)*ti2, + h10 = t*ti2, + h01 = t2*(3-2*t), + h11 = t2*ti + if(p0.length) { + if(!f) { + f = new Array(p0.length) + } + for(var i=p0.length-1; i>=0; --i) { + f[i] = h00*p0[i] + h10*v0[i] + h01*p1[i] + h11*v1[i] + } + return f + } + return h00*p0 + h10*v0 + h01*p1 + h11*v1 +} + +module.exports = cubicHermite +module.exports.derivative = dcubicHermite + +/***/ }), + +/***/ "./node_modules/dat.gui/build/dat.gui.module.js": +/*!******************************************************!*\ + !*** ./node_modules/dat.gui/build/dat.gui.module.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "color": () => (/* binding */ color), +/* harmony export */ "controllers": () => (/* binding */ controllers), +/* harmony export */ "dom": () => (/* binding */ dom$1), +/* harmony export */ "gui": () => (/* binding */ gui), +/* harmony export */ "GUI": () => (/* binding */ GUI$1), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +function ___$insertStyle(css) { + if (!css) { + return; + } + if (typeof window === 'undefined') { + return; + } + + var style = document.createElement('style'); + + style.setAttribute('type', 'text/css'); + style.innerHTML = css; + document.head.appendChild(style); + + return css; +} + +function colorToString (color, forceCSSHex) { + var colorFormat = color.__state.conversionName.toString(); + var r = Math.round(color.r); + var g = Math.round(color.g); + var b = Math.round(color.b); + var a = color.a; + var h = Math.round(color.h); + var s = color.s.toFixed(1); + var v = color.v.toFixed(1); + if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { + var str = color.hex.toString(16); + while (str.length < 6) { + str = '0' + str; + } + return '#' + str; + } else if (colorFormat === 'CSS_RGB') { + return 'rgb(' + r + ',' + g + ',' + b + ')'; + } else if (colorFormat === 'CSS_RGBA') { + return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + } else if (colorFormat === 'HEX') { + return '0x' + color.hex.toString(16); + } else if (colorFormat === 'RGB_ARRAY') { + return '[' + r + ',' + g + ',' + b + ']'; + } else if (colorFormat === 'RGBA_ARRAY') { + return '[' + r + ',' + g + ',' + b + ',' + a + ']'; + } else if (colorFormat === 'RGB_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + '}'; + } else if (colorFormat === 'RGBA_OBJ') { + return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; + } else if (colorFormat === 'HSV_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + '}'; + } else if (colorFormat === 'HSVA_OBJ') { + return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; + } + return 'unknown format'; +} + +var ARR_EACH = Array.prototype.forEach; +var ARR_SLICE = Array.prototype.slice; +var Common = { + BREAK: {}, + extend: function extend(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (!this.isUndefined(obj[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + defaults: function defaults(target) { + this.each(ARR_SLICE.call(arguments, 1), function (obj) { + var keys = this.isObject(obj) ? Object.keys(obj) : []; + keys.forEach(function (key) { + if (this.isUndefined(target[key])) { + target[key] = obj[key]; + } + }.bind(this)); + }, this); + return target; + }, + compose: function compose() { + var toCall = ARR_SLICE.call(arguments); + return function () { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length - 1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + }; + }, + each: function each(obj, itr, scope) { + if (!obj) { + return; + } + if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { + obj.forEach(itr, scope); + } else if (obj.length === obj.length + 0) { + var key = void 0; + var l = void 0; + for (key = 0, l = obj.length; key < l; key++) { + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { + return; + } + } + } else { + for (var _key in obj) { + if (itr.call(scope, obj[_key], _key) === this.BREAK) { + return; + } + } + } + }, + defer: function defer(fnc) { + setTimeout(fnc, 0); + }, + debounce: function debounce(func, threshold, callImmediately) { + var timeout = void 0; + return function () { + var obj = this; + var args = arguments; + function delayed() { + timeout = null; + if (!callImmediately) func.apply(obj, args); + } + var callNow = callImmediately || !timeout; + clearTimeout(timeout); + timeout = setTimeout(delayed, threshold); + if (callNow) { + func.apply(obj, args); + } + }; + }, + toArray: function toArray(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + isUndefined: function isUndefined(obj) { + return obj === undefined; + }, + isNull: function isNull(obj) { + return obj === null; + }, + isNaN: function (_isNaN) { + function isNaN(_x) { + return _isNaN.apply(this, arguments); + } + isNaN.toString = function () { + return _isNaN.toString(); + }; + return isNaN; + }(function (obj) { + return isNaN(obj); + }), + isArray: Array.isArray || function (obj) { + return obj.constructor === Array; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + isNumber: function isNumber(obj) { + return obj === obj + 0; + }, + isString: function isString(obj) { + return obj === obj + ''; + }, + isBoolean: function isBoolean(obj) { + return obj === false || obj === true; + }, + isFunction: function isFunction(obj) { + return obj instanceof Function; + } +}; + +var INTERPRETATIONS = [ +{ + litmus: Common.isString, + conversions: { + THREE_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) + }; + }, + write: colorToString + }, + SIX_CHAR_HEX: { + read: function read(original) { + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) { + return false; + } + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString(), 0) + }; + }, + write: colorToString + }, + CSS_RGB: { + read: function read(original) { + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + }, + write: colorToString + }, + CSS_RGBA: { + read: function read(original) { + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) { + return false; + } + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + }, + write: colorToString + } + } +}, +{ + litmus: Common.isNumber, + conversions: { + HEX: { + read: function read(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + }; + }, + write: function write(color) { + return color.hex; + } + } + } +}, +{ + litmus: Common.isArray, + conversions: { + RGB_ARRAY: { + read: function read(original) { + if (original.length !== 3) { + return false; + } + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b]; + } + }, + RGBA_ARRAY: { + read: function read(original) { + if (original.length !== 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + write: function write(color) { + return [color.r, color.g, color.b, color.a]; + } + } + } +}, +{ + litmus: Common.isObject, + conversions: { + RGBA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + }; + } + }, + RGB_OBJ: { + read: function read(original) { + if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + }; + } + return false; + }, + write: function write(color) { + return { + r: color.r, + g: color.g, + b: color.b + }; + } + }, + HSVA_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + }; + } + }, + HSV_OBJ: { + read: function read(original) { + if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + }; + } + return false; + }, + write: function write(color) { + return { + h: color.h, + s: color.s, + v: color.v + }; + } + } + } +}]; +var result = void 0; +var toReturn = void 0; +var interpret = function interpret() { + toReturn = false; + var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; + Common.each(INTERPRETATIONS, function (family) { + if (family.litmus(original)) { + Common.each(family.conversions, function (conversion, conversionName) { + result = conversion.read(original); + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return Common.BREAK; + } + }); + return Common.BREAK; + } + }); + return toReturn; +}; + +var tmpComponent = void 0; +var ColorMath = { + hsv_to_rgb: function hsv_to_rgb(h, s, v) { + var hi = Math.floor(h / 60) % 6; + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - f * s); + var t = v * (1.0 - (1.0 - f) * s); + var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + }, + rgb_to_hsv: function rgb_to_hsv(r, g, b) { + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h = void 0; + var s = void 0; + if (max !== 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + rgb_to_hex: function rgb_to_hex(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + component_from_hex: function component_from_hex(hex, componentIndex) { + return hex >> componentIndex * 8 & 0xFF; + }, + hex_with_component: function hex_with_component(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); + } +}; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + + + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var Color = function () { + function Color() { + classCallCheck(this, Color); + this.__state = interpret.apply(this, arguments); + if (this.__state === false) { + throw new Error('Failed to interpret color arguments'); + } + this.__state.a = this.__state.a || 1; + } + createClass(Color, [{ + key: 'toString', + value: function toString() { + return colorToString(this); + } + }, { + key: 'toHexString', + value: function toHexString() { + return colorToString(this, true); + } + }, { + key: 'toOriginal', + value: function toOriginal() { + return this.__state.conversion.write(this); + } + }]); + return Color; +}(); +function defineRGBComponent(target, component, componentHexIndex) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + Color.recalculateRGB(this, component, componentHexIndex); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'RGB') { + Color.recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + this.__state[component] = v; + } + }); +} +function defineHSVComponent(target, component) { + Object.defineProperty(target, component, { + get: function get$$1() { + if (this.__state.space === 'HSV') { + return this.__state[component]; + } + Color.recalculateHSV(this); + return this.__state[component]; + }, + set: function set$$1(v) { + if (this.__state.space !== 'HSV') { + Color.recalculateHSV(this); + this.__state.space = 'HSV'; + } + this.__state[component] = v; + } + }); +} +Color.recalculateRGB = function (color, component, componentHexIndex) { + if (color.__state.space === 'HEX') { + color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); + } else if (color.__state.space === 'HSV') { + Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + } else { + throw new Error('Corrupted color state'); + } +}; +Color.recalculateHSV = function (color) { + var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); + Common.extend(color.__state, { + s: result.s, + v: result.v + }); + if (!Common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (Common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } +}; +Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; +defineRGBComponent(Color.prototype, 'r', 2); +defineRGBComponent(Color.prototype, 'g', 1); +defineRGBComponent(Color.prototype, 'b', 0); +defineHSVComponent(Color.prototype, 'h'); +defineHSVComponent(Color.prototype, 's'); +defineHSVComponent(Color.prototype, 'v'); +Object.defineProperty(Color.prototype, 'a', { + get: function get$$1() { + return this.__state.a; + }, + set: function set$$1(v) { + this.__state.a = v; + } +}); +Object.defineProperty(Color.prototype, 'hex', { + get: function get$$1() { + if (this.__state.space !== 'HEX') { + this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); + this.__state.space = 'HEX'; + } + return this.__state.hex; + }, + set: function set$$1(v) { + this.__state.space = 'HEX'; + this.__state.hex = v; + } +}); + +var Controller = function () { + function Controller(object, property) { + classCallCheck(this, Controller); + this.initialValue = object[property]; + this.domElement = document.createElement('div'); + this.object = object; + this.property = property; + this.__onChange = undefined; + this.__onFinishChange = undefined; + } + createClass(Controller, [{ + key: 'onChange', + value: function onChange(fnc) { + this.__onChange = fnc; + return this; + } + }, { + key: 'onFinishChange', + value: function onFinishChange(fnc) { + this.__onFinishChange = fnc; + return this; + } + }, { + key: 'setValue', + value: function setValue(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + } + }, { + key: 'getValue', + value: function getValue() { + return this.object[this.property]; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + return this; + } + }, { + key: 'isModified', + value: function isModified() { + return this.initialValue !== this.getValue(); + } + }]); + return Controller; +}(); + +var EVENT_MAP = { + HTMLEvents: ['change'], + MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], + KeyboardEvents: ['keydown'] +}; +var EVENT_MAP_INV = {}; +Common.each(EVENT_MAP, function (v, k) { + Common.each(v, function (e) { + EVENT_MAP_INV[e] = k; + }); +}); +var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; +function cssValueToPixels(val) { + if (val === '0' || Common.isUndefined(val)) { + return 0; + } + var match = val.match(CSS_VALUE_PIXELS); + if (!Common.isNull(match)) { + return parseFloat(match[1]); + } + return 0; +} +var dom = { + makeSelectable: function makeSelectable(elem, selectable) { + if (elem === undefined || elem.style === undefined) return; + elem.onselectstart = selectable ? function () { + return false; + } : function () {}; + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + }, + makeFullscreen: function makeFullscreen(elem, hor, vert) { + var vertical = vert; + var horizontal = hor; + if (Common.isUndefined(horizontal)) { + horizontal = true; + } + if (Common.isUndefined(vertical)) { + vertical = true; + } + elem.style.position = 'absolute'; + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + }, + fakeEvent: function fakeEvent(elem, eventType, pars, aux) { + var params = pars || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + { + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, + 0, + clientX, + clientY, + false, false, false, false, 0, null); + break; + } + case 'KeyboardEvents': + { + var init = evt.initKeyboardEvent || evt.initKeyEvent; + Common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); + break; + } + default: + { + evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); + break; + } + } + Common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + bind: function bind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.addEventListener) { + elem.addEventListener(event, func, bool); + } else if (elem.attachEvent) { + elem.attachEvent('on' + event, func); + } + return dom; + }, + unbind: function unbind(elem, event, func, newBool) { + var bool = newBool || false; + if (elem.removeEventListener) { + elem.removeEventListener(event, func, bool); + } else if (elem.detachEvent) { + elem.detachEvent('on' + event, func); + } + return dom; + }, + addClass: function addClass(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) === -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + removeClass: function removeClass(elem, className) { + if (className) { + if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index !== -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + hasClass: function hasClass(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + getWidth: function getWidth(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); + }, + getHeight: function getHeight(elem) { + var style = getComputedStyle(elem); + return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); + }, + getOffset: function getOffset(el) { + var elem = el; + var offset = { left: 0, top: 0 }; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + elem = elem.offsetParent; + } while (elem); + } + return offset; + }, + isActive: function isActive(elem) { + return elem === document.activeElement && (elem.type || elem.href); + } +}; + +var BooleanController = function (_Controller) { + inherits(BooleanController, _Controller); + function BooleanController(object, property) { + classCallCheck(this, BooleanController); + var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); + var _this = _this2; + _this2.__prev = _this2.getValue(); + _this2.__checkbox = document.createElement('input'); + _this2.__checkbox.setAttribute('type', 'checkbox'); + function onChange() { + _this.setValue(!_this.__prev); + } + dom.bind(_this2.__checkbox, 'change', onChange, false); + _this2.domElement.appendChild(_this2.__checkbox); + _this2.updateDisplay(); + return _this2; + } + createClass(BooleanController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + this.__prev = true; + } else { + this.__checkbox.checked = false; + this.__prev = false; + } + return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); + } + }]); + return BooleanController; +}(Controller); + +var OptionController = function (_Controller) { + inherits(OptionController, _Controller); + function OptionController(object, property, opts) { + classCallCheck(this, OptionController); + var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); + var options = opts; + var _this = _this2; + _this2.__select = document.createElement('select'); + if (Common.isArray(options)) { + var map = {}; + Common.each(options, function (element) { + map[element] = element; + }); + options = map; + } + Common.each(options, function (value, key) { + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + }); + _this2.updateDisplay(); + dom.bind(_this2.__select, 'change', function () { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + _this2.domElement.appendChild(_this2.__select); + return _this2; + } + createClass(OptionController, [{ + key: 'setValue', + value: function setValue(v) { + var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + } + }, { + key: 'updateDisplay', + value: function updateDisplay() { + if (dom.isActive(this.__select)) return this; + this.__select.value = this.getValue(); + return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); + } + }]); + return OptionController; +}(Controller); + +var StringController = function (_Controller) { + inherits(StringController, _Controller); + function StringController(object, property) { + classCallCheck(this, StringController); + var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); + var _this = _this2; + function onChange() { + _this.setValue(_this.__input.value); + } + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'keyup', onChange); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(StringController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); + } + }]); + return StringController; +}(Controller); + +function numDecimals(x) { + var _x = x.toString(); + if (_x.indexOf('.') > -1) { + return _x.length - _x.indexOf('.') - 1; + } + return 0; +} +var NumberController = function (_Controller) { + inherits(NumberController, _Controller); + function NumberController(object, property, params) { + classCallCheck(this, NumberController); + var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); + var _params = params || {}; + _this.__min = _params.min; + _this.__max = _params.max; + _this.__step = _params.step; + if (Common.isUndefined(_this.__step)) { + if (_this.initialValue === 0) { + _this.__impliedStep = 1; + } else { + _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; + } + } else { + _this.__impliedStep = _this.__step; + } + _this.__precision = numDecimals(_this.__impliedStep); + return _this; + } + createClass(NumberController, [{ + key: 'setValue', + value: function setValue(v) { + var _v = v; + if (this.__min !== undefined && _v < this.__min) { + _v = this.__min; + } else if (this.__max !== undefined && _v > this.__max) { + _v = this.__max; + } + if (this.__step !== undefined && _v % this.__step !== 0) { + _v = Math.round(_v / this.__step) * this.__step; + } + return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); + } + }, { + key: 'min', + value: function min(minValue) { + this.__min = minValue; + return this; + } + }, { + key: 'max', + value: function max(maxValue) { + this.__max = maxValue; + return this; + } + }, { + key: 'step', + value: function step(stepValue) { + this.__step = stepValue; + this.__impliedStep = stepValue; + this.__precision = numDecimals(stepValue); + return this; + } + }]); + return NumberController; +}(Controller); + +function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; +} +var NumberControllerBox = function (_NumberController) { + inherits(NumberControllerBox, _NumberController); + function NumberControllerBox(object, property, params) { + classCallCheck(this, NumberControllerBox); + var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); + _this2.__truncationSuspended = false; + var _this = _this2; + var prevY = void 0; + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!Common.isNaN(attempted)) { + _this.setValue(attempted); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onBlur() { + onFinish(); + } + function onMouseDrag(e) { + var diff = prevY - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + prevY = e.clientY; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + onFinish(); + } + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prevY = e.clientY; + } + _this2.__input = document.createElement('input'); + _this2.__input.setAttribute('type', 'text'); + dom.bind(_this2.__input, 'change', onChange); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__input, 'mousedown', onMouseDown); + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + onFinish(); + } + }); + _this2.updateDisplay(); + _this2.domElement.appendChild(_this2.__input); + return _this2; + } + createClass(NumberControllerBox, [{ + key: 'updateDisplay', + value: function updateDisplay() { + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerBox; +}(NumberController); + +function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); +} +var NumberControllerSlider = function (_NumberController) { + inherits(NumberControllerSlider, _NumberController); + function NumberControllerSlider(object, property, min, max, step) { + classCallCheck(this, NumberControllerSlider); + var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); + var _this = _this2; + _this2.__background = document.createElement('div'); + _this2.__foreground = document.createElement('div'); + dom.bind(_this2.__background, 'mousedown', onMouseDown); + dom.bind(_this2.__background, 'touchstart', onTouchStart); + dom.addClass(_this2.__background, 'slider'); + dom.addClass(_this2.__foreground, 'slider-fg'); + function onMouseDown(e) { + document.activeElement.blur(); + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + onMouseDrag(e); + } + function onMouseDrag(e) { + e.preventDefault(); + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + return false; + } + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + function onTouchStart(e) { + if (e.touches.length !== 1) { + return; + } + dom.bind(window, 'touchmove', onTouchMove); + dom.bind(window, 'touchend', onTouchEnd); + onTouchMove(e); + } + function onTouchMove(e) { + var clientX = e.touches[0].clientX; + var bgRect = _this.__background.getBoundingClientRect(); + _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); + } + function onTouchEnd() { + dom.unbind(window, 'touchmove', onTouchMove); + dom.unbind(window, 'touchend', onTouchEnd); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + _this2.updateDisplay(); + _this2.__background.appendChild(_this2.__foreground); + _this2.domElement.appendChild(_this2.__background); + return _this2; + } + createClass(NumberControllerSlider, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var pct = (this.getValue() - this.__min) / (this.__max - this.__min); + this.__foreground.style.width = pct * 100 + '%'; + return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); + } + }]); + return NumberControllerSlider; +}(NumberController); + +var FunctionController = function (_Controller) { + inherits(FunctionController, _Controller); + function FunctionController(object, property, text) { + classCallCheck(this, FunctionController); + var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); + var _this = _this2; + _this2.__button = document.createElement('div'); + _this2.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(_this2.__button, 'click', function (e) { + e.preventDefault(); + _this.fire(); + return false; + }); + dom.addClass(_this2.__button, 'button'); + _this2.domElement.appendChild(_this2.__button); + return _this2; + } + createClass(FunctionController, [{ + key: 'fire', + value: function fire() { + if (this.__onChange) { + this.__onChange.call(this); + } + this.getValue().call(this.object); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + } + }]); + return FunctionController; +}(Controller); + +var ColorController = function (_Controller) { + inherits(ColorController, _Controller); + function ColorController(object, property) { + classCallCheck(this, ColorController); + var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); + _this2.__color = new Color(_this2.getValue()); + _this2.__temp = new Color(0); + var _this = _this2; + _this2.domElement = document.createElement('div'); + dom.makeSelectable(_this2.domElement, false); + _this2.__selector = document.createElement('div'); + _this2.__selector.className = 'selector'; + _this2.__saturation_field = document.createElement('div'); + _this2.__saturation_field.className = 'saturation-field'; + _this2.__field_knob = document.createElement('div'); + _this2.__field_knob.className = 'field-knob'; + _this2.__field_knob_border = '2px solid '; + _this2.__hue_knob = document.createElement('div'); + _this2.__hue_knob.className = 'hue-knob'; + _this2.__hue_field = document.createElement('div'); + _this2.__hue_field.className = 'hue-field'; + _this2.__input = document.createElement('input'); + _this2.__input.type = 'text'; + _this2.__input_textShadow = '0 1px 1px '; + dom.bind(_this2.__input, 'keydown', function (e) { + if (e.keyCode === 13) { + onBlur.call(this); + } + }); + dom.bind(_this2.__input, 'blur', onBlur); + dom.bind(_this2.__selector, 'mousedown', function () { + dom.addClass(this, 'drag').bind(window, 'mouseup', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + dom.bind(_this2.__selector, 'touchstart', function () { + dom.addClass(this, 'drag').bind(window, 'touchend', function () { + dom.removeClass(_this.__selector, 'drag'); + }); + }); + var valueField = document.createElement('div'); + Common.extend(_this2.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + Common.extend(_this2.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + Common.extend(_this2.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + Common.extend(_this2.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + Common.extend(valueField.style, { + width: '100%', + height: '100%', + background: 'none' + }); + linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); + Common.extend(_this2.__hue_field.style, { + width: '15px', + height: '100px', + border: '1px solid #555', + cursor: 'ns-resize', + position: 'absolute', + top: '3px', + right: '3px' + }); + hueGradient(_this2.__hue_field); + Common.extend(_this2.__input.style, { + outline: 'none', + textAlign: 'center', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); + dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); + dom.bind(_this2.__field_knob, 'mousedown', fieldDown); + dom.bind(_this2.__field_knob, 'touchstart', fieldDown); + dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); + dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); + function fieldDown(e) { + setSV(e); + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'touchmove', setSV); + dom.bind(window, 'mouseup', fieldUpSV); + dom.bind(window, 'touchend', fieldUpSV); + } + function fieldDownH(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'touchmove', setH); + dom.bind(window, 'mouseup', fieldUpH); + dom.bind(window, 'touchend', fieldUpH); + } + function fieldUpSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'touchmove', setSV); + dom.unbind(window, 'mouseup', fieldUpSV); + dom.unbind(window, 'touchend', fieldUpSV); + onFinish(); + } + function fieldUpH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'touchmove', setH); + dom.unbind(window, 'mouseup', fieldUpH); + dom.unbind(window, 'touchend', fieldUpH); + onFinish(); + } + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + function onFinish() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.__color.toOriginal()); + } + } + _this2.__saturation_field.appendChild(valueField); + _this2.__selector.appendChild(_this2.__field_knob); + _this2.__selector.appendChild(_this2.__saturation_field); + _this2.__selector.appendChild(_this2.__hue_field); + _this2.__hue_field.appendChild(_this2.__hue_knob); + _this2.domElement.appendChild(_this2.__input); + _this2.domElement.appendChild(_this2.__selector); + _this2.updateDisplay(); + function setSV(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__saturation_field.getBoundingClientRect(); + var _ref = e.touches && e.touches[0] || e, + clientX = _ref.clientX, + clientY = _ref.clientY; + var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); + var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (v > 1) { + v = 1; + } else if (v < 0) { + v = 0; + } + if (s > 1) { + s = 1; + } else if (s < 0) { + s = 0; + } + _this.__color.v = v; + _this.__color.s = s; + _this.setValue(_this.__color.toOriginal()); + return false; + } + function setH(e) { + if (e.type.indexOf('touch') === -1) { + e.preventDefault(); + } + var fieldRect = _this.__hue_field.getBoundingClientRect(); + var _ref2 = e.touches && e.touches[0] || e, + clientY = _ref2.clientY; + var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); + if (h > 1) { + h = 1; + } else if (h < 0) { + h = 0; + } + _this.__color.h = h * 360; + _this.setValue(_this.__color.toOriginal()); + return false; + } + return _this2; + } + createClass(ColorController, [{ + key: 'updateDisplay', + value: function updateDisplay() { + var i = interpret(this.getValue()); + if (i !== false) { + var mismatch = false; + Common.each(Color.COMPONENTS, function (component) { + if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; + } + }, this); + if (mismatch) { + Common.extend(this.__color.__state, i); + } + } + Common.extend(this.__temp.__state, this.__color.__state); + this.__temp.a = 1; + var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; + var _flip = 255 - flip; + Common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toHexString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' + }); + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; + this.__temp.s = 1; + this.__temp.v = 1; + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); + this.__input.value = this.__color.toString(); + Common.extend(this.__input.style, { + backgroundColor: this.__color.toHexString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' + }); + } + }]); + return ColorController; +}(Controller); +var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; +function linearGradient(elem, x, a, b) { + elem.style.background = ''; + Common.each(vendors, function (vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; + }); +} +function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; +} + +var css = { + load: function load(url, indoc) { + var doc = indoc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function inject(cssContent, indoc) { + var doc = indoc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = cssContent; + var head = doc.getElementsByTagName('head')[0]; + try { + head.appendChild(injected); + } catch (e) { + } + } +}; + +var saveDialogContents = "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
"; + +var ControllerFactory = function ControllerFactory(object, property) { + var initialValue = object[property]; + if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + if (Common.isNumber(initialValue)) { + if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { + if (Common.isNumber(arguments[4])) { + return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); + } + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + } + if (Common.isNumber(arguments[4])) { + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); + } + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + } + if (Common.isString(initialValue)) { + return new StringController(object, property); + } + if (Common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + if (Common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + return null; +}; + +function requestAnimationFrame(callback) { + setTimeout(callback, 1000 / 60); +} +var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; + +var CenteredDiv = function () { + function CenteredDiv() { + classCallCheck(this, CenteredDiv); + this.backgroundElement = document.createElement('div'); + Common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear', + transition: 'opacity 0.2s linear' + }); + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + this.domElement = document.createElement('div'); + Common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', + transition: 'transform 0.2s ease-out, opacity 0.2s linear' + }); + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + var _this = this; + dom.bind(this.backgroundElement, 'click', function () { + _this.hide(); + }); + } + createClass(CenteredDiv, [{ + key: 'show', + value: function show() { + var _this = this; + this.backgroundElement.style.display = 'block'; + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + this.layout(); + Common.defer(function () { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + } + }, { + key: 'hide', + value: function hide() { + var _this = this; + var hide = function hide() { + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + }; + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + this.backgroundElement.style.opacity = 0; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + } + }, { + key: 'layout', + value: function layout() { + this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; + } + }]); + return CenteredDiv; +}(); + +var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); + +css.inject(styleSheet); +var CSS_NAMESPACE = 'dg'; +var HIDE_KEY_CODE = 72; +var CLOSE_BUTTON_HEIGHT = 20; +var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; +var SUPPORTS_LOCAL_STORAGE = function () { + try { + return !!window.localStorage; + } catch (e) { + return false; + } +}(); +var SAVE_DIALOGUE = void 0; +var autoPlaceVirgin = true; +var autoPlaceContainer = void 0; +var hide = false; +var hideableGuis = []; +var GUI = function GUI(pars) { + var _this = this; + var params = pars || {}; + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + dom.addClass(this.domElement, CSS_NAMESPACE); + this.__folders = {}; + this.__controllers = []; + this.__rememberedObjects = []; + this.__rememberedObjectIndecesToControllers = []; + this.__listening = []; + params = Common.defaults(params, { + closeOnTop: false, + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + params = Common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + if (!Common.isUndefined(params.load)) { + if (params.preset) { + params.load.preset = params.preset; + } + } else { + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + } + if (Common.isUndefined(params.parent) && params.hideable) { + hideableGuis.push(this); + } + params.resizable = Common.isUndefined(params.parent) && params.resizable; + if (params.autoPlace && Common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + var saveToLocalStorage = void 0; + var titleRow = void 0; + Object.defineProperties(this, + { + parent: { + get: function get$$1() { + return params.parent; + } + }, + scrollable: { + get: function get$$1() { + return params.scrollable; + } + }, + autoPlace: { + get: function get$$1() { + return params.autoPlace; + } + }, + closeOnTop: { + get: function get$$1() { + return params.closeOnTop; + } + }, + preset: { + get: function get$$1() { + if (_this.parent) { + return _this.getRoot().preset; + } + return params.load.preset; + }, + set: function set$$1(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + }, + width: { + get: function get$$1() { + return params.width; + }, + set: function set$$1(v) { + params.width = v; + setWidth(_this, v); + } + }, + name: { + get: function get$$1() { + return params.name; + }, + set: function set$$1(v) { + params.name = v; + if (titleRow) { + titleRow.innerHTML = params.name; + } + } + }, + closed: { + get: function get$$1() { + return params.closed; + }, + set: function set$$1(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + this.onResize(); + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + load: { + get: function get$$1() { + return params.load; + } + }, + useLocalStorage: { + get: function get$$1() { + return useLocalStorage; + }, + set: function set$$1(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + useLocalStorage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + } + }); + if (Common.isUndefined(params.parent)) { + this.closed = params.closed || false; + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + if (SUPPORTS_LOCAL_STORAGE) { + if (useLocalStorage) { + _this.useLocalStorage = true; + var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + if (savedGui) { + params.load = JSON.parse(savedGui); + } + } + } + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + if (params.closeOnTop) { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); + this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); + } else { + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); + this.domElement.appendChild(this.__closeButton); + } + dom.bind(this.__closeButton, 'click', function () { + _this.closed = !_this.closed; + }); + } else { + if (params.closed === undefined) { + params.closed = true; + } + var titleRowName = document.createTextNode(params.name); + dom.addClass(titleRowName, 'controller-name'); + titleRow = addRow(_this, titleRowName); + var onClickTitle = function onClickTitle(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + dom.addClass(titleRow, 'title'); + dom.bind(titleRow, 'click', onClickTitle); + if (!params.closed) { + this.closed = false; + } + } + if (params.autoPlace) { + if (Common.isUndefined(params.parent)) { + if (autoPlaceVirgin) { + autoPlaceContainer = document.createElement('div'); + dom.addClass(autoPlaceContainer, CSS_NAMESPACE); + dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(autoPlaceContainer); + autoPlaceVirgin = false; + } + autoPlaceContainer.appendChild(this.domElement); + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + } + if (!this.parent) { + setWidth(_this, params.width); + } + } + this.__resizeHandler = function () { + _this.onResizeDebounced(); + }; + dom.bind(window, 'resize', this.__resizeHandler); + dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); + dom.bind(this.__ul, 'transitionend', this.__resizeHandler); + dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); + this.onResize(); + if (params.resizable) { + addResizeHandle(this); + } + saveToLocalStorage = function saveToLocalStorage() { + if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + }; + this.saveToLocalStorageIfPossible = saveToLocalStorage; + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + Common.defer(function () { + root.width -= 1; + }); + } + if (!params.parent) { + resetWidth(); + } +}; +GUI.toggleHide = function () { + hide = !hide; + Common.each(hideableGuis, function (gui) { + gui.domElement.style.display = hide ? 'none' : ''; + }); +}; +GUI.CLASS_AUTO_PLACE = 'a'; +GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; +GUI.CLASS_MAIN = 'main'; +GUI.CLASS_CONTROLLER_ROW = 'cr'; +GUI.CLASS_TOO_TALL = 'taller-than-window'; +GUI.CLASS_CLOSED = 'closed'; +GUI.CLASS_CLOSE_BUTTON = 'close-button'; +GUI.CLASS_CLOSE_TOP = 'close-top'; +GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; +GUI.CLASS_DRAG = 'drag'; +GUI.DEFAULT_WIDTH = 245; +GUI.TEXT_CLOSED = 'Close Controls'; +GUI.TEXT_OPEN = 'Open Controls'; +GUI._keydownHandler = function (e) { + if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { + GUI.toggleHide(); + } +}; +dom.bind(window, 'keydown', GUI._keydownHandler, false); +Common.extend(GUI.prototype, +{ + add: function add(object, property) { + return _add(this, object, property, { + factoryArgs: Array.prototype.slice.call(arguments, 2) + }); + }, + addColor: function addColor(object, property) { + return _add(this, object, property, { + color: true + }); + }, + remove: function remove(controller) { + this.__ul.removeChild(controller.__li); + this.__controllers.splice(this.__controllers.indexOf(controller), 1); + var _this = this; + Common.defer(function () { + _this.onResize(); + }); + }, + destroy: function destroy() { + if (this.parent) { + throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); + } + if (this.autoPlace) { + autoPlaceContainer.removeChild(this.domElement); + } + var _this = this; + Common.each(this.__folders, function (subfolder) { + _this.removeFolder(subfolder); + }); + dom.unbind(window, 'keydown', GUI._keydownHandler, false); + removeListeners(this); + }, + addFolder: function addFolder(name) { + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); + } + var newGuiParams = { name: name, parent: this }; + newGuiParams.autoPlace = this.autoPlace; + if (this.load && + this.load.folders && + this.load.folders[name]) { + newGuiParams.closed = this.load.folders[name].closed; + newGuiParams.load = this.load.folders[name]; + } + var gui = new GUI(newGuiParams); + this.__folders[name] = gui; + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + }, + removeFolder: function removeFolder(folder) { + this.__ul.removeChild(folder.domElement.parentElement); + delete this.__folders[folder.name]; + if (this.load && + this.load.folders && + this.load.folders[folder.name]) { + delete this.load.folders[folder.name]; + } + removeListeners(folder); + var _this = this; + Common.each(folder.__folders, function (subfolder) { + folder.removeFolder(subfolder); + }); + Common.defer(function () { + _this.onResize(); + }); + }, + open: function open() { + this.closed = false; + }, + close: function close() { + this.closed = true; + }, + hide: function hide() { + this.domElement.style.display = 'none'; + }, + show: function show() { + this.domElement.style.display = ''; + }, + onResize: function onResize() { + var root = this.getRoot(); + if (root.scrollable) { + var top = dom.getOffset(root.__ul).top; + var h = 0; + Common.each(root.__ul.childNodes, function (node) { + if (!(root.autoPlace && node === root.__save_row)) { + h += dom.getHeight(node); + } + }); + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + } + if (root.__resize_handle) { + Common.defer(function () { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + }, + onResizeDebounced: Common.debounce(function () { + this.onResize(); + }, 50), + remember: function remember() { + if (Common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; + } + if (this.parent) { + throw new Error('You can only call remember on a top level GUI.'); + } + var _this = this; + Common.each(Array.prototype.slice.call(arguments), function (object) { + if (_this.__rememberedObjects.length === 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) === -1) { + _this.__rememberedObjects.push(object); + } + }); + if (this.autoPlace) { + setWidth(this, this.width); + } + }, + getRoot: function getRoot() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + getSaveObject: function getSaveObject() { + var toReturn = this.load; + toReturn.closed = this.closed; + if (this.__rememberedObjects.length > 0) { + toReturn.preset = this.preset; + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + toReturn.remembered[this.preset] = getCurrentPreset(this); + } + toReturn.folders = {}; + Common.each(this.__folders, function (element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + return toReturn; + }, + save: function save() { + if (!this.load.remembered) { + this.load.remembered = {}; + } + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + this.saveToLocalStorageIfPossible(); + }, + saveAs: function saveAs(presetName) { + if (!this.load.remembered) { + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + } + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + this.saveToLocalStorageIfPossible(); + }, + revert: function revert(gui) { + Common.each(this.__controllers, function (controller) { + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + if (controller.__onFinishChange) { + controller.__onFinishChange.call(controller, controller.getValue()); + } + }, this); + Common.each(this.__folders, function (folder) { + folder.revert(folder); + }); + if (!gui) { + markPresetModified(this.getRoot(), false); + } + }, + listen: function listen(controller) { + var init = this.__listening.length === 0; + this.__listening.push(controller); + if (init) { + updateDisplays(this.__listening); + } + }, + updateDisplay: function updateDisplay() { + Common.each(this.__controllers, function (controller) { + controller.updateDisplay(); + }); + Common.each(this.__folders, function (folder) { + folder.updateDisplay(); + }); + } +}); +function addRow(gui, newDom, liBefore) { + var li = document.createElement('li'); + if (newDom) { + li.appendChild(newDom); + } + if (liBefore) { + gui.__ul.insertBefore(li, liBefore); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; +} +function removeListeners(gui) { + dom.unbind(window, 'resize', gui.__resizeHandler); + if (gui.saveToLocalStorageIfPossible) { + dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); + } +} +function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + if (modified) { + opt.innerHTML = opt.value + '*'; + } else { + opt.innerHTML = opt.value; + } +} +function augmentController(gui, li, controller) { + controller.__li = li; + controller.__gui = gui; + Common.extend(controller, { + options: function options(_options) { + if (arguments.length > 1) { + var nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: nextSibling, + factoryArgs: [Common.toArray(arguments)] + }); + } + if (Common.isArray(_options) || Common.isObject(_options)) { + var _nextSibling = controller.__li.nextElementSibling; + controller.remove(); + return _add(gui, controller.object, controller.property, { + before: _nextSibling, + factoryArgs: [_options] + }); + } + }, + name: function name(_name) { + controller.__li.firstElementChild.firstElementChild.innerHTML = _name; + return controller; + }, + listen: function listen() { + controller.__gui.listen(controller); + return controller; + }, + remove: function remove() { + controller.__gui.remove(controller); + return controller; + } + }); + if (controller instanceof NumberControllerSlider) { + var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); + Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function () { + var args = Array.prototype.slice.call(arguments); + pb.apply(box, args); + return pc.apply(controller, args); + }; + }); + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + } else if (controller instanceof NumberControllerBox) { + var r = function r(returned) { + if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { + var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; + var wasListening = controller.__gui.__listening.indexOf(controller) > -1; + controller.remove(); + var newController = _add(gui, controller.object, controller.property, { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + newController.name(oldName); + if (wasListening) newController.listen(); + return newController; + } + return returned; + }; + controller.min = Common.compose(r, controller.min); + controller.max = Common.compose(r, controller.max); + } else if (controller instanceof BooleanController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + dom.bind(controller.__checkbox, 'click', function (e) { + e.stopPropagation(); + }); + } else if (controller instanceof FunctionController) { + dom.bind(li, 'click', function () { + dom.fakeEvent(controller.__button, 'click'); + }); + dom.bind(li, 'mouseover', function () { + dom.addClass(controller.__button, 'hover'); + }); + dom.bind(li, 'mouseout', function () { + dom.removeClass(controller.__button, 'hover'); + }); + } else if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + controller.updateDisplay = Common.compose(function (val) { + li.style.borderLeftColor = controller.__color.toString(); + return val; + }, controller.updateDisplay); + controller.updateDisplay(); + } + controller.setValue = Common.compose(function (val) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return val; + }, controller.setValue); +} +function recallSavedValue(gui, controller) { + var root = gui.getRoot(); + var matchedIndex = root.__rememberedObjects.indexOf(controller.object); + if (matchedIndex !== -1) { + var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; + if (controllerMap === undefined) { + controllerMap = {}; + root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; + } + controllerMap[controller.property] = controller; + if (root.load && root.load.remembered) { + var presetMap = root.load.remembered; + var preset = void 0; + if (presetMap[gui.preset]) { + preset = presetMap[gui.preset]; + } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { + preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; + } else { + return; + } + if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { + var value = preset[matchedIndex][controller.property]; + controller.initialValue = value; + controller.setValue(value); + } + } + } +} +function _add(gui, object, property, params) { + if (object[property] === undefined) { + throw new Error('Object "' + object + '" has no property "' + property + '"'); + } + var controller = void 0; + if (params.color) { + controller = new ColorController(object, property); + } else { + var factoryArgs = [object, property].concat(params.factoryArgs); + controller = ControllerFactory.apply(gui, factoryArgs); + } + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + recallSavedValue(gui, controller); + dom.addClass(controller.domElement, 'c'); + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + var li = addRow(gui, container, params.before); + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + if (controller instanceof ColorController) { + dom.addClass(li, 'color'); + } else { + dom.addClass(li, _typeof(controller.getValue())); + } + augmentController(gui, li, controller); + gui.__controllers.push(controller); + return controller; +} +function getLocalStorageHash(gui, key) { + return document.location.href + '.' + key; +} +function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } +} +function showHideExplain(gui, explain) { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; +} +function addSaveMenu(gui) { + var div = gui.__save_row = document.createElement('li'); + dom.addClass(gui.domElement, 'has-save'); + gui.__ul.insertBefore(div, gui.__ul.firstChild); + dom.addClass(div, 'save-row'); + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + var select = gui.__preset_select = document.createElement('select'); + if (gui.load && gui.load.remembered) { + Common.each(gui.load.remembered, function (value, key) { + addPresetOption(gui, key, key === gui.preset); + }); + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + dom.bind(select, 'change', function () { + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + gui.preset = this.value; + }); + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + if (SUPPORTS_LOCAL_STORAGE) { + var explain = document.getElementById('dg-local-explain'); + var localStorageCheckBox = document.getElementById('dg-local-storage'); + var saveLocally = document.getElementById('dg-save-locally'); + saveLocally.style.display = 'block'; + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + showHideExplain(gui, explain); + dom.bind(localStorageCheckBox, 'change', function () { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(gui, explain); + }); + } + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + dom.bind(newConstructorTextArea, 'keydown', function (e) { + if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { + SAVE_DIALOGUE.hide(); + } + }); + dom.bind(gears, 'click', function () { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + dom.bind(button, 'click', function () { + gui.save(); + }); + dom.bind(button2, 'click', function () { + var presetName = prompt('Enter a new preset name.'); + if (presetName) { + gui.saveAs(presetName); + } + }); + dom.bind(button3, 'click', function () { + gui.revert(); + }); +} +function addResizeHandle(gui) { + var pmouseX = void 0; + gui.__resize_handle = document.createElement('div'); + Common.extend(gui.__resize_handle.style, { + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + }); + function drag(e) { + e.preventDefault(); + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + return false; + } + function dragStop() { + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + } + function dragStart(e) { + e.preventDefault(); + pmouseX = e.clientX; + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + return false; + } + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); +} +function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + } + if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } +} +function getCurrentPreset(gui, useInitialValues) { + var toReturn = {}; + Common.each(gui.__rememberedObjects, function (val, index) { + var savedValues = {}; + var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; + Common.each(controllerMap, function (controller, property) { + savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + toReturn[index] = savedValues; + }); + return toReturn; +} +function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value === gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } +} +function updateDisplays(controllerArray) { + if (controllerArray.length !== 0) { + requestAnimationFrame$1.call(window, function () { + updateDisplays(controllerArray); + }); + } + Common.each(controllerArray, function (c) { + c.updateDisplay(); + }); +} + +var color = { + Color: Color, + math: ColorMath, + interpret: interpret +}; +var controllers = { + Controller: Controller, + BooleanController: BooleanController, + OptionController: OptionController, + StringController: StringController, + NumberController: NumberController, + NumberControllerBox: NumberControllerBox, + NumberControllerSlider: NumberControllerSlider, + FunctionController: FunctionController, + ColorController: ColorController +}; +var dom$1 = { dom: dom }; +var gui = { GUI: GUI }; +var GUI$1 = GUI; +var index = { + color: color, + controllers: controllers, + dom: dom$1, + gui: gui, + GUI: GUI$1 +}; + + +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (index); +//# sourceMappingURL=dat.gui.module.js.map + + +/***/ }), + +/***/ "./node_modules/filtered-vector/fvec.js": +/*!**********************************************!*\ + !*** ./node_modules/filtered-vector/fvec.js ***! + \**********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = createFilteredVector + +var cubicHermite = __webpack_require__(/*! cubic-hermite */ "./node_modules/cubic-hermite/hermite.js") +var bsearch = __webpack_require__(/*! binary-search-bounds */ "./node_modules/binary-search-bounds/search-bounds.js") + +function clamp(lo, hi, x) { + return Math.min(hi, Math.max(lo, x)) +} + +function FilteredVector(state0, velocity0, t0) { + this.dimension = state0.length + this.bounds = [ new Array(this.dimension), new Array(this.dimension) ] + for(var i=0; i= n-1) { + var ptr = state.length-1 + var tf = t - time[n-1] + for(var i=0; i= n-1) { + var ptr = state.length-1 + var tf = t - time[n-1] + for(var i=0; i=0; --i) { + if(velocity[--ptr]) { + return false + } + } + return true +} + +proto.jump = function(t) { + var t0 = this.lastT() + var d = this.dimension + if(t < t0 || arguments.length !== d+1) { + return + } + var state = this._state + var velocity = this._velocity + var ptr = state.length-this.dimension + var bounds = this.bounds + var lo = bounds[0] + var hi = bounds[1] + this._time.push(t0, t) + for(var j=0; j<2; ++j) { + for(var i=0; i0; --i) { + state.push(clamp(lo[i-1], hi[i-1], arguments[i])) + velocity.push(0) + } +} + +proto.push = function(t) { + var t0 = this.lastT() + var d = this.dimension + if(t < t0 || arguments.length !== d+1) { + return + } + var state = this._state + var velocity = this._velocity + var ptr = state.length-this.dimension + var dt = t - t0 + var bounds = this.bounds + var lo = bounds[0] + var hi = bounds[1] + var sf = (dt > 1e-6) ? 1/dt : 0 + this._time.push(t) + for(var i=d; i>0; --i) { + var xc = clamp(lo[i-1], hi[i-1], arguments[i]) + state.push(xc) + velocity.push((xc - state[ptr++]) * sf) + } +} + +proto.set = function(t) { + var d = this.dimension + if(t < this.lastT() || arguments.length !== d+1) { + return + } + var state = this._state + var velocity = this._velocity + var bounds = this.bounds + var lo = bounds[0] + var hi = bounds[1] + this._time.push(t) + for(var i=d; i>0; --i) { + state.push(clamp(lo[i-1], hi[i-1], arguments[i])) + velocity.push(0) + } +} + +proto.move = function(t) { + var t0 = this.lastT() + var d = this.dimension + if(t <= t0 || arguments.length !== d+1) { + return + } + var state = this._state + var velocity = this._velocity + var statePtr = state.length - this.dimension + var bounds = this.bounds + var lo = bounds[0] + var hi = bounds[1] + var dt = t - t0 + var sf = (dt > 1e-6) ? 1/dt : 0.0 + this._time.push(t) + for(var i=d; i>0; --i) { + var dx = arguments[i] + state.push(clamp(lo[i-1], hi[i-1], state[statePtr++] + dx)) + velocity.push(dx * sf) + } +} + +proto.idle = function(t) { + var t0 = this.lastT() + if(t < t0) { + return + } + var d = this.dimension + var state = this._state + var velocity = this._velocity + var statePtr = state.length-d + var bounds = this.bounds + var lo = bounds[0] + var hi = bounds[1] + var dt = t - t0 + this._time.push(t) + for(var i=d-1; i>=0; --i) { + state.push(clamp(lo[i], hi[i], state[statePtr] + dt * velocity[statePtr])) + velocity.push(0) + statePtr += 1 + } +} + +function getZero(d) { + var result = new Array(d) + for(var i=0; i { + +module.exports = clone; + +/** + * Creates a new mat4 initialized with values from an existing matrix + * + * @param {mat4} a matrix to clone + * @returns {mat4} a new 4x4 matrix + */ +function clone(a) { + var out = new Float32Array(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/create.js": +/*!****************************************!*\ + !*** ./node_modules/gl-mat4/create.js ***! + \****************************************/ +/***/ ((module) => { + +module.exports = create; + +/** + * Creates a new identity mat4 + * + * @returns {mat4} a new 4x4 matrix + */ +function create() { + var out = new Float32Array(16); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/determinant.js": +/*!*********************************************!*\ + !*** ./node_modules/gl-mat4/determinant.js ***! + \*********************************************/ +/***/ ((module) => { + +module.exports = determinant; + +/** + * Calculates the determinant of a mat4 + * + * @param {mat4} a the source matrix + * @returns {Number} determinant of a + */ +function determinant(a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32; + + // Calculate the determinant + return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/fromQuat.js": +/*!******************************************!*\ + !*** ./node_modules/gl-mat4/fromQuat.js ***! + \******************************************/ +/***/ ((module) => { + +module.exports = fromQuat; + +/** + * Creates a matrix from a quaternion rotation. + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @returns {mat4} out + */ +function fromQuat(out, q) { + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + yx = y * x2, + yy = y * y2, + zx = z * x2, + zy = z * y2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/fromRotationTranslation.js": +/*!*********************************************************!*\ + !*** ./node_modules/gl-mat4/fromRotationTranslation.js ***! + \*********************************************************/ +/***/ ((module) => { + +module.exports = fromRotationTranslation; + +/** + * Creates a matrix from a quaternion rotation and vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * var quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {vec3} v Translation vector + * @returns {mat4} out + */ +function fromRotationTranslation(out, q, v) { + // Quaternion math + var x = q[0], y = q[1], z = q[2], w = q[3], + x2 = x + x, + y2 = y + y, + z2 = z + z, + + xx = x * x2, + xy = x * y2, + xz = x * z2, + yy = y * y2, + yz = y * z2, + zz = z * z2, + wx = w * x2, + wy = w * y2, + wz = w * z2; + + out[0] = 1 - (yy + zz); + out[1] = xy + wz; + out[2] = xz - wy; + out[3] = 0; + out[4] = xy - wz; + out[5] = 1 - (xx + zz); + out[6] = yz + wx; + out[7] = 0; + out[8] = xz + wy; + out[9] = yz - wx; + out[10] = 1 - (xx + yy); + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/identity.js": +/*!******************************************!*\ + !*** ./node_modules/gl-mat4/identity.js ***! + \******************************************/ +/***/ ((module) => { + +module.exports = identity; + +/** + * Set a mat4 to the identity matrix + * + * @param {mat4} out the receiving matrix + * @returns {mat4} out + */ +function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/invert.js": +/*!****************************************!*\ + !*** ./node_modules/gl-mat4/invert.js ***! + \****************************************/ +/***/ ((module) => { + +module.exports = invert; + +/** + * Inverts a mat4 + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ +function invert(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + + // Calculate the determinant + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/lookAt.js": +/*!****************************************!*\ + !*** ./node_modules/gl-mat4/lookAt.js ***! + \****************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var identity = __webpack_require__(/*! ./identity */ "./node_modules/gl-mat4/identity.js"); + +module.exports = lookAt; + +/** + * Generates a look-at matrix with the given eye position, focal point, and up axis + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {vec3} eye Position of the viewer + * @param {vec3} center Point the viewer is looking at + * @param {vec3} up vec3 pointing up + * @returns {mat4} out + */ +function lookAt(out, eye, center, up) { + var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, + eyex = eye[0], + eyey = eye[1], + eyez = eye[2], + upx = up[0], + upy = up[1], + upz = up[2], + centerx = center[0], + centery = center[1], + centerz = center[2]; + + if (Math.abs(eyex - centerx) < 0.000001 && + Math.abs(eyey - centery) < 0.000001 && + Math.abs(eyez - centerz) < 0.000001) { + return identity(out); + } + + z0 = eyex - centerx; + z1 = eyey - centery; + z2 = eyez - centerz; + + len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); + z0 *= len; + z1 *= len; + z2 *= len; + + x0 = upy * z2 - upz * z1; + x1 = upz * z0 - upx * z2; + x2 = upx * z1 - upy * z0; + len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); + if (!len) { + x0 = 0; + x1 = 0; + x2 = 0; + } else { + len = 1 / len; + x0 *= len; + x1 *= len; + x2 *= len; + } + + y0 = z1 * x2 - z2 * x1; + y1 = z2 * x0 - z0 * x2; + y2 = z0 * x1 - z1 * x0; + + len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); + if (!len) { + y0 = 0; + y1 = 0; + y2 = 0; + } else { + len = 1 / len; + y0 *= len; + y1 *= len; + y2 *= len; + } + + out[0] = x0; + out[1] = y0; + out[2] = z0; + out[3] = 0; + out[4] = x1; + out[5] = y1; + out[6] = z1; + out[7] = 0; + out[8] = x2; + out[9] = y2; + out[10] = z2; + out[11] = 0; + out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); + out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); + out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); + out[15] = 1; + + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/multiply.js": +/*!******************************************!*\ + !*** ./node_modules/gl-mat4/multiply.js ***! + \******************************************/ +/***/ ((module) => { + +module.exports = multiply; + +/** + * Multiplies two mat4's + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the first operand + * @param {mat4} b the second operand + * @returns {mat4} out + */ +function multiply(out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + + // Cache only the current line of the second matrix + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; + out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; + out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + + b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; + out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30; + out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31; + out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32; + out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/rotate.js": +/*!****************************************!*\ + !*** ./node_modules/gl-mat4/rotate.js ***! + \****************************************/ +/***/ ((module) => { + +module.exports = rotate; + +/** + * Rotates a mat4 by the given angle + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @param {vec3} axis the axis to rotate around + * @returns {mat4} out + */ +function rotate(out, a, rad, axis) { + var x = axis[0], y = axis[1], z = axis[2], + len = Math.sqrt(x * x + y * y + z * z), + s, c, t, + a00, a01, a02, a03, + a10, a11, a12, a13, + a20, a21, a22, a23, + b00, b01, b02, + b10, b11, b12, + b20, b21, b22; + + if (Math.abs(len) < 0.000001) { return null; } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + + a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; + a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; + a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; + + // Construct the elements of the rotation matrix + b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; + b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; + b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; + + // Perform rotation-specific matrix multiplication + out[0] = a00 * b00 + a10 * b01 + a20 * b02; + out[1] = a01 * b00 + a11 * b01 + a21 * b02; + out[2] = a02 * b00 + a12 * b01 + a22 * b02; + out[3] = a03 * b00 + a13 * b01 + a23 * b02; + out[4] = a00 * b10 + a10 * b11 + a20 * b12; + out[5] = a01 * b10 + a11 * b11 + a21 * b12; + out[6] = a02 * b10 + a12 * b11 + a22 * b12; + out[7] = a03 * b10 + a13 * b11 + a23 * b12; + out[8] = a00 * b20 + a10 * b21 + a20 * b22; + out[9] = a01 * b20 + a11 * b21 + a21 * b22; + out[10] = a02 * b20 + a12 * b21 + a22 * b22; + out[11] = a03 * b20 + a13 * b21 + a23 * b22; + + if (a !== out) { // If the source and destination differ, copy the unchanged last row + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/rotateX.js": +/*!*****************************************!*\ + !*** ./node_modules/gl-mat4/rotateX.js ***! + \*****************************************/ +/***/ ((module) => { + +module.exports = rotateX; + +/** + * Rotates a matrix by the given angle around the X axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +function rotateX(out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7], + a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/rotateY.js": +/*!*****************************************!*\ + !*** ./node_modules/gl-mat4/rotateY.js ***! + \*****************************************/ +/***/ ((module) => { + +module.exports = rotateY; + +/** + * Rotates a matrix by the given angle around the Y axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +function rotateY(out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3], + a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + + if (a !== out) { // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/rotateZ.js": +/*!*****************************************!*\ + !*** ./node_modules/gl-mat4/rotateZ.js ***! + \*****************************************/ +/***/ ((module) => { + +module.exports = rotateZ; + +/** + * Rotates a matrix by the given angle around the Z axis + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ +function rotateZ(out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3], + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + + if (a !== out) { // If the source and destination differ, copy the unchanged last row + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + // Perform axis-specific matrix multiplication + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/scale.js": +/*!***************************************!*\ + !*** ./node_modules/gl-mat4/scale.js ***! + \***************************************/ +/***/ ((module) => { + +module.exports = scale; + +/** + * Scales the mat4 by the dimensions in the given vec3 + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to scale + * @param {vec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ +function scale(out, a, v) { + var x = v[0], y = v[1], z = v[2]; + + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/translate.js": +/*!*******************************************!*\ + !*** ./node_modules/gl-mat4/translate.js ***! + \*******************************************/ +/***/ ((module) => { + +module.exports = translate; + +/** + * Translate a mat4 by the given vector + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the matrix to translate + * @param {vec3} v vector to translate by + * @returns {mat4} out + */ +function translate(out, a, v) { + var x = v[0], y = v[1], z = v[2], + a00, a01, a02, a03, + a10, a11, a12, a13, + a20, a21, a22, a23; + + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; + a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; + a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; + + out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; + out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; + out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; + + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-mat4/transpose.js": +/*!*******************************************!*\ + !*** ./node_modules/gl-mat4/transpose.js ***! + \*******************************************/ +/***/ ((module) => { + +module.exports = transpose; + +/** + * Transpose the values of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {mat4} a the source matrix + * @returns {mat4} out + */ +function transpose(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], a02 = a[2], a03 = a[3], + a12 = a[6], a13 = a[7], + a23 = a[11]; + + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + } else { + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a[1]; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a[2]; + out[9] = a[6]; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a[3]; + out[13] = a[7]; + out[14] = a[11]; + out[15] = a[15]; + } + + return out; +}; + +/***/ }), + +/***/ "./node_modules/gl-matrix/esm/common.js": +/*!**********************************************!*\ + !*** ./node_modules/gl-matrix/esm/common.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "EPSILON": () => (/* binding */ EPSILON), +/* harmony export */ "ARRAY_TYPE": () => (/* binding */ ARRAY_TYPE), +/* harmony export */ "RANDOM": () => (/* binding */ RANDOM), +/* harmony export */ "setMatrixArrayType": () => (/* binding */ setMatrixArrayType), +/* harmony export */ "toRadian": () => (/* binding */ toRadian), +/* harmony export */ "equals": () => (/* binding */ equals) +/* harmony export */ }); +/** + * Common utilities + * @module glMatrix + */ +// Configuration Constants +var EPSILON = 0.000001; +var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; +var RANDOM = Math.random; +/** + * Sets the type of array used when creating new vectors and matrices + * + * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array + */ + +function setMatrixArrayType(type) { + ARRAY_TYPE = type; +} +var degree = Math.PI / 180; +/** + * Convert Degree To Radian + * + * @param {Number} a Angle in Degrees + */ + +function toRadian(a) { + return a * degree; +} +/** + * Tests whether or not the arguments have approximately the same value, within an absolute + * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less + * than or equal to 1.0, and a relative tolerance is used for larger values) + * + * @param {Number} a The first number to test. + * @param {Number} b The second number to test. + * @returns {Boolean} True if the numbers are approximately equal, false otherwise. + */ + +function equals(a, b) { + return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); +} +if (!Math.hypot) Math.hypot = function () { + var y = 0, + i = arguments.length; + + while (i--) { + y += arguments[i] * arguments[i]; + } + + return Math.sqrt(y); +}; + +/***/ }), + +/***/ "./node_modules/gl-matrix/esm/mat4.js": +/*!********************************************!*\ + !*** ./node_modules/gl-matrix/esm/mat4.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "create": () => (/* binding */ create), +/* harmony export */ "clone": () => (/* binding */ clone), +/* harmony export */ "copy": () => (/* binding */ copy), +/* harmony export */ "fromValues": () => (/* binding */ fromValues), +/* harmony export */ "set": () => (/* binding */ set), +/* harmony export */ "identity": () => (/* binding */ identity), +/* harmony export */ "transpose": () => (/* binding */ transpose), +/* harmony export */ "invert": () => (/* binding */ invert), +/* harmony export */ "adjoint": () => (/* binding */ adjoint), +/* harmony export */ "determinant": () => (/* binding */ determinant), +/* harmony export */ "multiply": () => (/* binding */ multiply), +/* harmony export */ "translate": () => (/* binding */ translate), +/* harmony export */ "scale": () => (/* binding */ scale), +/* harmony export */ "rotate": () => (/* binding */ rotate), +/* harmony export */ "rotateX": () => (/* binding */ rotateX), +/* harmony export */ "rotateY": () => (/* binding */ rotateY), +/* harmony export */ "rotateZ": () => (/* binding */ rotateZ), +/* harmony export */ "fromTranslation": () => (/* binding */ fromTranslation), +/* harmony export */ "fromScaling": () => (/* binding */ fromScaling), +/* harmony export */ "fromRotation": () => (/* binding */ fromRotation), +/* harmony export */ "fromXRotation": () => (/* binding */ fromXRotation), +/* harmony export */ "fromYRotation": () => (/* binding */ fromYRotation), +/* harmony export */ "fromZRotation": () => (/* binding */ fromZRotation), +/* harmony export */ "fromRotationTranslation": () => (/* binding */ fromRotationTranslation), +/* harmony export */ "fromQuat2": () => (/* binding */ fromQuat2), +/* harmony export */ "getTranslation": () => (/* binding */ getTranslation), +/* harmony export */ "getScaling": () => (/* binding */ getScaling), +/* harmony export */ "getRotation": () => (/* binding */ getRotation), +/* harmony export */ "fromRotationTranslationScale": () => (/* binding */ fromRotationTranslationScale), +/* harmony export */ "fromRotationTranslationScaleOrigin": () => (/* binding */ fromRotationTranslationScaleOrigin), +/* harmony export */ "fromQuat": () => (/* binding */ fromQuat), +/* harmony export */ "frustum": () => (/* binding */ frustum), +/* harmony export */ "perspective": () => (/* binding */ perspective), +/* harmony export */ "perspectiveFromFieldOfView": () => (/* binding */ perspectiveFromFieldOfView), +/* harmony export */ "ortho": () => (/* binding */ ortho), +/* harmony export */ "lookAt": () => (/* binding */ lookAt), +/* harmony export */ "targetTo": () => (/* binding */ targetTo), +/* harmony export */ "str": () => (/* binding */ str), +/* harmony export */ "frob": () => (/* binding */ frob), +/* harmony export */ "add": () => (/* binding */ add), +/* harmony export */ "subtract": () => (/* binding */ subtract), +/* harmony export */ "multiplyScalar": () => (/* binding */ multiplyScalar), +/* harmony export */ "multiplyScalarAndAdd": () => (/* binding */ multiplyScalarAndAdd), +/* harmony export */ "exactEquals": () => (/* binding */ exactEquals), +/* harmony export */ "equals": () => (/* binding */ equals), +/* harmony export */ "mul": () => (/* binding */ mul), +/* harmony export */ "sub": () => (/* binding */ sub) +/* harmony export */ }); +/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common.js */ "./node_modules/gl-matrix/esm/common.js"); + +/** + * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. + * @module mat4 + */ + +/** + * Creates a new identity mat4 + * + * @returns {mat4} a new 4x4 matrix + */ + +function create() { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(16); + + if (_common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + } + + out[0] = 1; + out[5] = 1; + out[10] = 1; + out[15] = 1; + return out; +} +/** + * Creates a new mat4 initialized with values from an existing matrix + * + * @param {ReadonlyMat4} a matrix to clone + * @returns {mat4} a new 4x4 matrix + */ + +function clone(a) { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +} +/** + * Copy the values from one mat4 to another + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + +function copy(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +} +/** + * Create a new mat4 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} A new mat4 + */ + +function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(16); + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; +} +/** + * Set the components of a mat4 to the given values + * + * @param {mat4} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} out + */ + +function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; +} +/** + * Set a mat4 to the identity matrix + * + * @param {mat4} out the receiving matrix + * @returns {mat4} out + */ + +function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +/** + * Transpose the values of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + +function transpose(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + } else { + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a[1]; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a[2]; + out[9] = a[6]; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a[3]; + out[13] = a[7]; + out[14] = a[11]; + out[15] = a[15]; + } + + return out; +} +/** + * Inverts a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + +function invert(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; // Calculate the determinant + + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + return out; +} +/** + * Calculates the adjugate of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + +function adjoint(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); + out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); + out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); + out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); + out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); + out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); + out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); + out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); + out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); + out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); + out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); + out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); + out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); + out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); + out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); + out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); + return out; +} +/** + * Calculates the determinant of a mat4 + * + * @param {ReadonlyMat4} a the source matrix + * @returns {Number} determinant of a + */ + +function determinant(a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; // Calculate the determinant + + return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; +} +/** + * Multiplies two mat4s + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + +function multiply(out, a, b) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; // Cache only the current line of the second matrix + + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[4]; + b1 = b[5]; + b2 = b[6]; + b3 = b[7]; + out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[8]; + b1 = b[9]; + b2 = b[10]; + b3 = b[11]; + out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[12]; + b1 = b[13]; + b2 = b[14]; + b3 = b[15]; + out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + return out; +} +/** + * Translate a mat4 by the given vector + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to translate + * @param {ReadonlyVec3} v vector to translate by + * @returns {mat4} out + */ + +function translate(out, a, v) { + var x = v[0], + y = v[1], + z = v[2]; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; + a01 = a[1]; + a02 = a[2]; + a03 = a[3]; + a10 = a[4]; + a11 = a[5]; + a12 = a[6]; + a13 = a[7]; + a20 = a[8]; + a21 = a[9]; + a22 = a[10]; + a23 = a[11]; + out[0] = a00; + out[1] = a01; + out[2] = a02; + out[3] = a03; + out[4] = a10; + out[5] = a11; + out[6] = a12; + out[7] = a13; + out[8] = a20; + out[9] = a21; + out[10] = a22; + out[11] = a23; + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + + return out; +} +/** + * Scales the mat4 by the dimensions in the given vec3 not using vectorization + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {ReadonlyVec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ + +function scale(out, a, v) { + var x = v[0], + y = v[1], + z = v[2]; + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +} +/** + * Rotates a mat4 by the given angle around the given axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out + */ + +function rotate(out, a, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + var b00, b01, b02; + var b10, b11, b12; + var b20, b21, b22; + + if (len < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON) { + return null; + } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + a00 = a[0]; + a01 = a[1]; + a02 = a[2]; + a03 = a[3]; + a10 = a[4]; + a11 = a[5]; + a12 = a[6]; + a13 = a[7]; + a20 = a[8]; + a21 = a[9]; + a22 = a[10]; + a23 = a[11]; // Construct the elements of the rotation matrix + + b00 = x * x * t + c; + b01 = y * x * t + z * s; + b02 = z * x * t - y * s; + b10 = x * y * t - z * s; + b11 = y * y * t + c; + b12 = z * y * t + x * s; + b20 = x * z * t + y * s; + b21 = y * z * t - x * s; + b22 = z * z * t + c; // Perform rotation-specific matrix multiplication + + out[0] = a00 * b00 + a10 * b01 + a20 * b02; + out[1] = a01 * b00 + a11 * b01 + a21 * b02; + out[2] = a02 * b00 + a12 * b01 + a22 * b02; + out[3] = a03 * b00 + a13 * b01 + a23 * b02; + out[4] = a00 * b10 + a10 * b11 + a20 * b12; + out[5] = a01 * b10 + a11 * b11 + a21 * b12; + out[6] = a02 * b10 + a12 * b11 + a22 * b12; + out[7] = a03 * b10 + a13 * b11 + a23 * b12; + out[8] = a00 * b20 + a10 * b21 + a20 * b22; + out[9] = a01 * b20 + a11 * b21 + a21 * b22; + out[10] = a02 * b20 + a12 * b21 + a22 * b22; + out[11] = a03 * b20 + a13 * b21 + a23 * b22; + + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + return out; +} +/** + * Rotates a matrix by the given angle around the X axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + +function rotateX(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; +} +/** + * Rotates a matrix by the given angle around the Y axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + +function rotateY(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; +} +/** + * Rotates a matrix by the given angle around the Z axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + +function rotateZ(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; +} +/** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out + */ + +function fromTranslation(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; +} +/** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.scale(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Scaling vector + * @returns {mat4} out + */ + +function fromScaling(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = v[1]; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = v[2]; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +/** + * Creates a matrix from a given angle around a given axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotate(dest, dest, rad, axis); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out + */ + +function fromRotation(out, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; + + if (len < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON) { + return null; + } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; // Perform rotation-specific matrix multiplication + + out[0] = x * x * t + c; + out[1] = y * x * t + z * s; + out[2] = z * x * t - y * s; + out[3] = 0; + out[4] = x * y * t - z * s; + out[5] = y * y * t + c; + out[6] = z * y * t + x * s; + out[7] = 0; + out[8] = x * z * t + y * s; + out[9] = y * z * t - x * s; + out[10] = z * z * t + c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +/** + * Creates a matrix from the given angle around the X axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateX(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + +function fromXRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = c; + out[6] = s; + out[7] = 0; + out[8] = 0; + out[9] = -s; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +/** + * Creates a matrix from the given angle around the Y axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateY(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + +function fromYRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = c; + out[1] = 0; + out[2] = -s; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = s; + out[9] = 0; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +/** + * Creates a matrix from the given angle around the Z axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateZ(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + +function fromZRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = 0; + out[4] = -s; + out[5] = c; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +/** + * Creates a matrix from a quaternion rotation and vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out + */ + +function fromRotationTranslation(out, q, v) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - (yy + zz); + out[1] = xy + wz; + out[2] = xz - wy; + out[3] = 0; + out[4] = xy - wz; + out[5] = 1 - (xx + zz); + out[6] = yz + wx; + out[7] = 0; + out[8] = xz + wy; + out[9] = yz - wx; + out[10] = 1 - (xx + yy); + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; +} +/** + * Creates a new mat4 from a dual quat. + * + * @param {mat4} out Matrix + * @param {ReadonlyQuat2} a Dual Quaternion + * @returns {mat4} mat4 receiving operation result + */ + +function fromQuat2(out, a) { + var translation = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7]; + var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense + + if (magnitude > 0) { + translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; + translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; + translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; + } else { + translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; + translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; + translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; + } + + fromRotationTranslation(out, a, translation); + return out; +} +/** + * Returns the translation vector component of a transformation + * matrix. If a matrix is built with fromRotationTranslation, + * the returned vector will be the same as the translation vector + * originally supplied. + * @param {vec3} out Vector to receive translation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out + */ + +function getTranslation(out, mat) { + out[0] = mat[12]; + out[1] = mat[13]; + out[2] = mat[14]; + return out; +} +/** + * Returns the scaling factor component of a transformation + * matrix. If a matrix is built with fromRotationTranslationScale + * with a normalized Quaternion paramter, the returned vector will be + * the same as the scaling vector + * originally supplied. + * @param {vec3} out Vector to receive scaling factor component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out + */ + +function getScaling(out, mat) { + var m11 = mat[0]; + var m12 = mat[1]; + var m13 = mat[2]; + var m21 = mat[4]; + var m22 = mat[5]; + var m23 = mat[6]; + var m31 = mat[8]; + var m32 = mat[9]; + var m33 = mat[10]; + out[0] = Math.hypot(m11, m12, m13); + out[1] = Math.hypot(m21, m22, m23); + out[2] = Math.hypot(m31, m32, m33); + return out; +} +/** + * Returns a quaternion representing the rotational component + * of a transformation matrix. If a matrix is built with + * fromRotationTranslation, the returned quaternion will be the + * same as the quaternion originally supplied. + * @param {quat} out Quaternion to receive the rotation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {quat} out + */ + +function getRotation(out, mat) { + var scaling = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); + getScaling(scaling, mat); + var is1 = 1 / scaling[0]; + var is2 = 1 / scaling[1]; + var is3 = 1 / scaling[2]; + var sm11 = mat[0] * is1; + var sm12 = mat[1] * is2; + var sm13 = mat[2] * is3; + var sm21 = mat[4] * is1; + var sm22 = mat[5] * is2; + var sm23 = mat[6] * is3; + var sm31 = mat[8] * is1; + var sm32 = mat[9] * is2; + var sm33 = mat[10] * is3; + var trace = sm11 + sm22 + sm33; + var S = 0; + + if (trace > 0) { + S = Math.sqrt(trace + 1.0) * 2; + out[3] = 0.25 * S; + out[0] = (sm23 - sm32) / S; + out[1] = (sm31 - sm13) / S; + out[2] = (sm12 - sm21) / S; + } else if (sm11 > sm22 && sm11 > sm33) { + S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; + out[3] = (sm23 - sm32) / S; + out[0] = 0.25 * S; + out[1] = (sm12 + sm21) / S; + out[2] = (sm31 + sm13) / S; + } else if (sm22 > sm33) { + S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; + out[3] = (sm31 - sm13) / S; + out[0] = (sm12 + sm21) / S; + out[1] = 0.25 * S; + out[2] = (sm23 + sm32) / S; + } else { + S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; + out[3] = (sm12 - sm21) / S; + out[0] = (sm31 + sm13) / S; + out[1] = (sm23 + sm32) / S; + out[2] = 0.25 * S; + } + + return out; +} +/** + * Creates a matrix from a quaternion rotation, vector translation and vector scale + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @returns {mat4} out + */ + +function fromRotationTranslationScale(out, q, v, s) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; +} +/** + * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * mat4.translate(dest, origin); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * mat4.translate(dest, negativeOrigin); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @param {ReadonlyVec3} o The origin vector around which to scale and rotate + * @returns {mat4} out + */ + +function fromRotationTranslationScaleOrigin(out, q, v, s, o) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + var ox = o[0]; + var oy = o[1]; + var oz = o[2]; + var out0 = (1 - (yy + zz)) * sx; + var out1 = (xy + wz) * sx; + var out2 = (xz - wy) * sx; + var out4 = (xy - wz) * sy; + var out5 = (1 - (xx + zz)) * sy; + var out6 = (yz + wx) * sy; + var out8 = (xz + wy) * sz; + var out9 = (yz - wx) * sz; + var out10 = (1 - (xx + yy)) * sz; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = 0; + out[4] = out4; + out[5] = out5; + out[6] = out6; + out[7] = 0; + out[8] = out8; + out[9] = out9; + out[10] = out10; + out[11] = 0; + out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); + out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); + out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); + out[15] = 1; + return out; +} +/** + * Calculates a 4x4 matrix from the given quaternion + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyQuat} q Quaternion to create matrix from + * + * @returns {mat4} out + */ + +function fromQuat(out, q) { + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} +/** + * Generates a frustum matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Number} left Left bound of the frustum + * @param {Number} right Right bound of the frustum + * @param {Number} bottom Bottom bound of the frustum + * @param {Number} top Top bound of the frustum + * @param {Number} near Near bound of the frustum + * @param {Number} far Far bound of the frustum + * @returns {mat4} out + */ + +function frustum(out, left, right, bottom, top, near, far) { + var rl = 1 / (right - left); + var tb = 1 / (top - bottom); + var nf = 1 / (near - far); + out[0] = near * 2 * rl; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = near * 2 * tb; + out[6] = 0; + out[7] = 0; + out[8] = (right + left) * rl; + out[9] = (top + bottom) * tb; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = far * near * 2 * nf; + out[15] = 0; + return out; +} +/** + * Generates a perspective projection matrix with the given bounds. + * Passing null/undefined/no value for far will generate infinite projection matrix. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum, can be null or Infinity + * @returns {mat4} out + */ + +function perspective(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf; + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; + + if (far != null && far !== Infinity) { + nf = 1 / (near - far); + out[10] = (far + near) * nf; + out[14] = 2 * far * near * nf; + } else { + out[10] = -1; + out[14] = -2 * near; + } + + return out; +} +/** + * Generates a perspective projection matrix with the given field of view. + * This is primarily useful for generating projection matrices to be used + * with the still experiemental WebVR API. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + +function perspectiveFromFieldOfView(out, fov, near, far) { + var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); + var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); + var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); + var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); + var xScale = 2.0 / (leftTan + rightTan); + var yScale = 2.0 / (upTan + downTan); + out[0] = xScale; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + out[4] = 0.0; + out[5] = yScale; + out[6] = 0.0; + out[7] = 0.0; + out[8] = -((leftTan - rightTan) * xScale * 0.5); + out[9] = (upTan - downTan) * yScale * 0.5; + out[10] = far / (near - far); + out[11] = -1.0; + out[12] = 0.0; + out[13] = 0.0; + out[14] = far * near / (near - far); + out[15] = 0.0; + return out; +} +/** + * Generates a orthogonal projection matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + +function ortho(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 2 * nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = (far + near) * nf; + out[15] = 1; + return out; +} +/** + * Generates a look-at matrix with the given eye position, focal point, and up axis. + * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out + */ + +function lookAt(out, eye, center, up) { + var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; + var eyex = eye[0]; + var eyey = eye[1]; + var eyez = eye[2]; + var upx = up[0]; + var upy = up[1]; + var upz = up[2]; + var centerx = center[0]; + var centery = center[1]; + var centerz = center[2]; + + if (Math.abs(eyex - centerx) < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON && Math.abs(eyey - centery) < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON && Math.abs(eyez - centerz) < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON) { + return identity(out); + } + + z0 = eyex - centerx; + z1 = eyey - centery; + z2 = eyez - centerz; + len = 1 / Math.hypot(z0, z1, z2); + z0 *= len; + z1 *= len; + z2 *= len; + x0 = upy * z2 - upz * z1; + x1 = upz * z0 - upx * z2; + x2 = upx * z1 - upy * z0; + len = Math.hypot(x0, x1, x2); + + if (!len) { + x0 = 0; + x1 = 0; + x2 = 0; + } else { + len = 1 / len; + x0 *= len; + x1 *= len; + x2 *= len; + } + + y0 = z1 * x2 - z2 * x1; + y1 = z2 * x0 - z0 * x2; + y2 = z0 * x1 - z1 * x0; + len = Math.hypot(y0, y1, y2); + + if (!len) { + y0 = 0; + y1 = 0; + y2 = 0; + } else { + len = 1 / len; + y0 *= len; + y1 *= len; + y2 *= len; + } + + out[0] = x0; + out[1] = y0; + out[2] = z0; + out[3] = 0; + out[4] = x1; + out[5] = y1; + out[6] = z1; + out[7] = 0; + out[8] = x2; + out[9] = y2; + out[10] = z2; + out[11] = 0; + out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); + out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); + out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); + out[15] = 1; + return out; +} +/** + * Generates a matrix that makes something look at something else. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out + */ + +function targetTo(out, eye, target, up) { + var eyex = eye[0], + eyey = eye[1], + eyez = eye[2], + upx = up[0], + upy = up[1], + upz = up[2]; + var z0 = eyex - target[0], + z1 = eyey - target[1], + z2 = eyez - target[2]; + var len = z0 * z0 + z1 * z1 + z2 * z2; + + if (len > 0) { + len = 1 / Math.sqrt(len); + z0 *= len; + z1 *= len; + z2 *= len; + } + + var x0 = upy * z2 - upz * z1, + x1 = upz * z0 - upx * z2, + x2 = upx * z1 - upy * z0; + len = x0 * x0 + x1 * x1 + x2 * x2; + + if (len > 0) { + len = 1 / Math.sqrt(len); + x0 *= len; + x1 *= len; + x2 *= len; + } + + out[0] = x0; + out[1] = x1; + out[2] = x2; + out[3] = 0; + out[4] = z1 * x2 - z2 * x1; + out[5] = z2 * x0 - z0 * x2; + out[6] = z0 * x1 - z1 * x0; + out[7] = 0; + out[8] = z0; + out[9] = z1; + out[10] = z2; + out[11] = 0; + out[12] = eyex; + out[13] = eyey; + out[14] = eyez; + out[15] = 1; + return out; +} +/** + * Returns a string representation of a mat4 + * + * @param {ReadonlyMat4} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ + +function str(a) { + return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"; +} +/** + * Returns Frobenius norm of a mat4 + * + * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + +function frob(a) { + return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); +} +/** + * Adds two mat4's + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + +function add(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + out[8] = a[8] + b[8]; + out[9] = a[9] + b[9]; + out[10] = a[10] + b[10]; + out[11] = a[11] + b[11]; + out[12] = a[12] + b[12]; + out[13] = a[13] + b[13]; + out[14] = a[14] + b[14]; + out[15] = a[15] + b[15]; + return out; +} +/** + * Subtracts matrix b from matrix a + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + +function subtract(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + out[6] = a[6] - b[6]; + out[7] = a[7] - b[7]; + out[8] = a[8] - b[8]; + out[9] = a[9] - b[9]; + out[10] = a[10] - b[10]; + out[11] = a[11] - b[11]; + out[12] = a[12] - b[12]; + out[13] = a[13] - b[13]; + out[14] = a[14] - b[14]; + out[15] = a[15] - b[15]; + return out; +} +/** + * Multiply each element of the matrix by a scalar. + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat4} out + */ + +function multiplyScalar(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + out[8] = a[8] * b; + out[9] = a[9] * b; + out[10] = a[10] * b; + out[11] = a[11] * b; + out[12] = a[12] * b; + out[13] = a[13] * b; + out[14] = a[14] * b; + out[15] = a[15] * b; + return out; +} +/** + * Adds two mat4's after multiplying each element of the second operand by a scalar value. + * + * @param {mat4} out the receiving vector + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat4} out + */ + +function multiplyScalarAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + out[6] = a[6] + b[6] * scale; + out[7] = a[7] + b[7] * scale; + out[8] = a[8] + b[8] * scale; + out[9] = a[9] + b[9] * scale; + out[10] = a[10] + b[10] * scale; + out[11] = a[11] + b[11] * scale; + out[12] = a[12] + b[12] * scale; + out[13] = a[13] + b[13] * scale; + out[14] = a[14] + b[14] * scale; + out[15] = a[15] + b[15] * scale; + return out; +} +/** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + +function exactEquals(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; +} +/** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + +function equals(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7]; + var a8 = a[8], + a9 = a[9], + a10 = a[10], + a11 = a[11]; + var a12 = a[12], + a13 = a[13], + a14 = a[14], + a15 = a[15]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + var b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7]; + var b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11]; + var b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; + return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); +} +/** + * Alias for {@link mat4.multiply} + * @function + */ + +var mul = multiply; +/** + * Alias for {@link mat4.subtract} + * @function + */ + +var sub = subtract; + +/***/ }), + +/***/ "./node_modules/gl-matrix/esm/vec3.js": +/*!********************************************!*\ + !*** ./node_modules/gl-matrix/esm/vec3.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "create": () => (/* binding */ create), +/* harmony export */ "clone": () => (/* binding */ clone), +/* harmony export */ "length": () => (/* binding */ length), +/* harmony export */ "fromValues": () => (/* binding */ fromValues), +/* harmony export */ "copy": () => (/* binding */ copy), +/* harmony export */ "set": () => (/* binding */ set), +/* harmony export */ "add": () => (/* binding */ add), +/* harmony export */ "subtract": () => (/* binding */ subtract), +/* harmony export */ "multiply": () => (/* binding */ multiply), +/* harmony export */ "divide": () => (/* binding */ divide), +/* harmony export */ "ceil": () => (/* binding */ ceil), +/* harmony export */ "floor": () => (/* binding */ floor), +/* harmony export */ "min": () => (/* binding */ min), +/* harmony export */ "max": () => (/* binding */ max), +/* harmony export */ "round": () => (/* binding */ round), +/* harmony export */ "scale": () => (/* binding */ scale), +/* harmony export */ "scaleAndAdd": () => (/* binding */ scaleAndAdd), +/* harmony export */ "distance": () => (/* binding */ distance), +/* harmony export */ "squaredDistance": () => (/* binding */ squaredDistance), +/* harmony export */ "squaredLength": () => (/* binding */ squaredLength), +/* harmony export */ "negate": () => (/* binding */ negate), +/* harmony export */ "inverse": () => (/* binding */ inverse), +/* harmony export */ "normalize": () => (/* binding */ normalize), +/* harmony export */ "dot": () => (/* binding */ dot), +/* harmony export */ "cross": () => (/* binding */ cross), +/* harmony export */ "lerp": () => (/* binding */ lerp), +/* harmony export */ "hermite": () => (/* binding */ hermite), +/* harmony export */ "bezier": () => (/* binding */ bezier), +/* harmony export */ "random": () => (/* binding */ random), +/* harmony export */ "transformMat4": () => (/* binding */ transformMat4), +/* harmony export */ "transformMat3": () => (/* binding */ transformMat3), +/* harmony export */ "transformQuat": () => (/* binding */ transformQuat), +/* harmony export */ "rotateX": () => (/* binding */ rotateX), +/* harmony export */ "rotateY": () => (/* binding */ rotateY), +/* harmony export */ "rotateZ": () => (/* binding */ rotateZ), +/* harmony export */ "angle": () => (/* binding */ angle), +/* harmony export */ "zero": () => (/* binding */ zero), +/* harmony export */ "str": () => (/* binding */ str), +/* harmony export */ "exactEquals": () => (/* binding */ exactEquals), +/* harmony export */ "equals": () => (/* binding */ equals), +/* harmony export */ "sub": () => (/* binding */ sub), +/* harmony export */ "mul": () => (/* binding */ mul), +/* harmony export */ "div": () => (/* binding */ div), +/* harmony export */ "dist": () => (/* binding */ dist), +/* harmony export */ "sqrDist": () => (/* binding */ sqrDist), +/* harmony export */ "len": () => (/* binding */ len), +/* harmony export */ "sqrLen": () => (/* binding */ sqrLen), +/* harmony export */ "forEach": () => (/* binding */ forEach) +/* harmony export */ }); +/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common.js */ "./node_modules/gl-matrix/esm/common.js"); + +/** + * 3 Dimensional Vector + * @module vec3 + */ + +/** + * Creates a new, empty vec3 + * + * @returns {vec3} a new 3D vector + */ + +function create() { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); + + if (_common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } + + return out; +} +/** + * Creates a new vec3 initialized with values from an existing vector + * + * @param {ReadonlyVec3} a vector to clone + * @returns {vec3} a new 3D vector + */ + +function clone(a) { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; +} +/** + * Calculates the length of a vec3 + * + * @param {ReadonlyVec3} a vector to calculate length of + * @returns {Number} length of a + */ + +function length(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return Math.hypot(x, y, z); +} +/** + * Creates a new vec3 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} a new 3D vector + */ + +function fromValues(x, y, z) { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); + out[0] = x; + out[1] = y; + out[2] = z; + return out; +} +/** + * Copy the values from one vec3 to another + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the source vector + * @returns {vec3} out + */ + +function copy(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; +} +/** + * Set the components of a vec3 to the given values + * + * @param {vec3} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} out + */ + +function set(out, x, y, z) { + out[0] = x; + out[1] = y; + out[2] = z; + return out; +} +/** + * Adds two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + +function add(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + return out; +} +/** + * Subtracts vector b from vector a + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + +function subtract(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + return out; +} +/** + * Multiplies two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + +function multiply(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + return out; +} +/** + * Divides two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + +function divide(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + return out; +} +/** + * Math.ceil the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to ceil + * @returns {vec3} out + */ + +function ceil(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + out[2] = Math.ceil(a[2]); + return out; +} +/** + * Math.floor the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to floor + * @returns {vec3} out + */ + +function floor(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + out[2] = Math.floor(a[2]); + return out; +} +/** + * Returns the minimum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + +function min(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + return out; +} +/** + * Returns the maximum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + +function max(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + return out; +} +/** + * Math.round the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to round + * @returns {vec3} out + */ + +function round(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + out[2] = Math.round(a[2]); + return out; +} +/** + * Scales a vec3 by a scalar number + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec3} out + */ + +function scale(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + return out; +} +/** + * Adds two vec3's after scaling the second operand by a scalar value + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec3} out + */ + +function scaleAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + return out; +} +/** + * Calculates the euclidian distance between two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} distance between a and b + */ + +function distance(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + return Math.hypot(x, y, z); +} +/** + * Calculates the squared euclidian distance between two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} squared distance between a and b + */ + +function squaredDistance(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + return x * x + y * y + z * z; +} +/** + * Calculates the squared length of a vec3 + * + * @param {ReadonlyVec3} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + +function squaredLength(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return x * x + y * y + z * z; +} +/** + * Negates the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to negate + * @returns {vec3} out + */ + +function negate(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + return out; +} +/** + * Returns the inverse of the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to invert + * @returns {vec3} out + */ + +function inverse(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + return out; +} +/** + * Normalize a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to normalize + * @returns {vec3} out + */ + +function normalize(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var len = x * x + y * y + z * z; + + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + } + + out[0] = a[0] * len; + out[1] = a[1] * len; + out[2] = a[2] * len; + return out; +} +/** + * Calculates the dot product of two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} dot product of a and b + */ + +function dot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} +/** + * Computes the cross product of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + +function cross(out, a, b) { + var ax = a[0], + ay = a[1], + az = a[2]; + var bx = b[0], + by = b[1], + bz = b[2]; + out[0] = ay * bz - az * by; + out[1] = az * bx - ax * bz; + out[2] = ax * by - ay * bx; + return out; +} +/** + * Performs a linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + +function lerp(out, a, b, t) { + var ax = a[0]; + var ay = a[1]; + var az = a[2]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + return out; +} +/** + * Performs a hermite interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {ReadonlyVec3} c the third operand + * @param {ReadonlyVec3} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + +function hermite(out, a, b, c, d, t) { + var factorTimes2 = t * t; + var factor1 = factorTimes2 * (2 * t - 3) + 1; + var factor2 = factorTimes2 * (t - 2) + t; + var factor3 = factorTimes2 * (t - 1); + var factor4 = factorTimes2 * (3 - 2 * t); + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + return out; +} +/** + * Performs a bezier interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {ReadonlyVec3} c the third operand + * @param {ReadonlyVec3} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + +function bezier(out, a, b, c, d, t) { + var inverseFactor = 1 - t; + var inverseFactorTimesTwo = inverseFactor * inverseFactor; + var factorTimes2 = t * t; + var factor1 = inverseFactorTimesTwo * inverseFactor; + var factor2 = 3 * t * inverseFactorTimesTwo; + var factor3 = 3 * factorTimes2 * inverseFactor; + var factor4 = factorTimes2 * t; + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + return out; +} +/** + * Generates a random vector with the given scale + * + * @param {vec3} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec3} out + */ + +function random(out, scale) { + scale = scale || 1.0; + var r = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2.0 * Math.PI; + var z = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2.0 - 1.0; + var zScale = Math.sqrt(1.0 - z * z) * scale; + out[0] = Math.cos(r) * zScale; + out[1] = Math.sin(r) * zScale; + out[2] = z * scale; + return out; +} +/** + * Transforms the vec3 with a mat4. + * 4th vector component is implicitly '1' + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec3} out + */ + +function transformMat4(out, a, m) { + var x = a[0], + y = a[1], + z = a[2]; + var w = m[3] * x + m[7] * y + m[11] * z + m[15]; + w = w || 1.0; + out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; + out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; + out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; + return out; +} +/** + * Transforms the vec3 with a mat3. + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat3} m the 3x3 matrix to transform with + * @returns {vec3} out + */ + +function transformMat3(out, a, m) { + var x = a[0], + y = a[1], + z = a[2]; + out[0] = x * m[0] + y * m[3] + z * m[6]; + out[1] = x * m[1] + y * m[4] + z * m[7]; + out[2] = x * m[2] + y * m[5] + z * m[8]; + return out; +} +/** + * Transforms the vec3 with a quat + * Can also be used for dual quaternions. (Multiply it with the real part) + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyQuat} q quaternion to transform with + * @returns {vec3} out + */ + +function transformQuat(out, a, q) { + // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3]; + var x = a[0], + y = a[1], + z = a[2]; // var qvec = [qx, qy, qz]; + // var uv = vec3.cross([], qvec, a); + + var uvx = qy * z - qz * y, + uvy = qz * x - qx * z, + uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); + + var uuvx = qy * uvz - qz * uvy, + uuvy = qz * uvx - qx * uvz, + uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); + + var w2 = qw * 2; + uvx *= w2; + uvy *= w2; + uvz *= w2; // vec3.scale(uuv, uuv, 2); + + uuvx *= 2; + uuvy *= 2; + uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); + + out[0] = x + uvx + uuvx; + out[1] = y + uvy + uuvy; + out[2] = z + uvz + uuvz; + return out; +} +/** + * Rotate a 3D vector around the x-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ + +function rotateX(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin + + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation + + r[0] = p[0]; + r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); + r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position + + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; +} +/** + * Rotate a 3D vector around the y-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ + +function rotateY(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin + + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation + + r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); + r[1] = p[1]; + r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position + + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; +} +/** + * Rotate a 3D vector around the z-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ + +function rotateZ(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin + + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation + + r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); + r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); + r[2] = p[2]; //translate to correct position + + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; +} +/** + * Get the angle between two 3D vectors + * @param {ReadonlyVec3} a The first operand + * @param {ReadonlyVec3} b The second operand + * @returns {Number} The angle in radians + */ + +function angle(a, b) { + var ax = a[0], + ay = a[1], + az = a[2], + bx = b[0], + by = b[1], + bz = b[2], + mag1 = Math.sqrt(ax * ax + ay * ay + az * az), + mag2 = Math.sqrt(bx * bx + by * by + bz * bz), + mag = mag1 * mag2, + cosine = mag && dot(a, b) / mag; + return Math.acos(Math.min(Math.max(cosine, -1), 1)); +} +/** + * Set the components of a vec3 to zero + * + * @param {vec3} out the receiving vector + * @returns {vec3} out + */ + +function zero(out) { + out[0] = 0.0; + out[1] = 0.0; + out[2] = 0.0; + return out; +} +/** + * Returns a string representation of a vector + * + * @param {ReadonlyVec3} a vector to represent as a string + * @returns {String} string representation of the vector + */ + +function str(a) { + return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; +} +/** + * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec3} a The first vector. + * @param {ReadonlyVec3} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + +function exactEquals(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; +} +/** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec3} a The first vector. + * @param {ReadonlyVec3} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + +function equals(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2]; + var b0 = b[0], + b1 = b[1], + b2 = b[2]; + return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); +} +/** + * Alias for {@link vec3.subtract} + * @function + */ + +var sub = subtract; +/** + * Alias for {@link vec3.multiply} + * @function + */ + +var mul = multiply; +/** + * Alias for {@link vec3.divide} + * @function + */ + +var div = divide; +/** + * Alias for {@link vec3.distance} + * @function + */ + +var dist = distance; +/** + * Alias for {@link vec3.squaredDistance} + * @function + */ + +var sqrDist = squaredDistance; +/** + * Alias for {@link vec3.length} + * @function + */ + +var len = length; +/** + * Alias for {@link vec3.squaredLength} + * @function + */ + +var sqrLen = squaredLength; +/** + * Perform some operation over an array of vec3s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + +var forEach = function () { + var vec = create(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 3; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + } + + return a; + }; +}(); + +/***/ }), + +/***/ "./node_modules/gl-matrix/esm/vec4.js": +/*!********************************************!*\ + !*** ./node_modules/gl-matrix/esm/vec4.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "create": () => (/* binding */ create), +/* harmony export */ "clone": () => (/* binding */ clone), +/* harmony export */ "fromValues": () => (/* binding */ fromValues), +/* harmony export */ "copy": () => (/* binding */ copy), +/* harmony export */ "set": () => (/* binding */ set), +/* harmony export */ "add": () => (/* binding */ add), +/* harmony export */ "subtract": () => (/* binding */ subtract), +/* harmony export */ "multiply": () => (/* binding */ multiply), +/* harmony export */ "divide": () => (/* binding */ divide), +/* harmony export */ "ceil": () => (/* binding */ ceil), +/* harmony export */ "floor": () => (/* binding */ floor), +/* harmony export */ "min": () => (/* binding */ min), +/* harmony export */ "max": () => (/* binding */ max), +/* harmony export */ "round": () => (/* binding */ round), +/* harmony export */ "scale": () => (/* binding */ scale), +/* harmony export */ "scaleAndAdd": () => (/* binding */ scaleAndAdd), +/* harmony export */ "distance": () => (/* binding */ distance), +/* harmony export */ "squaredDistance": () => (/* binding */ squaredDistance), +/* harmony export */ "length": () => (/* binding */ length), +/* harmony export */ "squaredLength": () => (/* binding */ squaredLength), +/* harmony export */ "negate": () => (/* binding */ negate), +/* harmony export */ "inverse": () => (/* binding */ inverse), +/* harmony export */ "normalize": () => (/* binding */ normalize), +/* harmony export */ "dot": () => (/* binding */ dot), +/* harmony export */ "cross": () => (/* binding */ cross), +/* harmony export */ "lerp": () => (/* binding */ lerp), +/* harmony export */ "random": () => (/* binding */ random), +/* harmony export */ "transformMat4": () => (/* binding */ transformMat4), +/* harmony export */ "transformQuat": () => (/* binding */ transformQuat), +/* harmony export */ "zero": () => (/* binding */ zero), +/* harmony export */ "str": () => (/* binding */ str), +/* harmony export */ "exactEquals": () => (/* binding */ exactEquals), +/* harmony export */ "equals": () => (/* binding */ equals), +/* harmony export */ "sub": () => (/* binding */ sub), +/* harmony export */ "mul": () => (/* binding */ mul), +/* harmony export */ "div": () => (/* binding */ div), +/* harmony export */ "dist": () => (/* binding */ dist), +/* harmony export */ "sqrDist": () => (/* binding */ sqrDist), +/* harmony export */ "len": () => (/* binding */ len), +/* harmony export */ "sqrLen": () => (/* binding */ sqrLen), +/* harmony export */ "forEach": () => (/* binding */ forEach) +/* harmony export */ }); +/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common.js */ "./node_modules/gl-matrix/esm/common.js"); + +/** + * 4 Dimensional Vector + * @module vec4 + */ + +/** + * Creates a new, empty vec4 + * + * @returns {vec4} a new 4D vector + */ + +function create() { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(4); + + if (_common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + } + + return out; +} +/** + * Creates a new vec4 initialized with values from an existing vector + * + * @param {ReadonlyVec4} a vector to clone + * @returns {vec4} a new 4D vector + */ + +function clone(a) { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +} +/** + * Creates a new vec4 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} a new 4D vector + */ + +function fromValues(x, y, z, w) { + var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(4); + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; +} +/** + * Copy the values from one vec4 to another + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the source vector + * @returns {vec4} out + */ + +function copy(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +} +/** + * Set the components of a vec4 to the given values + * + * @param {vec4} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} out + */ + +function set(out, x, y, z, w) { + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; +} +/** + * Adds two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + +function add(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + return out; +} +/** + * Subtracts vector b from vector a + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + +function subtract(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + return out; +} +/** + * Multiplies two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + +function multiply(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + out[3] = a[3] * b[3]; + return out; +} +/** + * Divides two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + +function divide(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + out[3] = a[3] / b[3]; + return out; +} +/** + * Math.ceil the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to ceil + * @returns {vec4} out + */ + +function ceil(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + out[2] = Math.ceil(a[2]); + out[3] = Math.ceil(a[3]); + return out; +} +/** + * Math.floor the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to floor + * @returns {vec4} out + */ + +function floor(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + out[2] = Math.floor(a[2]); + out[3] = Math.floor(a[3]); + return out; +} +/** + * Returns the minimum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + +function min(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + out[3] = Math.min(a[3], b[3]); + return out; +} +/** + * Returns the maximum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ + +function max(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + out[3] = Math.max(a[3], b[3]); + return out; +} +/** + * Math.round the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to round + * @returns {vec4} out + */ + +function round(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + out[2] = Math.round(a[2]); + out[3] = Math.round(a[3]); + return out; +} +/** + * Scales a vec4 by a scalar number + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec4} out + */ + +function scale(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + return out; +} +/** + * Adds two vec4's after scaling the second operand by a scalar value + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec4} out + */ + +function scaleAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + return out; +} +/** + * Calculates the euclidian distance between two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} distance between a and b + */ + +function distance(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + var w = b[3] - a[3]; + return Math.hypot(x, y, z, w); +} +/** + * Calculates the squared euclidian distance between two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} squared distance between a and b + */ + +function squaredDistance(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + var w = b[3] - a[3]; + return x * x + y * y + z * z + w * w; +} +/** + * Calculates the length of a vec4 + * + * @param {ReadonlyVec4} a vector to calculate length of + * @returns {Number} length of a + */ + +function length(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + return Math.hypot(x, y, z, w); +} +/** + * Calculates the squared length of a vec4 + * + * @param {ReadonlyVec4} a vector to calculate squared length of + * @returns {Number} squared length of a + */ + +function squaredLength(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + return x * x + y * y + z * z + w * w; +} +/** + * Negates the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to negate + * @returns {vec4} out + */ + +function negate(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = -a[3]; + return out; +} +/** + * Returns the inverse of the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to invert + * @returns {vec4} out + */ + +function inverse(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + out[3] = 1.0 / a[3]; + return out; +} +/** + * Normalize a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to normalize + * @returns {vec4} out + */ + +function normalize(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + var len = x * x + y * y + z * z + w * w; + + if (len > 0) { + len = 1 / Math.sqrt(len); + } + + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + return out; +} +/** + * Calculates the dot product of two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} dot product of a and b + */ + +function dot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; +} +/** + * Returns the cross-product of three vectors in a 4-dimensional space + * + * @param {ReadonlyVec4} result the receiving vector + * @param {ReadonlyVec4} U the first vector + * @param {ReadonlyVec4} V the second vector + * @param {ReadonlyVec4} W the third vector + * @returns {vec4} result + */ + +function cross(out, u, v, w) { + var A = v[0] * w[1] - v[1] * w[0], + B = v[0] * w[2] - v[2] * w[0], + C = v[0] * w[3] - v[3] * w[0], + D = v[1] * w[2] - v[2] * w[1], + E = v[1] * w[3] - v[3] * w[1], + F = v[2] * w[3] - v[3] * w[2]; + var G = u[0]; + var H = u[1]; + var I = u[2]; + var J = u[3]; + out[0] = H * F - I * E + J * D; + out[1] = -(G * F) + I * C - J * B; + out[2] = G * E - H * C + J * A; + out[3] = -(G * D) + H * B - I * A; + return out; +} +/** + * Performs a linear interpolation between two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec4} out + */ + +function lerp(out, a, b, t) { + var ax = a[0]; + var ay = a[1]; + var az = a[2]; + var aw = a[3]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + out[3] = aw + t * (b[3] - aw); + return out; +} +/** + * Generates a random vector with the given scale + * + * @param {vec4} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec4} out + */ + +function random(out, scale) { + scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a + // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646. + // http://projecteuclid.org/euclid.aoms/1177692644; + + var v1, v2, v3, v4; + var s1, s2; + + do { + v1 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; + v2 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; + s1 = v1 * v1 + v2 * v2; + } while (s1 >= 1); + + do { + v3 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; + v4 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; + s2 = v3 * v3 + v4 * v4; + } while (s2 >= 1); + + var d = Math.sqrt((1 - s1) / s2); + out[0] = scale * v1; + out[1] = scale * v2; + out[2] = scale * v3 * d; + out[3] = scale * v4 * d; + return out; +} +/** + * Transforms the vec4 with a mat4. + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec4} out + */ + +function transformMat4(out, a, m) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; +} +/** + * Transforms the vec4 with a quat + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to transform + * @param {ReadonlyQuat} q quaternion to transform with + * @returns {vec4} out + */ + +function transformQuat(out, a, q) { + var x = a[0], + y = a[1], + z = a[2]; + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3]; // calculate quat * vec + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat + + out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; + out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; + out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; + out[3] = a[3]; + return out; +} +/** + * Set the components of a vec4 to zero + * + * @param {vec4} out the receiving vector + * @returns {vec4} out + */ + +function zero(out) { + out[0] = 0.0; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + return out; +} +/** + * Returns a string representation of a vector + * + * @param {ReadonlyVec4} a vector to represent as a string + * @returns {String} string representation of the vector + */ + +function str(a) { + return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; +} +/** + * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec4} a The first vector. + * @param {ReadonlyVec4} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + +function exactEquals(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; +} +/** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec4} a The first vector. + * @param {ReadonlyVec4} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + +function equals(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); +} +/** + * Alias for {@link vec4.subtract} + * @function + */ + +var sub = subtract; +/** + * Alias for {@link vec4.multiply} + * @function + */ + +var mul = multiply; +/** + * Alias for {@link vec4.divide} + * @function + */ + +var div = divide; +/** + * Alias for {@link vec4.distance} + * @function + */ + +var dist = distance; +/** + * Alias for {@link vec4.squaredDistance} + * @function + */ + +var sqrDist = squaredDistance; +/** + * Alias for {@link vec4.length} + * @function + */ + +var len = length; +/** + * Alias for {@link vec4.squaredLength} + * @function + */ + +var sqrLen = squaredLength; +/** + * Perform some operation over an array of vec4s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + +var forEach = function () { + var vec = create(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 4; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + vec[3] = a[i + 3]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + a[i + 3] = vec[3]; + } + + return a; + }; +}(); + +/***/ }), + +/***/ "./node_modules/gl-quat/slerp.js": +/*!***************************************!*\ + !*** ./node_modules/gl-quat/slerp.js ***! + \***************************************/ +/***/ ((module) => { + +module.exports = slerp + +/** + * Performs a spherical linear interpolation between two quat + * + * @param {quat} out the receiving quaternion + * @param {quat} a the first operand + * @param {quat} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {quat} out + */ +function slerp (out, a, b, t) { + // benchmarks: + // http://jsperf.com/quaternion-slerp-implementations + + var ax = a[0], ay = a[1], az = a[2], aw = a[3], + bx = b[0], by = b[1], bz = b[2], bw = b[3] + + var omega, cosom, sinom, scale0, scale1 + + // calc cosine + cosom = ax * bx + ay * by + az * bz + aw * bw + // adjust signs (if necessary) + if (cosom < 0.0) { + cosom = -cosom + bx = -bx + by = -by + bz = -bz + bw = -bw + } + // calculate coefficients + if ((1.0 - cosom) > 0.000001) { + // standard case (slerp) + omega = Math.acos(cosom) + sinom = Math.sin(omega) + scale0 = Math.sin((1.0 - t) * omega) / sinom + scale1 = Math.sin(t * omega) / sinom + } else { + // "from" and "to" quaternions are very close + // ... so we can do a linear interpolation + scale0 = 1.0 - t + scale1 = t + } + // calculate final values + out[0] = scale0 * ax + scale1 * bx + out[1] = scale0 * ay + scale1 * by + out[2] = scale0 * az + scale1 * bz + out[3] = scale0 * aw + scale1 * bw + + return out +} + + +/***/ }), + +/***/ "./node_modules/gl-vec3/cross.js": +/*!***************************************!*\ + !*** ./node_modules/gl-vec3/cross.js ***! + \***************************************/ +/***/ ((module) => { + +module.exports = cross; + +/** + * Computes the cross product of two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {vec3} out + */ +function cross(out, a, b) { + var ax = a[0], ay = a[1], az = a[2], + bx = b[0], by = b[1], bz = b[2] + + out[0] = ay * bz - az * by + out[1] = az * bx - ax * bz + out[2] = ax * by - ay * bx + return out +} + +/***/ }), + +/***/ "./node_modules/gl-vec3/dot.js": +/*!*************************************!*\ + !*** ./node_modules/gl-vec3/dot.js ***! + \*************************************/ +/***/ ((module) => { + +module.exports = dot; + +/** + * Calculates the dot product of two vec3's + * + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @returns {Number} dot product of a and b + */ +function dot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] +} + +/***/ }), + +/***/ "./node_modules/gl-vec3/length.js": +/*!****************************************!*\ + !*** ./node_modules/gl-vec3/length.js ***! + \****************************************/ +/***/ ((module) => { + +module.exports = length; + +/** + * Calculates the length of a vec3 + * + * @param {vec3} a vector to calculate length of + * @returns {Number} length of a + */ +function length(a) { + var x = a[0], + y = a[1], + z = a[2] + return Math.sqrt(x*x + y*y + z*z) +} + +/***/ }), + +/***/ "./node_modules/gl-vec3/lerp.js": +/*!**************************************!*\ + !*** ./node_modules/gl-vec3/lerp.js ***! + \**************************************/ +/***/ ((module) => { + +module.exports = lerp; + +/** + * Performs a linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {vec3} a the first operand + * @param {vec3} b the second operand + * @param {Number} t interpolation amount between the two inputs + * @returns {vec3} out + */ +function lerp(out, a, b, t) { + var ax = a[0], + ay = a[1], + az = a[2] + out[0] = ax + t * (b[0] - ax) + out[1] = ay + t * (b[1] - ay) + out[2] = az + t * (b[2] - az) + return out +} + +/***/ }), + +/***/ "./node_modules/gl-vec3/normalize.js": +/*!*******************************************!*\ + !*** ./node_modules/gl-vec3/normalize.js ***! + \*******************************************/ +/***/ ((module) => { + +module.exports = normalize; + +/** + * Normalize a vec3 + * + * @param {vec3} out the receiving vector + * @param {vec3} a vector to normalize + * @returns {vec3} out + */ +function normalize(out, a) { + var x = a[0], + y = a[1], + z = a[2] + var len = x*x + y*y + z*z + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len) + out[0] = a[0] * len + out[1] = a[1] * len + out[2] = a[2] * len + } + return out +} + +/***/ }), + +/***/ "./node_modules/has-passive-events/index.js": +/*!**************************************************!*\ + !*** ./node_modules/has-passive-events/index.js ***! + \**************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isBrowser = __webpack_require__(/*! is-browser */ "./node_modules/is-browser/client.js") + +function detect() { + var supported = false + + try { + var opts = Object.defineProperty({}, 'passive', { + get: function() { + supported = true + } + }) + + window.addEventListener('test', null, opts) + window.removeEventListener('test', null, opts) + } catch(e) { + supported = false + } + + return supported +} + +module.exports = isBrowser && detect() + + +/***/ }), + +/***/ "./node_modules/is-browser/client.js": +/*!*******************************************!*\ + !*** ./node_modules/is-browser/client.js ***! + \*******************************************/ +/***/ ((module) => { + +module.exports = true; + +/***/ }), + +/***/ "./node_modules/mat4-decompose/index.js": +/*!**********************************************!*\ + !*** ./node_modules/mat4-decompose/index.js ***! + \**********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/*jshint unused:true*/ +/* +Input: matrix ; a 4x4 matrix +Output: translation ; a 3 component vector + scale ; a 3 component vector + skew ; skew factors XY,XZ,YZ represented as a 3 component vector + perspective ; a 4 component vector + quaternion ; a 4 component vector +Returns false if the matrix cannot be decomposed, true if it can + + +References: +https://github.com/kamicane/matrix3d/blob/master/lib/Matrix3d.js +https://github.com/ChromiumWebApps/chromium/blob/master/ui/gfx/transform_util.cc +http://www.w3.org/TR/css3-transforms/#decomposing-a-3d-matrix +*/ + +var normalize = __webpack_require__(/*! ./normalize */ "./node_modules/mat4-decompose/normalize.js") + +var create = __webpack_require__(/*! gl-mat4/create */ "./node_modules/gl-mat4/create.js") +var clone = __webpack_require__(/*! gl-mat4/clone */ "./node_modules/gl-mat4/clone.js") +var determinant = __webpack_require__(/*! gl-mat4/determinant */ "./node_modules/gl-mat4/determinant.js") +var invert = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") +var transpose = __webpack_require__(/*! gl-mat4/transpose */ "./node_modules/gl-mat4/transpose.js") +var vec3 = { + length: __webpack_require__(/*! gl-vec3/length */ "./node_modules/gl-vec3/length.js"), + normalize: __webpack_require__(/*! gl-vec3/normalize */ "./node_modules/gl-vec3/normalize.js"), + dot: __webpack_require__(/*! gl-vec3/dot */ "./node_modules/gl-vec3/dot.js"), + cross: __webpack_require__(/*! gl-vec3/cross */ "./node_modules/gl-vec3/cross.js") +} + +var tmp = create() +var perspectiveMatrix = create() +var tmpVec4 = [0, 0, 0, 0] +var row = [ [0,0,0], [0,0,0], [0,0,0] ] +var pdum3 = [0,0,0] + +module.exports = function decomposeMat4(matrix, translation, scale, skew, perspective, quaternion) { + if (!translation) translation = [0,0,0] + if (!scale) scale = [0,0,0] + if (!skew) skew = [0,0,0] + if (!perspective) perspective = [0,0,0,1] + if (!quaternion) quaternion = [0,0,0,1] + + //normalize, if not possible then bail out early + if (!normalize(tmp, matrix)) + return false + + // perspectiveMatrix is used to solve for perspective, but it also provides + // an easy way to test for singularity of the upper 3x3 component. + clone(perspectiveMatrix, tmp) + + perspectiveMatrix[3] = 0 + perspectiveMatrix[7] = 0 + perspectiveMatrix[11] = 0 + perspectiveMatrix[15] = 1 + + // If the perspectiveMatrix is not invertible, we are also unable to + // decompose, so we'll bail early. Constant taken from SkMatrix44::invert. + if (Math.abs(determinant(perspectiveMatrix) < 1e-8)) + return false + + var a03 = tmp[3], a13 = tmp[7], a23 = tmp[11], + a30 = tmp[12], a31 = tmp[13], a32 = tmp[14], a33 = tmp[15] + + // First, isolate perspective. + if (a03 !== 0 || a13 !== 0 || a23 !== 0) { + tmpVec4[0] = a03 + tmpVec4[1] = a13 + tmpVec4[2] = a23 + tmpVec4[3] = a33 + + // Solve the equation by inverting perspectiveMatrix and multiplying + // rightHandSide by the inverse. + // resuing the perspectiveMatrix here since it's no longer needed + var ret = invert(perspectiveMatrix, perspectiveMatrix) + if (!ret) return false + transpose(perspectiveMatrix, perspectiveMatrix) + + //multiply by transposed inverse perspective matrix, into perspective vec4 + vec4multMat4(perspective, tmpVec4, perspectiveMatrix) + } else { + //no perspective + perspective[0] = perspective[1] = perspective[2] = 0 + perspective[3] = 1 + } + + // Next take care of translation + translation[0] = a30 + translation[1] = a31 + translation[2] = a32 + + // Now get scale and shear. 'row' is a 3 element array of 3 component vectors + mat3from4(row, tmp) + + // Compute X scale factor and normalize first row. + scale[0] = vec3.length(row[0]) + vec3.normalize(row[0], row[0]) + + // Compute XY shear factor and make 2nd row orthogonal to 1st. + skew[0] = vec3.dot(row[0], row[1]) + combine(row[1], row[1], row[0], 1.0, -skew[0]) + + // Now, compute Y scale and normalize 2nd row. + scale[1] = vec3.length(row[1]) + vec3.normalize(row[1], row[1]) + skew[0] /= scale[1] + + // Compute XZ and YZ shears, orthogonalize 3rd row + skew[1] = vec3.dot(row[0], row[2]) + combine(row[2], row[2], row[0], 1.0, -skew[1]) + skew[2] = vec3.dot(row[1], row[2]) + combine(row[2], row[2], row[1], 1.0, -skew[2]) + + // Next, get Z scale and normalize 3rd row. + scale[2] = vec3.length(row[2]) + vec3.normalize(row[2], row[2]) + skew[1] /= scale[2] + skew[2] /= scale[2] + + + // At this point, the matrix (in rows) is orthonormal. + // Check for a coordinate system flip. If the determinant + // is -1, then negate the matrix and the scaling factors. + vec3.cross(pdum3, row[1], row[2]) + if (vec3.dot(row[0], pdum3) < 0) { + for (var i = 0; i < 3; i++) { + scale[i] *= -1; + row[i][0] *= -1 + row[i][1] *= -1 + row[i][2] *= -1 + } + } + + // Now, get the rotations out + quaternion[0] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] - row[1][1] - row[2][2], 0)) + quaternion[1] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] + row[1][1] - row[2][2], 0)) + quaternion[2] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] - row[1][1] + row[2][2], 0)) + quaternion[3] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] + row[1][1] + row[2][2], 0)) + + if (row[2][1] > row[1][2]) + quaternion[0] = -quaternion[0] + if (row[0][2] > row[2][0]) + quaternion[1] = -quaternion[1] + if (row[1][0] > row[0][1]) + quaternion[2] = -quaternion[2] + return true +} + +//will be replaced by gl-vec4 eventually +function vec4multMat4(out, a, m) { + var x = a[0], y = a[1], z = a[2], w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; +} + +//gets upper-left of a 4x4 matrix into a 3x3 of vectors +function mat3from4(out, mat4x4) { + out[0][0] = mat4x4[0] + out[0][1] = mat4x4[1] + out[0][2] = mat4x4[2] + + out[1][0] = mat4x4[4] + out[1][1] = mat4x4[5] + out[1][2] = mat4x4[6] + + out[2][0] = mat4x4[8] + out[2][1] = mat4x4[9] + out[2][2] = mat4x4[10] +} + +function combine(out, a, b, scale1, scale2) { + out[0] = a[0] * scale1 + b[0] * scale2 + out[1] = a[1] * scale1 + b[1] * scale2 + out[2] = a[2] * scale1 + b[2] * scale2 +} + +/***/ }), + +/***/ "./node_modules/mat4-decompose/normalize.js": +/*!**************************************************!*\ + !*** ./node_modules/mat4-decompose/normalize.js ***! + \**************************************************/ +/***/ ((module) => { + +module.exports = function normalize(out, mat) { + var m44 = mat[15] + // Cannot normalize. + if (m44 === 0) + return false + var scale = 1 / m44 + for (var i=0; i<16; i++) + out[i] = mat[i] * scale + return true +} + +/***/ }), + +/***/ "./node_modules/mat4-interpolate/index.js": +/*!************************************************!*\ + !*** ./node_modules/mat4-interpolate/index.js ***! + \************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var lerp = __webpack_require__(/*! gl-vec3/lerp */ "./node_modules/gl-vec3/lerp.js") + +var recompose = __webpack_require__(/*! mat4-recompose */ "./node_modules/mat4-recompose/index.js") +var decompose = __webpack_require__(/*! mat4-decompose */ "./node_modules/mat4-decompose/index.js") +var determinant = __webpack_require__(/*! gl-mat4/determinant */ "./node_modules/gl-mat4/determinant.js") +var slerp = __webpack_require__(/*! quat-slerp */ "./node_modules/quat-slerp/index.js") + +var state0 = state() +var state1 = state() +var tmp = state() + +module.exports = interpolate +function interpolate(out, start, end, alpha) { + if (determinant(start) === 0 || determinant(end) === 0) + return false + + //decompose the start and end matrices into individual components + var r0 = decompose(start, state0.translate, state0.scale, state0.skew, state0.perspective, state0.quaternion) + var r1 = decompose(end, state1.translate, state1.scale, state1.skew, state1.perspective, state1.quaternion) + if (!r0 || !r1) + return false + + + //now lerp/slerp the start and end components into a temporary lerp(tmptranslate, state0.translate, state1.translate, alpha) + lerp(tmp.translate, state0.translate, state1.translate, alpha) + lerp(tmp.skew, state0.skew, state1.skew, alpha) + lerp(tmp.scale, state0.scale, state1.scale, alpha) + lerp(tmp.perspective, state0.perspective, state1.perspective, alpha) + slerp(tmp.quaternion, state0.quaternion, state1.quaternion, alpha) + + //and recompose into our 'out' matrix + recompose(out, tmp.translate, tmp.scale, tmp.skew, tmp.perspective, tmp.quaternion) + return true +} + +function state() { + return { + translate: vec3(), + scale: vec3(1), + skew: vec3(), + perspective: vec4(), + quaternion: vec4() + } +} + +function vec3(n) { + return [n||0,n||0,n||0] +} + +function vec4() { + return [0,0,0,1] +} + +/***/ }), + +/***/ "./node_modules/mat4-recompose/index.js": +/*!**********************************************!*\ + !*** ./node_modules/mat4-recompose/index.js ***! + \**********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/* +Input: translation ; a 3 component vector + scale ; a 3 component vector + skew ; skew factors XY,XZ,YZ represented as a 3 component vector + perspective ; a 4 component vector + quaternion ; a 4 component vector +Output: matrix ; a 4x4 matrix + +From: http://www.w3.org/TR/css3-transforms/#recomposing-to-a-3d-matrix +*/ + +var mat4 = { + identity: __webpack_require__(/*! gl-mat4/identity */ "./node_modules/gl-mat4/identity.js"), + translate: __webpack_require__(/*! gl-mat4/translate */ "./node_modules/gl-mat4/translate.js"), + multiply: __webpack_require__(/*! gl-mat4/multiply */ "./node_modules/gl-mat4/multiply.js"), + create: __webpack_require__(/*! gl-mat4/create */ "./node_modules/gl-mat4/create.js"), + scale: __webpack_require__(/*! gl-mat4/scale */ "./node_modules/gl-mat4/scale.js"), + fromRotationTranslation: __webpack_require__(/*! gl-mat4/fromRotationTranslation */ "./node_modules/gl-mat4/fromRotationTranslation.js") +} + +var rotationMatrix = mat4.create() +var temp = mat4.create() + +module.exports = function recomposeMat4(matrix, translation, scale, skew, perspective, quaternion) { + mat4.identity(matrix) + + //apply translation & rotation + mat4.fromRotationTranslation(matrix, quaternion, translation) + + //apply perspective + matrix[3] = perspective[0] + matrix[7] = perspective[1] + matrix[11] = perspective[2] + matrix[15] = perspective[3] + + // apply skew + // temp is a identity 4x4 matrix initially + mat4.identity(temp) + + if (skew[2] !== 0) { + temp[9] = skew[2] + mat4.multiply(matrix, matrix, temp) + } + + if (skew[1] !== 0) { + temp[9] = 0 + temp[8] = skew[1] + mat4.multiply(matrix, matrix, temp) + } + + if (skew[0] !== 0) { + temp[8] = 0 + temp[4] = skew[0] + mat4.multiply(matrix, matrix, temp) + } + + //apply scale + mat4.scale(matrix, matrix, scale) + return matrix +} + +/***/ }), + +/***/ "./node_modules/matrix-camera-controller/matrix.js": +/*!*********************************************************!*\ + !*** ./node_modules/matrix-camera-controller/matrix.js ***! + \*********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var bsearch = __webpack_require__(/*! binary-search-bounds */ "./node_modules/binary-search-bounds/search-bounds.js") +var m4interp = __webpack_require__(/*! mat4-interpolate */ "./node_modules/mat4-interpolate/index.js") +var invert44 = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") +var rotateX = __webpack_require__(/*! gl-mat4/rotateX */ "./node_modules/gl-mat4/rotateX.js") +var rotateY = __webpack_require__(/*! gl-mat4/rotateY */ "./node_modules/gl-mat4/rotateY.js") +var rotateZ = __webpack_require__(/*! gl-mat4/rotateZ */ "./node_modules/gl-mat4/rotateZ.js") +var lookAt = __webpack_require__(/*! gl-mat4/lookAt */ "./node_modules/gl-mat4/lookAt.js") +var translate = __webpack_require__(/*! gl-mat4/translate */ "./node_modules/gl-mat4/translate.js") +var scale = __webpack_require__(/*! gl-mat4/scale */ "./node_modules/gl-mat4/scale.js") +var normalize = __webpack_require__(/*! gl-vec3/normalize */ "./node_modules/gl-vec3/normalize.js") + +var DEFAULT_CENTER = [0,0,0] + +module.exports = createMatrixCameraController + +function MatrixCameraController(initialMatrix) { + this._components = initialMatrix.slice() + this._time = [0] + this.prevMatrix = initialMatrix.slice() + this.nextMatrix = initialMatrix.slice() + this.computedMatrix = initialMatrix.slice() + this.computedInverse = initialMatrix.slice() + this.computedEye = [0,0,0] + this.computedUp = [0,0,0] + this.computedCenter = [0,0,0] + this.computedRadius = [0] + this._limits = [-Infinity, Infinity] +} + +var proto = MatrixCameraController.prototype + +proto.recalcMatrix = function(t) { + var time = this._time + var tidx = bsearch.le(time, t) + var mat = this.computedMatrix + if(tidx < 0) { + return + } + var comps = this._components + if(tidx === time.length-1) { + var ptr = 16*tidx + for(var i=0; i<16; ++i) { + mat[i] = comps[ptr++] + } + } else { + var dt = (time[tidx+1] - time[tidx]) + var ptr = 16*tidx + var prev = this.prevMatrix + var allEqual = true + for(var i=0; i<16; ++i) { + prev[i] = comps[ptr++] + } + var next = this.nextMatrix + for(var i=0; i<16; ++i) { + next[i] = comps[ptr++] + allEqual = allEqual && (prev[i] === next[i]) + } + if(dt < 1e-6 || allEqual) { + for(var i=0; i<16; ++i) { + mat[i] = prev[i] + } + } else { + m4interp(mat, prev, next, (t - time[tidx])/dt) + } + } + + var up = this.computedUp + up[0] = mat[1] + up[1] = mat[5] + up[2] = mat[9] + normalize(up, up) + + var imat = this.computedInverse + invert44(imat, mat) + var eye = this.computedEye + var w = imat[15] + eye[0] = imat[12]/w + eye[1] = imat[13]/w + eye[2] = imat[14]/w + + var center = this.computedCenter + var radius = Math.exp(this.computedRadius[0]) + for(var i=0; i<3; ++i) { + center[i] = eye[i] - mat[2+4*i] * radius + } +} + +proto.idle = function(t) { + if(t < this.lastT()) { + return + } + var mc = this._components + var ptr = mc.length-16 + for(var i=0; i<16; ++i) { + mc.push(mc[ptr++]) + } + this._time.push(t) +} + +proto.flush = function(t) { + var idx = bsearch.gt(this._time, t) - 2 + if(idx < 0) { + return + } + this._time.splice(0, idx) + this._components.splice(0, 16*idx) +} + +proto.lastT = function() { + return this._time[this._time.length-1] +} + +proto.lookAt = function(t, eye, center, up) { + this.recalcMatrix(t) + eye = eye || this.computedEye + center = center || DEFAULT_CENTER + up = up || this.computedUp + this.setMatrix(t, lookAt(this.computedMatrix, eye, center, up)) + var d2 = 0.0 + for(var i=0; i<3; ++i) { + d2 += Math.pow(center[i] - eye[i], 2) + } + d2 = Math.log(Math.sqrt(d2)) + this.computedRadius[0] = d2 +} + +proto.rotate = function(t, yaw, pitch, roll) { + this.recalcMatrix(t) + var mat = this.computedInverse + if(yaw) rotateY(mat, mat, yaw) + if(pitch) rotateX(mat, mat, pitch) + if(roll) rotateZ(mat, mat, roll) + this.setMatrix(t, invert44(this.computedMatrix, mat)) +} + +var tvec = [0,0,0] + +proto.pan = function(t, dx, dy, dz) { + tvec[0] = -(dx || 0.0) + tvec[1] = -(dy || 0.0) + tvec[2] = -(dz || 0.0) + this.recalcMatrix(t) + var mat = this.computedInverse + translate(mat, mat, tvec) + this.setMatrix(t, invert44(mat, mat)) +} + +proto.translate = function(t, dx, dy, dz) { + tvec[0] = dx || 0.0 + tvec[1] = dy || 0.0 + tvec[2] = dz || 0.0 + this.recalcMatrix(t) + var mat = this.computedMatrix + translate(mat, mat, tvec) + this.setMatrix(t, mat) +} + +proto.setMatrix = function(t, mat) { + if(t < this.lastT()) { + return + } + this._time.push(t) + for(var i=0; i<16; ++i) { + this._components.push(mat[i]) + } +} + +proto.setDistance = function(t, d) { + this.computedRadius[0] = d +} + +proto.setDistanceLimits = function(a,b) { + var lim = this._limits + lim[0] = a + lim[1] = b +} + +proto.getDistanceLimits = function(out) { + var lim = this._limits + if(out) { + out[0] = lim[0] + out[1] = lim[1] + return out + } + return lim +} + +function createMatrixCameraController(options) { + options = options || {} + var matrix = options.matrix || + [1,0,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1] + return new MatrixCameraController(matrix) +} + + +/***/ }), + +/***/ "./node_modules/mouse-change/mouse-listen.js": +/*!***************************************************!*\ + !*** ./node_modules/mouse-change/mouse-listen.js ***! + \***************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = mouseListen + +var mouse = __webpack_require__(/*! mouse-event */ "./node_modules/mouse-event/mouse.js") + +function mouseListen (element, callback) { + if (!callback) { + callback = element + element = window + } + + var buttonState = 0 + var x = 0 + var y = 0 + var mods = { + shift: false, + alt: false, + control: false, + meta: false + } + var attached = false + + function updateMods (ev) { + var changed = false + if ('altKey' in ev) { + changed = changed || ev.altKey !== mods.alt + mods.alt = !!ev.altKey + } + if ('shiftKey' in ev) { + changed = changed || ev.shiftKey !== mods.shift + mods.shift = !!ev.shiftKey + } + if ('ctrlKey' in ev) { + changed = changed || ev.ctrlKey !== mods.control + mods.control = !!ev.ctrlKey + } + if ('metaKey' in ev) { + changed = changed || ev.metaKey !== mods.meta + mods.meta = !!ev.metaKey + } + return changed + } + + function handleEvent (nextButtons, ev) { + var nextX = mouse.x(ev) + var nextY = mouse.y(ev) + if ('buttons' in ev) { + nextButtons = ev.buttons | 0 + } + if (nextButtons !== buttonState || + nextX !== x || + nextY !== y || + updateMods(ev)) { + buttonState = nextButtons | 0 + x = nextX || 0 + y = nextY || 0 + callback && callback(buttonState, x, y, mods) + } + } + + function clearState (ev) { + handleEvent(0, ev) + } + + function handleBlur () { + if (buttonState || + x || + y || + mods.shift || + mods.alt || + mods.meta || + mods.control) { + x = y = 0 + buttonState = 0 + mods.shift = mods.alt = mods.control = mods.meta = false + callback && callback(0, 0, 0, mods) + } + } + + function handleMods (ev) { + if (updateMods(ev)) { + callback && callback(buttonState, x, y, mods) + } + } + + function handleMouseMove (ev) { + if (mouse.buttons(ev) === 0) { + handleEvent(0, ev) + } else { + handleEvent(buttonState, ev) + } + } + + function handleMouseDown (ev) { + handleEvent(buttonState | mouse.buttons(ev), ev) + } + + function handleMouseUp (ev) { + handleEvent(buttonState & ~mouse.buttons(ev), ev) + } + + function attachListeners () { + if (attached) { + return + } + attached = true + + element.addEventListener('mousemove', handleMouseMove) + + element.addEventListener('mousedown', handleMouseDown) + + element.addEventListener('mouseup', handleMouseUp) + + element.addEventListener('mouseleave', clearState) + element.addEventListener('mouseenter', clearState) + element.addEventListener('mouseout', clearState) + element.addEventListener('mouseover', clearState) + + element.addEventListener('blur', handleBlur) + + element.addEventListener('keyup', handleMods) + element.addEventListener('keydown', handleMods) + element.addEventListener('keypress', handleMods) + + if (element !== window) { + window.addEventListener('blur', handleBlur) + + window.addEventListener('keyup', handleMods) + window.addEventListener('keydown', handleMods) + window.addEventListener('keypress', handleMods) + } + } + + function detachListeners () { + if (!attached) { + return + } + attached = false + + element.removeEventListener('mousemove', handleMouseMove) + + element.removeEventListener('mousedown', handleMouseDown) + + element.removeEventListener('mouseup', handleMouseUp) + + element.removeEventListener('mouseleave', clearState) + element.removeEventListener('mouseenter', clearState) + element.removeEventListener('mouseout', clearState) + element.removeEventListener('mouseover', clearState) + + element.removeEventListener('blur', handleBlur) + + element.removeEventListener('keyup', handleMods) + element.removeEventListener('keydown', handleMods) + element.removeEventListener('keypress', handleMods) + + if (element !== window) { + window.removeEventListener('blur', handleBlur) + + window.removeEventListener('keyup', handleMods) + window.removeEventListener('keydown', handleMods) + window.removeEventListener('keypress', handleMods) + } + } + + // Attach listeners + attachListeners() + + var result = { + element: element + } + + Object.defineProperties(result, { + enabled: { + get: function () { return attached }, + set: function (f) { + if (f) { + attachListeners() + } else { + detachListeners() + } + }, + enumerable: true + }, + buttons: { + get: function () { return buttonState }, + enumerable: true + }, + x: { + get: function () { return x }, + enumerable: true + }, + y: { + get: function () { return y }, + enumerable: true + }, + mods: { + get: function () { return mods }, + enumerable: true + } + }) + + return result +} + + +/***/ }), + +/***/ "./node_modules/mouse-event-offset/index.js": +/*!**************************************************!*\ + !*** ./node_modules/mouse-event-offset/index.js ***! + \**************************************************/ +/***/ ((module) => { + +var rootPosition = { left: 0, top: 0 } + +module.exports = mouseEventOffset +function mouseEventOffset (ev, target, out) { + target = target || ev.currentTarget || ev.srcElement + if (!Array.isArray(out)) { + out = [ 0, 0 ] + } + var cx = ev.clientX || 0 + var cy = ev.clientY || 0 + var rect = getBoundingClientOffset(target) + out[0] = cx - rect.left + out[1] = cy - rect.top + return out +} + +function getBoundingClientOffset (element) { + if (element === window || + element === document || + element === document.body) { + return rootPosition + } else { + return element.getBoundingClientRect() + } +} + + +/***/ }), + +/***/ "./node_modules/mouse-event/mouse.js": +/*!*******************************************!*\ + !*** ./node_modules/mouse-event/mouse.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +function mouseButtons(ev) { + if(typeof ev === 'object') { + if('buttons' in ev) { + return ev.buttons + } else if('which' in ev) { + var b = ev.which + if(b === 2) { + return 4 + } else if(b === 3) { + return 2 + } else if(b > 0) { + return 1<<(b-1) + } + } else if('button' in ev) { + var b = ev.button + if(b === 1) { + return 4 + } else if(b === 2) { + return 2 + } else if(b >= 0) { + return 1< { + +"use strict"; + + +var toPX = __webpack_require__(/*! to-px */ "./node_modules/to-px/browser.js") + +module.exports = mouseWheelListen + +function mouseWheelListen(element, callback, noScroll) { + if(typeof element === 'function') { + noScroll = !!callback + callback = element + element = window + } + var lineHeight = toPX('ex', element) + var listener = function(ev) { + if(noScroll) { + ev.preventDefault() + } + var dx = ev.deltaX || 0 + var dy = ev.deltaY || 0 + var dz = ev.deltaZ || 0 + var mode = ev.deltaMode + var scale = 1 + switch(mode) { + case 1: + scale = lineHeight + break + case 2: + scale = window.innerHeight + break + } + dx *= scale + dy *= scale + dz *= scale + if(dx || dy || dz) { + return callback(dx, dy, dz, ev) + } + } + element.addEventListener('wheel', listener) + return listener +} + + +/***/ }), + +/***/ "./node_modules/orbit-camera-controller/lib/quatFromFrame.js": +/*!*******************************************************************!*\ + !*** ./node_modules/orbit-camera-controller/lib/quatFromFrame.js ***! + \*******************************************************************/ +/***/ ((module) => { + +"use strict"; + + +module.exports = quatFromFrame + +function quatFromFrame( + out, + rx, ry, rz, + ux, uy, uz, + fx, fy, fz) { + var tr = rx + uy + fz + if(l > 0) { + var l = Math.sqrt(tr + 1.0) + out[0] = 0.5 * (uz - fy) / l + out[1] = 0.5 * (fx - rz) / l + out[2] = 0.5 * (ry - uy) / l + out[3] = 0.5 * l + } else { + var tf = Math.max(rx, uy, fz) + var l = Math.sqrt(2 * tf - tr + 1.0) + if(rx >= tf) { + //x y z order + out[0] = 0.5 * l + out[1] = 0.5 * (ux + ry) / l + out[2] = 0.5 * (fx + rz) / l + out[3] = 0.5 * (uz - fy) / l + } else if(uy >= tf) { + //y z x order + out[0] = 0.5 * (ry + ux) / l + out[1] = 0.5 * l + out[2] = 0.5 * (fy + uz) / l + out[3] = 0.5 * (fx - rz) / l + } else { + //z x y order + out[0] = 0.5 * (rz + fx) / l + out[1] = 0.5 * (uz + fy) / l + out[2] = 0.5 * l + out[3] = 0.5 * (ry - ux) / l + } + } + return out +} + +/***/ }), + +/***/ "./node_modules/orbit-camera-controller/orbit.js": +/*!*******************************************************!*\ + !*** ./node_modules/orbit-camera-controller/orbit.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = createOrbitController + +var filterVector = __webpack_require__(/*! filtered-vector */ "./node_modules/filtered-vector/fvec.js") +var lookAt = __webpack_require__(/*! gl-mat4/lookAt */ "./node_modules/gl-mat4/lookAt.js") +var mat4FromQuat = __webpack_require__(/*! gl-mat4/fromQuat */ "./node_modules/gl-mat4/fromQuat.js") +var invert44 = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") +var quatFromFrame = __webpack_require__(/*! ./lib/quatFromFrame */ "./node_modules/orbit-camera-controller/lib/quatFromFrame.js") + +function len3(x,y,z) { + return Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2)) +} + +function len4(w,x,y,z) { + return Math.sqrt(Math.pow(w,2) + Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2)) +} + +function normalize4(out, a) { + var ax = a[0] + var ay = a[1] + var az = a[2] + var aw = a[3] + var al = len4(ax, ay, az, aw) + if(al > 1e-6) { + out[0] = ax/al + out[1] = ay/al + out[2] = az/al + out[3] = aw/al + } else { + out[0] = out[1] = out[2] = 0.0 + out[3] = 1.0 + } +} + +function OrbitCameraController(initQuat, initCenter, initRadius) { + this.radius = filterVector([initRadius]) + this.center = filterVector(initCenter) + this.rotation = filterVector(initQuat) + + this.computedRadius = this.radius.curve(0) + this.computedCenter = this.center.curve(0) + this.computedRotation = this.rotation.curve(0) + this.computedUp = [0.1,0,0] + this.computedEye = [0.1,0,0] + this.computedMatrix = [0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + + this.recalcMatrix(0) +} + +var proto = OrbitCameraController.prototype + +proto.lastT = function() { + return Math.max( + this.radius.lastT(), + this.center.lastT(), + this.rotation.lastT()) +} + +proto.recalcMatrix = function(t) { + this.radius.curve(t) + this.center.curve(t) + this.rotation.curve(t) + + var quat = this.computedRotation + normalize4(quat, quat) + + var mat = this.computedMatrix + mat4FromQuat(mat, quat) + + var center = this.computedCenter + var eye = this.computedEye + var up = this.computedUp + var radius = Math.exp(this.computedRadius[0]) + + eye[0] = center[0] + radius * mat[2] + eye[1] = center[1] + radius * mat[6] + eye[2] = center[2] + radius * mat[10] + up[0] = mat[1] + up[1] = mat[5] + up[2] = mat[9] + + for(var i=0; i<3; ++i) { + var rr = 0.0 + for(var j=0; j<3; ++j) { + rr += mat[i+4*j] * eye[j] + } + mat[12+i] = -rr + } +} + +proto.getMatrix = function(t, result) { + this.recalcMatrix(t) + var m = this.computedMatrix + if(result) { + for(var i=0; i<16; ++i) { + result[i] = m[i] + } + return result + } + return m +} + +proto.idle = function(t) { + this.center.idle(t) + this.radius.idle(t) + this.rotation.idle(t) +} + +proto.flush = function(t) { + this.center.flush(t) + this.radius.flush(t) + this.rotation.flush(t) +} + +proto.pan = function(t, dx, dy, dz) { + dx = dx || 0.0 + dy = dy || 0.0 + dz = dz || 0.0 + + this.recalcMatrix(t) + var mat = this.computedMatrix + + var ux = mat[1] + var uy = mat[5] + var uz = mat[9] + var ul = len3(ux, uy, uz) + ux /= ul + uy /= ul + uz /= ul + + var rx = mat[0] + var ry = mat[4] + var rz = mat[8] + var ru = rx * ux + ry * uy + rz * uz + rx -= ux * ru + ry -= uy * ru + rz -= uz * ru + var rl = len3(rx, ry, rz) + rx /= rl + ry /= rl + rz /= rl + + var fx = mat[2] + var fy = mat[6] + var fz = mat[10] + var fu = fx * ux + fy * uy + fz * uz + var fr = fx * rx + fy * ry + fz * rz + fx -= fu * ux + fr * rx + fy -= fu * uy + fr * ry + fz -= fu * uz + fr * rz + var fl = len3(fx, fy, fz) + fx /= fl + fy /= fl + fz /= fl + + var vx = rx * dx + ux * dy + var vy = ry * dx + uy * dy + var vz = rz * dx + uz * dy + + this.center.move(t, vx, vy, vz) + + //Update z-component of radius + var radius = Math.exp(this.computedRadius[0]) + radius = Math.max(1e-4, radius + dz) + this.radius.set(t, Math.log(radius)) +} + +proto.rotate = function(t, dx, dy, dz) { + this.recalcMatrix(t) + + dx = dx||0.0 + dy = dy||0.0 + + var mat = this.computedMatrix + + var rx = mat[0] + var ry = mat[4] + var rz = mat[8] + + var ux = mat[1] + var uy = mat[5] + var uz = mat[9] + + var fx = mat[2] + var fy = mat[6] + var fz = mat[10] + + var qx = dx * rx + dy * ux + var qy = dx * ry + dy * uy + var qz = dx * rz + dy * uz + + var bx = -(fy * qz - fz * qy) + var by = -(fz * qx - fx * qz) + var bz = -(fx * qy - fy * qx) + var bw = Math.sqrt(Math.max(0.0, 1.0 - Math.pow(bx,2) - Math.pow(by,2) - Math.pow(bz,2))) + var bl = len4(bx, by, bz, bw) + if(bl > 1e-6) { + bx /= bl + by /= bl + bz /= bl + bw /= bl + } else { + bx = by = bz = 0.0 + bw = 1.0 + } + + var rotation = this.computedRotation + var ax = rotation[0] + var ay = rotation[1] + var az = rotation[2] + var aw = rotation[3] + + var cx = ax*bw + aw*bx + ay*bz - az*by + var cy = ay*bw + aw*by + az*bx - ax*bz + var cz = az*bw + aw*bz + ax*by - ay*bx + var cw = aw*bw - ax*bx - ay*by - az*bz + + //Apply roll + if(dz) { + bx = fx + by = fy + bz = fz + var s = Math.sin(dz) / len3(bx, by, bz) + bx *= s + by *= s + bz *= s + bw = Math.cos(dx) + cx = cx*bw + cw*bx + cy*bz - cz*by + cy = cy*bw + cw*by + cz*bx - cx*bz + cz = cz*bw + cw*bz + cx*by - cy*bx + cw = cw*bw - cx*bx - cy*by - cz*bz + } + + var cl = len4(cx, cy, cz, cw) + if(cl > 1e-6) { + cx /= cl + cy /= cl + cz /= cl + cw /= cl + } else { + cx = cy = cz = 0.0 + cw = 1.0 + } + + this.rotation.set(t, cx, cy, cz, cw) +} + +proto.lookAt = function(t, eye, center, up) { + this.recalcMatrix(t) + + center = center || this.computedCenter + eye = eye || this.computedEye + up = up || this.computedUp + + var mat = this.computedMatrix + lookAt(mat, eye, center, up) + + var rotation = this.computedRotation + quatFromFrame(rotation, + mat[0], mat[1], mat[2], + mat[4], mat[5], mat[6], + mat[8], mat[9], mat[10]) + normalize4(rotation, rotation) + this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3]) + + var fl = 0.0 + for(var i=0; i<3; ++i) { + fl += Math.pow(center[i] - eye[i], 2) + } + this.radius.set(t, 0.5 * Math.log(Math.max(fl, 1e-6))) + + this.center.set(t, center[0], center[1], center[2]) +} + +proto.translate = function(t, dx, dy, dz) { + this.center.move(t, + dx||0.0, + dy||0.0, + dz||0.0) +} + +proto.setMatrix = function(t, matrix) { + + var rotation = this.computedRotation + quatFromFrame(rotation, + matrix[0], matrix[1], matrix[2], + matrix[4], matrix[5], matrix[6], + matrix[8], matrix[9], matrix[10]) + normalize4(rotation, rotation) + this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3]) + + var mat = this.computedMatrix + invert44(mat, matrix) + var w = mat[15] + if(Math.abs(w) > 1e-6) { + var cx = mat[12]/w + var cy = mat[13]/w + var cz = mat[14]/w + + this.recalcMatrix(t) + var r = Math.exp(this.computedRadius[0]) + this.center.set(t, cx-mat[2]*r, cy-mat[6]*r, cz-mat[10]*r) + this.radius.idle(t) + } else { + this.center.idle(t) + this.radius.idle(t) + } +} + +proto.setDistance = function(t, d) { + if(d > 0) { + this.radius.set(t, Math.log(d)) + } +} + +proto.setDistanceLimits = function(lo, hi) { + if(lo > 0) { + lo = Math.log(lo) + } else { + lo = -Infinity + } + if(hi > 0) { + hi = Math.log(hi) + } else { + hi = Infinity + } + hi = Math.max(hi, lo) + this.radius.bounds[0][0] = lo + this.radius.bounds[1][0] = hi +} + +proto.getDistanceLimits = function(out) { + var bounds = this.radius.bounds + if(out) { + out[0] = Math.exp(bounds[0][0]) + out[1] = Math.exp(bounds[1][0]) + return out + } + return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ] +} + +proto.toJSON = function() { + this.recalcMatrix(this.lastT()) + return { + center: this.computedCenter.slice(), + rotation: this.computedRotation.slice(), + distance: Math.log(this.computedRadius[0]), + zoomMin: this.radius.bounds[0][0], + zoomMax: this.radius.bounds[1][0] + } +} + +proto.fromJSON = function(options) { + var t = this.lastT() + var c = options.center + if(c) { + this.center.set(t, c[0], c[1], c[2]) + } + var r = options.rotation + if(r) { + this.rotation.set(t, r[0], r[1], r[2], r[3]) + } + var d = options.distance + if(d && d > 0) { + this.radius.set(t, Math.log(d)) + } + this.setDistanceLimits(options.zoomMin, options.zoomMax) +} + +function createOrbitController(options) { + options = options || {} + var center = options.center || [0,0,0] + var rotation = options.rotation || [0,0,0,1] + var radius = options.radius || 1.0 + + center = [].slice.call(center, 0, 3) + rotation = [].slice.call(rotation, 0, 4) + normalize4(rotation, rotation) + + var result = new OrbitCameraController( + rotation, + center, + Math.log(radius)) + + result.setDistanceLimits(options.zoomMin, options.zoomMax) + + if('eye' in options || 'up' in options) { + result.lookAt(0, options.eye, options.center, options.up) + } + + return result +} + +/***/ }), + +/***/ "./node_modules/parse-unit/index.js": +/*!******************************************!*\ + !*** ./node_modules/parse-unit/index.js ***! + \******************************************/ +/***/ ((module) => { + +module.exports = function parseUnit(str, out) { + if (!out) + out = [ 0, '' ] + + str = String(str) + var num = parseFloat(str, 10) + out[0] = num + out[1] = str.match(/[\d.\-\+]*\s*(.*)/)[1] || '' + return out +} + +/***/ }), + +/***/ "./node_modules/quat-slerp/index.js": +/*!******************************************!*\ + !*** ./node_modules/quat-slerp/index.js ***! + \******************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = __webpack_require__(/*! gl-quat/slerp */ "./node_modules/gl-quat/slerp.js") + +/***/ }), + +/***/ "./node_modules/right-now/browser.js": +/*!*******************************************!*\ + !*** ./node_modules/right-now/browser.js ***! + \*******************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = + __webpack_require__.g.performance && + __webpack_require__.g.performance.now ? function now() { + return performance.now() + } : Date.now || function now() { + return +new Date + } + + +/***/ }), + +/***/ "./node_modules/stats-js/build/stats.min.js": +/*!**************************************************!*\ + !*** ./node_modules/stats-js/build/stats.min.js ***! + \**************************************************/ +/***/ (function(module) { + +!function(e,t){ true?module.exports=t():0}(this,function(){"use strict";var c=function(){var n=0,l=document.createElement("div");function e(e){return l.appendChild(e.dom),e}function t(e){for(var t=0;t { + +"use strict"; + + +var parseUnit = __webpack_require__(/*! parse-unit */ "./node_modules/parse-unit/index.js") + +module.exports = toPX + +var PIXELS_PER_INCH = getSizeBrutal('in', document.body) // 96 + + +function getPropertyInPX(element, prop) { + var parts = parseUnit(getComputedStyle(element).getPropertyValue(prop)) + return parts[0] * toPX(parts[1], element) +} + +//This brutal hack is needed +function getSizeBrutal(unit, element) { + var testDIV = document.createElement('div') + testDIV.style['height'] = '128' + unit + element.appendChild(testDIV) + var size = getPropertyInPX(testDIV, 'height') / 128 + element.removeChild(testDIV) + return size +} + +function toPX(str, element) { + if (!str) return null + + element = element || document.body + str = (str + '' || 'px').trim().toLowerCase() + if(element === window || element === document) { + element = document.body + } + + switch(str) { + case '%': //Ambiguous, not sure if we should use width or height + return element.clientHeight / 100.0 + case 'ch': + case 'ex': + return getSizeBrutal(str, element) + case 'em': + return getPropertyInPX(element, 'font-size') + case 'rem': + return getPropertyInPX(document.body, 'font-size') + case 'vw': + return window.innerWidth/100 + case 'vh': + return window.innerHeight/100 + case 'vmin': + return Math.min(window.innerWidth, window.innerHeight) / 100 + case 'vmax': + return Math.max(window.innerWidth, window.innerHeight) / 100 + case 'in': + return PIXELS_PER_INCH + case 'cm': + return PIXELS_PER_INCH / 2.54 + case 'mm': + return PIXELS_PER_INCH / 25.4 + case 'pt': + return PIXELS_PER_INCH / 72 + case 'pc': + return PIXELS_PER_INCH / 6 + case 'px': + return 1 + } + + // detect number of units + var parts = parseUnit(str) + if (!isNaN(parts[0]) && parts[1]) { + var px = toPX(parts[1], element) + return typeof px === 'number' ? parts[0] * px : null + } + + return null +} + + +/***/ }), + +/***/ "./src/Camera.ts": +/*!***********************!*\ + !*** ./src/Camera.ts ***! + \***********************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/mat4.js"); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec3.js"); +var CameraControls = __webpack_require__(/*! 3d-view-controls */ "./node_modules/3d-view-controls/camera.js"); + +class Camera { + constructor(position, target) { + this.projectionMatrix = gl_matrix__WEBPACK_IMPORTED_MODULE_0__.create(); + this.viewMatrix = gl_matrix__WEBPACK_IMPORTED_MODULE_0__.create(); + this.fovy = 45; + this.aspectRatio = 1; + this.near = 0.1; + this.far = 1000; + this.position = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); + this.direction = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); + this.target = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); + this.up = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); + this.controls = CameraControls(document.getElementById('canvas'), { + eye: position, + center: target, + }); + gl_matrix__WEBPACK_IMPORTED_MODULE_1__.add(this.target, this.position, this.direction); + gl_matrix__WEBPACK_IMPORTED_MODULE_0__.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); + } + setAspectRatio(aspectRatio) { + this.aspectRatio = aspectRatio; + } + updateProjectionMatrix() { + gl_matrix__WEBPACK_IMPORTED_MODULE_0__.perspective(this.projectionMatrix, this.fovy, this.aspectRatio, this.near, this.far); + } + update() { + this.controls.tick(); + gl_matrix__WEBPACK_IMPORTED_MODULE_1__.add(this.target, this.position, this.direction); + gl_matrix__WEBPACK_IMPORTED_MODULE_0__.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); + } +} +; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Camera); + + +/***/ }), + +/***/ "./src/geometry/Icosphere.ts": +/*!***********************************!*\ + !*** ./src/geometry/Icosphere.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec4.js"); +/* harmony import */ var _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../rendering/gl/Drawable */ "./src/rendering/gl/Drawable.ts"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "./src/globals.ts"); + + + +class Icosphere extends _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(center, radius, subdivisions) { + super(); // Call the constructor of the super class. This is required. + this.radius = radius; + this.subdivisions = subdivisions; + this.center = gl_matrix__WEBPACK_IMPORTED_MODULE_2__.fromValues(center[0], center[1], center[2], 1); + } + create() { + const X = 0.525731112119133606; + const Z = 0.850650808352039932; + const N = 0; + let maxIndexCount = 20 * Math.pow(4, this.subdivisions); + let maxVertexCount = 10 * Math.pow(4, this.subdivisions) + 2; + // Create buffers to back geometry data + // Index data will ping pong back and forth between buffer0 and buffer1 during creation + // All data will be in buffer0 at the end + const buffer0 = new ArrayBuffer(maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT); + const buffer1 = new ArrayBuffer(maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT); + const buffers = [buffer0, buffer1]; + let b = 0; + const indexByteOffset = 0; + const vertexByteOffset = maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT; + const normalByteOffset = vertexByteOffset; + const positionByteOffset = vertexByteOffset + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT; + // Create 3-uint buffer views into the backing buffer to represent triangles + // The C++ analogy to this would be something like: + // triangles[i] = reinterpret_cast*>(&buffer[offset]); + let triangles = new Array(20); + let nextTriangles = new Array(); + for (let i = 0; i < 20; ++i) { + triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + } + // Create 3-float buffer views into the backing buffer to represent positions + let vertices = new Array(12); + for (let i = 0; i < 12; ++i) { + vertices[i] = new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + } + // Initialize normals for a 20-sided icosahedron + vertices[0].set([-X, N, Z, 0]); + vertices[1].set([X, N, Z, 0]); + vertices[2].set([-X, N, -Z, 0]); + vertices[3].set([X, N, -Z, 0]); + vertices[4].set([N, Z, X, 0]); + vertices[5].set([N, Z, -X, 0]); + vertices[6].set([N, -Z, X, 0]); + vertices[7].set([N, -Z, -X, 0]); + vertices[8].set([Z, X, N, 0]); + vertices[9].set([-Z, X, N, 0]); + vertices[10].set([Z, -X, N, 0]); + vertices[11].set([-Z, -X, N, 0]); + // Initialize indices for a 20-sided icosahedron + triangles[0].set([0, 4, 1]); + triangles[1].set([0, 9, 4]); + triangles[2].set([9, 5, 4]); + triangles[3].set([4, 5, 8]); + triangles[4].set([4, 8, 1]); + triangles[5].set([8, 10, 1]); + triangles[6].set([8, 3, 10]); + triangles[7].set([5, 3, 8]); + triangles[8].set([5, 2, 3]); + triangles[9].set([2, 7, 3]); + triangles[10].set([7, 10, 3]); + triangles[11].set([7, 6, 10]); + triangles[12].set([7, 11, 6]); + triangles[13].set([11, 0, 6]); + triangles[14].set([0, 1, 6]); + triangles[15].set([6, 1, 10]); + triangles[16].set([9, 0, 11]); + triangles[17].set([9, 11, 2]); + triangles[18].set([9, 2, 5]); + triangles[19].set([7, 2, 11]); + // This loop subdivides the icosahedron + for (let s = 0; s < this.subdivisions; ++s) { + b = 1 - b; + nextTriangles.length = triangles.length * 4; + let triangleIdx = 0; + // edgeMap maps a pair of vertex indices to a vertex index at their midpoint + // The function `mid` will get that midpoint vertex if it has already been created + // or it will create the vertex and add it to the map + let edgeMap = new Map(); + function mid(v0, v1) { + let key = [v0, v1].sort().join('_'); + if (!edgeMap.has(key)) { + let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + gl_matrix__WEBPACK_IMPORTED_MODULE_2__.add(midpoint, vertices[v0], vertices[v1]); + gl_matrix__WEBPACK_IMPORTED_MODULE_2__.normalize(midpoint, midpoint); + edgeMap.set(key, vertices.length); + vertices.push(midpoint); + } + return edgeMap.get(key); + } + for (let t = 0; t < triangles.length; ++t) { + let v0 = triangles[t][0]; + let v1 = triangles[t][1]; + let v2 = triangles[t][2]; + let v3 = mid(v0, v1); // Get or create a vertex between these two vertices + let v4 = mid(v1, v2); + let v5 = mid(v2, v0); + let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let triangleOffset = nextTriangles.length; + t0.set([v0, v3, v5]); + t1.set([v3, v4, v5]); + t2.set([v3, v1, v4]); + t3.set([v5, v4, v2]); + } + // swap buffers + let temp = triangles; + triangles = nextTriangles; + nextTriangles = temp; + } + if (b === 1) { + // if indices did not end up in buffer0, copy them there now + let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length); + let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length); + temp0.set(temp1); + } + // Populate one position for each normal + for (let i = 0; i < vertices.length; ++i) { + let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + gl_matrix__WEBPACK_IMPORTED_MODULE_2__.scaleAndAdd(pos, this.center, vertices[i], this.radius); + } + this.buffer = buffer0; + this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3); + this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4); + this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4); + this.generateIdx(); + this.generatePos(); + this.generateNor(); + this.count = this.indices.length; + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.indices, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufNor); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.normals, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufPos); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.positions, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); + console.log(`Created icosphere with ${vertices.length} vertices`); + } +} +; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Icosphere); + + +/***/ }), + +/***/ "./src/geometry/Square.ts": +/*!********************************!*\ + !*** ./src/geometry/Square.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec4.js"); +/* harmony import */ var _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../rendering/gl/Drawable */ "./src/rendering/gl/Drawable.ts"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "./src/globals.ts"); + + + +class Square extends _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__["default"] { + constructor(center) { + super(); // Call the constructor of the super class. This is required. + this.center = gl_matrix__WEBPACK_IMPORTED_MODULE_2__.fromValues(center[0], center[1], center[2], 1); + } + create() { + this.indices = new Uint32Array([0, 1, 2, + 0, 2, 3]); + this.normals = new Float32Array([0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0]); + this.positions = new Float32Array([-1, -1, 0, 1, + 1, -1, 0, 1, + 1, 1, 0, 1, + -1, 1, 0, 1]); + this.generateIdx(); + this.generatePos(); + this.generateNor(); + this.count = this.indices.length; + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.indices, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufNor); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.normals, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufPos); + _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.positions, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); + console.log(`Created square`); + } +} +; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Square); + + +/***/ }), + +/***/ "./src/globals.ts": +/*!************************!*\ + !*** ./src/globals.ts ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "gl": () => (/* binding */ gl), +/* harmony export */ "setGL": () => (/* binding */ setGL) +/* harmony export */ }); +var gl; +function setGL(_gl) { + gl = _gl; +} + + +/***/ }), + +/***/ "./src/rendering/gl/Drawable.ts": +/*!**************************************!*\ + !*** ./src/rendering/gl/Drawable.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../globals */ "./src/globals.ts"); + +class Drawable { + constructor() { + this.count = 0; + this.idxBound = false; + this.posBound = false; + this.norBound = false; + } + destory() { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.deleteBuffer(this.bufIdx); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.deleteBuffer(this.bufPos); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.deleteBuffer(this.bufNor); + } + generateIdx() { + this.idxBound = true; + this.bufIdx = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createBuffer(); + } + generatePos() { + this.posBound = true; + this.bufPos = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createBuffer(); + } + generateNor() { + this.norBound = true; + this.bufNor = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createBuffer(); + } + bindIdx() { + if (this.idxBound) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + } + return this.idxBound; + } + bindPos() { + if (this.posBound) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.ARRAY_BUFFER, this.bufPos); + } + return this.posBound; + } + bindNor() { + if (this.norBound) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.ARRAY_BUFFER, this.bufNor); + } + return this.norBound; + } + elemCount() { + return this.count; + } + drawMode() { + return _globals__WEBPACK_IMPORTED_MODULE_0__.gl.TRIANGLES; + } +} +; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Drawable); + + +/***/ }), + +/***/ "./src/rendering/gl/OpenGLRenderer.ts": +/*!********************************************!*\ + !*** ./src/rendering/gl/OpenGLRenderer.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/mat4.js"); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec4.js"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../globals */ "./src/globals.ts"); + + +// In this file, `gl` is accessible because it is imported above +class OpenGLRenderer { + constructor(canvas) { + this.canvas = canvas; + } + setClearColor(r, g, b, a) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.clearColor(r, g, b, a); + } + setSize(width, height) { + this.canvas.width = width; + this.canvas.height = height; + } + clear() { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.clear(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.COLOR_BUFFER_BIT | _globals__WEBPACK_IMPORTED_MODULE_0__.gl.DEPTH_BUFFER_BIT); + } + render(camera, prog, drawables) { + let model = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); + let viewProj = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); + let color = gl_matrix__WEBPACK_IMPORTED_MODULE_2__.fromValues(1, 0, 0, 1); + gl_matrix__WEBPACK_IMPORTED_MODULE_1__.identity(model); + gl_matrix__WEBPACK_IMPORTED_MODULE_1__.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); + prog.setModelMatrix(model); + prog.setViewProjMatrix(viewProj); + prog.setGeometryColor(color); + for (let drawable of drawables) { + prog.draw(drawable); + } + } +} +; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OpenGLRenderer); + + +/***/ }), + +/***/ "./src/rendering/gl/ShaderProgram.ts": +/*!*******************************************!*\ + !*** ./src/rendering/gl/ShaderProgram.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Shader": () => (/* binding */ Shader), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/mat4.js"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../globals */ "./src/globals.ts"); + + +var activeProgram = null; +class Shader { + constructor(type, source) { + this.shader = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createShader(type); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.shaderSource(this.shader, source); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.compileShader(this.shader); + if (!_globals__WEBPACK_IMPORTED_MODULE_0__.gl.getShaderParameter(this.shader, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.COMPILE_STATUS)) { + throw _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getShaderInfoLog(this.shader); + } + } +} +; +class ShaderProgram { + constructor(shaders) { + this.prog = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createProgram(); + for (let shader of shaders) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.attachShader(this.prog, shader.shader); + } + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.linkProgram(this.prog); + if (!_globals__WEBPACK_IMPORTED_MODULE_0__.gl.getProgramParameter(this.prog, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.LINK_STATUS)) { + throw _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getProgramInfoLog(this.prog); + } + this.attrPos = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getAttribLocation(this.prog, "vs_Pos"); + this.attrNor = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getAttribLocation(this.prog, "vs_Nor"); + this.attrCol = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getAttribLocation(this.prog, "vs_Col"); + this.unifModel = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_Model"); + this.unifModelInvTr = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_ModelInvTr"); + this.unifViewProj = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_ViewProj"); + this.unifColor = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_Color"); + } + use() { + if (activeProgram !== this.prog) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.useProgram(this.prog); + activeProgram = this.prog; + } + } + setModelMatrix(model) { + this.use(); + if (this.unifModel !== -1) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniformMatrix4fv(this.unifModel, false, model); + } + if (this.unifModelInvTr !== -1) { + let modelinvtr = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); + gl_matrix__WEBPACK_IMPORTED_MODULE_1__.transpose(modelinvtr, model); + gl_matrix__WEBPACK_IMPORTED_MODULE_1__.invert(modelinvtr, modelinvtr); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); + } + } + setViewProjMatrix(vp) { + this.use(); + if (this.unifViewProj !== -1) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniformMatrix4fv(this.unifViewProj, false, vp); + } + } + setGeometryColor(color) { + this.use(); + if (this.unifColor !== -1) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniform4fv(this.unifColor, color); + } + } + draw(d) { + this.use(); + if (this.attrPos != -1 && d.bindPos()) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.enableVertexAttribArray(this.attrPos); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.vertexAttribPointer(this.attrPos, 4, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.FLOAT, false, 0, 0); + } + if (this.attrNor != -1 && d.bindNor()) { + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.enableVertexAttribArray(this.attrNor); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.vertexAttribPointer(this.attrNor, 4, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.FLOAT, false, 0, 0); + } + d.bindIdx(); + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.drawElements(d.drawMode(), d.elemCount(), _globals__WEBPACK_IMPORTED_MODULE_0__.gl.UNSIGNED_INT, 0); + if (this.attrPos != -1) + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.disableVertexAttribArray(this.attrPos); + if (this.attrNor != -1) + _globals__WEBPACK_IMPORTED_MODULE_0__.gl.disableVertexAttribArray(this.attrNor); + } +} +; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShaderProgram); + + +/***/ }), + +/***/ "./node_modules/turntable-camera-controller/turntable.js": +/*!***************************************************************!*\ + !*** ./node_modules/turntable-camera-controller/turntable.js ***! + \***************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = createTurntableController + +var filterVector = __webpack_require__(/*! filtered-vector */ "./node_modules/filtered-vector/fvec.js") +var invert44 = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") +var rotateM = __webpack_require__(/*! gl-mat4/rotate */ "./node_modules/gl-mat4/rotate.js") +var cross = __webpack_require__(/*! gl-vec3/cross */ "./node_modules/gl-vec3/cross.js") +var normalize3 = __webpack_require__(/*! gl-vec3/normalize */ "./node_modules/gl-vec3/normalize.js") +var dot3 = __webpack_require__(/*! gl-vec3/dot */ "./node_modules/gl-vec3/dot.js") + +function len3(x, y, z) { + return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)) +} + +function clamp1(x) { + return Math.min(1.0, Math.max(-1.0, x)) +} + +function findOrthoPair(v) { + var vx = Math.abs(v[0]) + var vy = Math.abs(v[1]) + var vz = Math.abs(v[2]) + + var u = [0,0,0] + if(vx > Math.max(vy, vz)) { + u[2] = 1 + } else if(vy > Math.max(vx, vz)) { + u[0] = 1 + } else { + u[1] = 1 + } + + var vv = 0 + var uv = 0 + for(var i=0; i<3; ++i ) { + vv += v[i] * v[i] + uv += u[i] * v[i] + } + for(var i=0; i<3; ++i) { + u[i] -= (uv / vv) * v[i] + } + normalize3(u, u) + return u +} + +function TurntableController(zoomMin, zoomMax, center, up, right, radius, theta, phi) { + this.center = filterVector(center) + this.up = filterVector(up) + this.right = filterVector(right) + this.radius = filterVector([radius]) + this.angle = filterVector([theta, phi]) + this.angle.bounds = [[-Infinity,-Math.PI/2], [Infinity,Math.PI/2]] + this.setDistanceLimits(zoomMin, zoomMax) + + this.computedCenter = this.center.curve(0) + this.computedUp = this.up.curve(0) + this.computedRight = this.right.curve(0) + this.computedRadius = this.radius.curve(0) + this.computedAngle = this.angle.curve(0) + this.computedToward = [0,0,0] + this.computedEye = [0,0,0] + this.computedMatrix = new Array(16) + for(var i=0; i<16; ++i) { + this.computedMatrix[i] = 0.5 + } + + this.recalcMatrix(0) +} + +var proto = TurntableController.prototype + +proto.setDistanceLimits = function(minDist, maxDist) { + if(minDist > 0) { + minDist = Math.log(minDist) + } else { + minDist = -Infinity + } + if(maxDist > 0) { + maxDist = Math.log(maxDist) + } else { + maxDist = Infinity + } + maxDist = Math.max(maxDist, minDist) + this.radius.bounds[0][0] = minDist + this.radius.bounds[1][0] = maxDist +} + +proto.getDistanceLimits = function(out) { + var bounds = this.radius.bounds[0] + if(out) { + out[0] = Math.exp(bounds[0][0]) + out[1] = Math.exp(bounds[1][0]) + return out + } + return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ] +} + +proto.recalcMatrix = function(t) { + //Recompute curves + this.center.curve(t) + this.up.curve(t) + this.right.curve(t) + this.radius.curve(t) + this.angle.curve(t) + + //Compute frame for camera matrix + var up = this.computedUp + var right = this.computedRight + var uu = 0.0 + var ur = 0.0 + for(var i=0; i<3; ++i) { + ur += up[i] * right[i] + uu += up[i] * up[i] + } + var ul = Math.sqrt(uu) + var rr = 0.0 + for(var i=0; i<3; ++i) { + right[i] -= up[i] * ur / uu + rr += right[i] * right[i] + up[i] /= ul + } + var rl = Math.sqrt(rr) + for(var i=0; i<3; ++i) { + right[i] /= rl + } + + //Compute toward vector + var toward = this.computedToward + cross(toward, up, right) + normalize3(toward, toward) + + //Compute angular parameters + var radius = Math.exp(this.computedRadius[0]) + var theta = this.computedAngle[0] + var phi = this.computedAngle[1] + + var ctheta = Math.cos(theta) + var stheta = Math.sin(theta) + var cphi = Math.cos(phi) + var sphi = Math.sin(phi) + + var center = this.computedCenter + + var wx = ctheta * cphi + var wy = stheta * cphi + var wz = sphi + + var sx = -ctheta * sphi + var sy = -stheta * sphi + var sz = cphi + + var eye = this.computedEye + var mat = this.computedMatrix + for(var i=0; i<3; ++i) { + var x = wx * right[i] + wy * toward[i] + wz * up[i] + mat[4*i+1] = sx * right[i] + sy * toward[i] + sz * up[i] + mat[4*i+2] = x + mat[4*i+3] = 0.0 + } + + var ax = mat[1] + var ay = mat[5] + var az = mat[9] + var bx = mat[2] + var by = mat[6] + var bz = mat[10] + var cx = ay * bz - az * by + var cy = az * bx - ax * bz + var cz = ax * by - ay * bx + var cl = len3(cx, cy, cz) + cx /= cl + cy /= cl + cz /= cl + mat[0] = cx + mat[4] = cy + mat[8] = cz + + for(var i=0; i<3; ++i) { + eye[i] = center[i] + mat[2+4*i]*radius + } + + for(var i=0; i<3; ++i) { + var rr = 0.0 + for(var j=0; j<3; ++j) { + rr += mat[i+4*j] * eye[j] + } + mat[12+i] = -rr + } + mat[15] = 1.0 +} + +proto.getMatrix = function(t, result) { + this.recalcMatrix(t) + var mat = this.computedMatrix + if(result) { + for(var i=0; i<16; ++i) { + result[i] = mat[i] + } + return result + } + return mat +} + +var zAxis = [0,0,0] +proto.rotate = function(t, dtheta, dphi, droll) { + this.angle.move(t, dtheta, dphi) + if(droll) { + this.recalcMatrix(t) + + var mat = this.computedMatrix + zAxis[0] = mat[2] + zAxis[1] = mat[6] + zAxis[2] = mat[10] + + var up = this.computedUp + var right = this.computedRight + var toward = this.computedToward + + for(var i=0; i<3; ++i) { + mat[4*i] = up[i] + mat[4*i+1] = right[i] + mat[4*i+2] = toward[i] + } + rotateM(mat, mat, droll, zAxis) + for(var i=0; i<3; ++i) { + up[i] = mat[4*i] + right[i] = mat[4*i+1] + } + + this.up.set(t, up[0], up[1], up[2]) + this.right.set(t, right[0], right[1], right[2]) + } +} + +proto.pan = function(t, dx, dy, dz) { + dx = dx || 0.0 + dy = dy || 0.0 + dz = dz || 0.0 + + this.recalcMatrix(t) + var mat = this.computedMatrix + + var dist = Math.exp(this.computedRadius[0]) + + var ux = mat[1] + var uy = mat[5] + var uz = mat[9] + var ul = len3(ux, uy, uz) + ux /= ul + uy /= ul + uz /= ul + + var rx = mat[0] + var ry = mat[4] + var rz = mat[8] + var ru = rx * ux + ry * uy + rz * uz + rx -= ux * ru + ry -= uy * ru + rz -= uz * ru + var rl = len3(rx, ry, rz) + rx /= rl + ry /= rl + rz /= rl + + var vx = rx * dx + ux * dy + var vy = ry * dx + uy * dy + var vz = rz * dx + uz * dy + this.center.move(t, vx, vy, vz) + + //Update z-component of radius + var radius = Math.exp(this.computedRadius[0]) + radius = Math.max(1e-4, radius + dz) + this.radius.set(t, Math.log(radius)) +} + +proto.translate = function(t, dx, dy, dz) { + this.center.move(t, + dx||0.0, + dy||0.0, + dz||0.0) +} + +//Recenters the coordinate axes +proto.setMatrix = function(t, mat, axes, noSnap) { + + //Get the axes for tare + var ushift = 1 + if(typeof axes === 'number') { + ushift = (axes)|0 + } + if(ushift < 0 || ushift > 3) { + ushift = 1 + } + var vshift = (ushift + 2) % 3 + var fshift = (ushift + 1) % 3 + + //Recompute state for new t value + if(!mat) { + this.recalcMatrix(t) + mat = this.computedMatrix + } + + //Get right and up vectors + var ux = mat[ushift] + var uy = mat[ushift+4] + var uz = mat[ushift+8] + if(!noSnap) { + var ul = len3(ux, uy, uz) + ux /= ul + uy /= ul + uz /= ul + } else { + var ax = Math.abs(ux) + var ay = Math.abs(uy) + var az = Math.abs(uz) + var am = Math.max(ax,ay,az) + if(ax === am) { + ux = (ux < 0) ? -1 : 1 + uy = uz = 0 + } else if(az === am) { + uz = (uz < 0) ? -1 : 1 + ux = uy = 0 + } else { + uy = (uy < 0) ? -1 : 1 + ux = uz = 0 + } + } + + var rx = mat[vshift] + var ry = mat[vshift+4] + var rz = mat[vshift+8] + var ru = rx * ux + ry * uy + rz * uz + rx -= ux * ru + ry -= uy * ru + rz -= uz * ru + var rl = len3(rx, ry, rz) + rx /= rl + ry /= rl + rz /= rl + + var fx = uy * rz - uz * ry + var fy = uz * rx - ux * rz + var fz = ux * ry - uy * rx + var fl = len3(fx, fy, fz) + fx /= fl + fy /= fl + fz /= fl + + this.center.jump(t, ex, ey, ez) + this.radius.idle(t) + this.up.jump(t, ux, uy, uz) + this.right.jump(t, rx, ry, rz) + + var phi, theta + if(ushift === 2) { + var cx = mat[1] + var cy = mat[5] + var cz = mat[9] + var cr = cx * rx + cy * ry + cz * rz + var cf = cx * fx + cy * fy + cz * fz + if(tu < 0) { + phi = -Math.PI/2 + } else { + phi = Math.PI/2 + } + theta = Math.atan2(cf, cr) + } else { + var tx = mat[2] + var ty = mat[6] + var tz = mat[10] + var tu = tx * ux + ty * uy + tz * uz + var tr = tx * rx + ty * ry + tz * rz + var tf = tx * fx + ty * fy + tz * fz + + phi = Math.asin(clamp1(tu)) + theta = Math.atan2(tf, tr) + } + + this.angle.jump(t, theta, phi) + + this.recalcMatrix(t) + var dx = mat[2] + var dy = mat[6] + var dz = mat[10] + + var imat = this.computedMatrix + invert44(imat, mat) + var w = imat[15] + var ex = imat[12] / w + var ey = imat[13] / w + var ez = imat[14] / w + + var gs = Math.exp(this.computedRadius[0]) + this.center.jump(t, ex-dx*gs, ey-dy*gs, ez-dz*gs) +} + +proto.lastT = function() { + return Math.max( + this.center.lastT(), + this.up.lastT(), + this.right.lastT(), + this.radius.lastT(), + this.angle.lastT()) +} + +proto.idle = function(t) { + this.center.idle(t) + this.up.idle(t) + this.right.idle(t) + this.radius.idle(t) + this.angle.idle(t) +} + +proto.flush = function(t) { + this.center.flush(t) + this.up.flush(t) + this.right.flush(t) + this.radius.flush(t) + this.angle.flush(t) +} + +proto.setDistance = function(t, d) { + if(d > 0) { + this.radius.set(t, Math.log(d)) + } +} + +proto.lookAt = function(t, eye, center, up) { + this.recalcMatrix(t) + + eye = eye || this.computedEye + center = center || this.computedCenter + up = up || this.computedUp + + var ux = up[0] + var uy = up[1] + var uz = up[2] + var ul = len3(ux, uy, uz) + if(ul < 1e-6) { + return + } + ux /= ul + uy /= ul + uz /= ul + + var tx = eye[0] - center[0] + var ty = eye[1] - center[1] + var tz = eye[2] - center[2] + var tl = len3(tx, ty, tz) + if(tl < 1e-6) { + return + } + tx /= tl + ty /= tl + tz /= tl + + var right = this.computedRight + var rx = right[0] + var ry = right[1] + var rz = right[2] + var ru = ux*rx + uy*ry + uz*rz + rx -= ru * ux + ry -= ru * uy + rz -= ru * uz + var rl = len3(rx, ry, rz) + + if(rl < 0.01) { + rx = uy * tz - uz * ty + ry = uz * tx - ux * tz + rz = ux * ty - uy * tx + rl = len3(rx, ry, rz) + if(rl < 1e-6) { + return + } + } + rx /= rl + ry /= rl + rz /= rl + + this.up.set(t, ux, uy, uz) + this.right.set(t, rx, ry, rz) + this.center.set(t, center[0], center[1], center[2]) + this.radius.set(t, Math.log(tl)) + + var fx = uy * rz - uz * ry + var fy = uz * rx - ux * rz + var fz = ux * ry - uy * rx + var fl = len3(fx, fy, fz) + fx /= fl + fy /= fl + fz /= fl + + var tu = ux*tx + uy*ty + uz*tz + var tr = rx*tx + ry*ty + rz*tz + var tf = fx*tx + fy*ty + fz*tz + + var phi = Math.asin(clamp1(tu)) + var theta = Math.atan2(tf, tr) + + var angleState = this.angle._state + var lastTheta = angleState[angleState.length-1] + var lastPhi = angleState[angleState.length-2] + lastTheta = lastTheta % (2.0 * Math.PI) + var dp = Math.abs(lastTheta + 2.0 * Math.PI - theta) + var d0 = Math.abs(lastTheta - theta) + var dn = Math.abs(lastTheta - 2.0 * Math.PI - theta) + if(dp < d0) { + lastTheta += 2.0 * Math.PI + } + if(dn < d0) { + lastTheta -= 2.0 * Math.PI + } + + this.angle.jump(this.angle.lastT(), lastTheta, lastPhi) + this.angle.set(t, theta, phi) +} + +function createTurntableController(options) { + options = options || {} + + var center = options.center || [0,0,0] + var up = options.up || [0,1,0] + var right = options.right || findOrthoPair(up) + var radius = options.radius || 1.0 + var theta = options.theta || 0.0 + var phi = options.phi || 0.0 + + center = [].slice.call(center, 0, 3) + + up = [].slice.call(up, 0, 3) + normalize3(up, up) + + right = [].slice.call(right, 0, 3) + normalize3(right, right) + + if('eye' in options) { + var eye = options.eye + var toward = [ + eye[0]-center[0], + eye[1]-center[1], + eye[2]-center[2] + ] + cross(right, toward, up) + if(len3(right[0], right[1], right[2]) < 1e-6) { + right = findOrthoPair(up) + } else { + normalize3(right, right) + } + + radius = len3(toward[0], toward[1], toward[2]) + + var ut = dot3(up, toward) / radius + var rt = dot3(right, toward) / radius + phi = Math.acos(ut) + theta = Math.acos(rt) + } + + //Use logarithmic coordinates for radius + radius = Math.log(radius) + + //Return the controller + return new TurntableController( + options.zoomMin, + options.zoomMax, + center, + up, + right, + radius, + theta, + phi) +} + +/***/ }), + +/***/ "./src/shaders/lambert-frag.glsl": +/*!***************************************!*\ + !*** ./src/shaders/lambert-frag.glsl ***! + \***************************************/ +/***/ ((module) => { + +module.exports = "#version 300 es\n\n// This is a fragment shader. If you've opened this file first, please\n// open and read lambert.vert.glsl before reading on.\n// Unlike the vertex shader, the fragment shader actually does compute\n// the shading of geometry. For every pixel in your program's output\n// screen, the fragment shader is run for every bit of geometry that\n// particular pixel overlaps. By implicitly interpolating the position\n// data passed into the fragment shader by the vertex shader, the fragment shader\n// can compute what color to apply to its pixel based on things like vertex\n// position, light position, and vertex color.\nprecision highp float;\n\nuniform vec4 u_Color; // The color with which to render this instance of geometry.\n\n// These are the interpolated values out of the rasterizer, so you can't know\n// their specific values without knowing the vertices that contributed to them\nin vec4 fs_Nor;\nin vec4 fs_LightVec;\nin vec4 fs_Col;\n\nout vec4 out_Col; // This is the final output color that you will see on your\n // screen for the pixel that is currently being processed.\n\nvoid main()\n{\n // Material base color (before shading)\n vec4 diffuseColor = u_Color;\n\n // Calculate the diffuse term for Lambert shading\n float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec));\n // Avoid negative lighting values\n // diffuseTerm = clamp(diffuseTerm, 0, 1);\n\n float ambientTerm = 0.2;\n\n float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier\n //to simulate ambient lighting. This ensures that faces that are not\n //lit by our point light are not completely black.\n\n // Compute final shaded color\n out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a);\n}\n" + +/***/ }), + +/***/ "./src/shaders/lambert-vert.glsl": +/*!***************************************!*\ + !*** ./src/shaders/lambert-vert.glsl ***! + \***************************************/ +/***/ ((module) => { + +module.exports = "#version 300 es\n\n//This is a vertex shader. While it is called a \"shader\" due to outdated conventions, this file\n//is used to apply matrix transformations to the arrays of vertex data passed to it.\n//Since this code is run on your GPU, each vertex is transformed simultaneously.\n//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time.\n//This simultaneous transformation allows your program to run much faster, especially when rendering\n//geometry with millions of vertices.\n\nuniform mat4 u_Model; // The matrix that defines the transformation of the\n // object we're rendering. In this assignment,\n // this will be the result of traversing your scene graph.\n\nuniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix.\n // This allows us to transform the object's normals properly\n // if the object has been non-uniformly scaled.\n\nuniform mat4 u_ViewProj; // The matrix that defines the camera's transformation.\n // We've written a static matrix for you to use for HW2,\n // but in HW3 you'll have to generate one yourself\n\nin vec4 vs_Pos; // The array of vertex positions passed to the shader\n\nin vec4 vs_Nor; // The array of vertex normals passed to the shader\n\nin vec4 vs_Col; // The array of vertex colors passed to the shader.\n\nout vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader.\nout vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader.\nout vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader.\n\nconst vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of\n //the geometry in the fragment shader.\n\nvoid main()\n{\n fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation\n\n mat3 invTranspose = mat3(u_ModelInvTr);\n fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation.\n // Transform the geometry's normals by the inverse transpose of the\n // model matrix. This is necessary to ensure the normals remain\n // perpendicular to the surface after the surface is transformed by\n // the model matrix.\n\n\n vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below\n\n fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies\n\n gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is\n // used to render the final positions of the geometry's vertices\n}\n" + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be in strict mode. +(() => { +"use strict"; +/*!*********************!*\ + !*** ./src/main.ts ***! + \*********************/ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec3.js"); +/* harmony import */ var dat_gui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dat.gui */ "./node_modules/dat.gui/build/dat.gui.module.js"); +/* harmony import */ var _geometry_Icosphere__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./geometry/Icosphere */ "./src/geometry/Icosphere.ts"); +/* harmony import */ var _geometry_Square__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./geometry/Square */ "./src/geometry/Square.ts"); +/* harmony import */ var _rendering_gl_OpenGLRenderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rendering/gl/OpenGLRenderer */ "./src/rendering/gl/OpenGLRenderer.ts"); +/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Camera */ "./src/Camera.ts"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./globals */ "./src/globals.ts"); +/* harmony import */ var _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./rendering/gl/ShaderProgram */ "./src/rendering/gl/ShaderProgram.ts"); + +const Stats = __webpack_require__(/*! stats-js */ "./node_modules/stats-js/build/stats.min.js"); + + + + + + + +// Define an object with application parameters and button callbacks +// This will be referred to by dat.GUI's functions that add GUI elements. +const controls = { + tesselations: 5, + 'Load Scene': loadScene, // A function pointer, essentially +}; +let icosphere; +let square; +let prevTesselations = 5; +function loadScene() { + icosphere = new _geometry_Icosphere__WEBPACK_IMPORTED_MODULE_1__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0), 1, controls.tesselations); + icosphere.create(); + square = new _geometry_Square__WEBPACK_IMPORTED_MODULE_2__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0)); + square.create(); +} +function main() { + // Initial display for framerate + const stats = Stats(); + stats.setMode(0); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + // Add controls to the gui + const gui = new dat_gui__WEBPACK_IMPORTED_MODULE_0__.GUI(); + gui.add(controls, 'tesselations', 0, 8).step(1); + gui.add(controls, 'Load Scene'); + // get canvas and webgl context + const canvas = document.getElementById('canvas'); + const gl = canvas.getContext('webgl2'); + if (!gl) { + alert('WebGL 2 not supported!'); + } + // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module. + // Later, we can import `gl` from `globals.ts` to access it + (0,_globals__WEBPACK_IMPORTED_MODULE_5__.setGL)(gl); + // Initial call to load scene + loadScene(); + const camera = new _Camera__WEBPACK_IMPORTED_MODULE_4__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 5), gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0)); + const renderer = new _rendering_gl_OpenGLRenderer__WEBPACK_IMPORTED_MODULE_3__["default"](canvas); + renderer.setClearColor(0.2, 0.2, 0.2, 1); + gl.enable(gl.DEPTH_TEST); + const lambert = new _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__["default"]([ + new _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__.Shader(gl.VERTEX_SHADER, __webpack_require__(/*! ./shaders/lambert-vert.glsl */ "./src/shaders/lambert-vert.glsl")), + new _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__.Shader(gl.FRAGMENT_SHADER, __webpack_require__(/*! ./shaders/lambert-frag.glsl */ "./src/shaders/lambert-frag.glsl")), + ]); + // This function will be called every frame + function tick() { + camera.update(); + stats.begin(); + gl.viewport(0, 0, window.innerWidth, window.innerHeight); + renderer.clear(); + if (controls.tesselations != prevTesselations) { + prevTesselations = controls.tesselations; + icosphere = new _geometry_Icosphere__WEBPACK_IMPORTED_MODULE_1__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0), 1, prevTesselations); + icosphere.create(); + } + renderer.render(camera, lambert, [ + icosphere, + // square, + ]); + stats.end(); + // Tell the browser to call `tick` again whenever it renders a new frame + requestAnimationFrame(tick); + } + window.addEventListener('resize', function () { + renderer.setSize(window.innerWidth, window.innerHeight); + camera.setAspectRatio(window.innerWidth / window.innerHeight); + camera.updateProjectionMatrix(); + }, false); + renderer.setSize(window.innerWidth, window.innerHeight); + camera.setAspectRatio(window.innerWidth / window.innerHeight); + camera.updateProjectionMatrix(); + // Start the render loop + tick(); +} +main(); + +})(); + +/******/ })() +; +//# sourceMappingURL=bundle.js.map \ No newline at end of file diff --git a/dist/bundle.js.map b/dist/bundle.js.map new file mode 100644 index 00000000..b4dab2f5 --- /dev/null +++ b/dist/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundle.js","mappings":";;;;;;;;;;AAAY;AACZ;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,sDAAW;AACrC,kBAAkB,mBAAO,CAAC,+CAAS;AACnC,kBAAkB,mBAAO,CAAC,iEAAc;AACxC,kBAAkB,mBAAO,CAAC,wDAAa;AACvC,kBAAkB,mBAAO,CAAC,sEAAoB;AAC9C,kBAAkB,mBAAO,CAAC,sEAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;;;;;AC3OY;;AAEZ;;AAEA,sBAAsB,mBAAO,CAAC,4FAA6B;AAC3D,sBAAsB,mBAAO,CAAC,gFAAyB;AACvD,sBAAsB,mBAAO,CAAC,mFAA0B;;AAExD;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;AC1JY;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO,YAAY,OAAO;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO,YAAY,OAAO;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO,YAAY,OAAO;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO,YAAY,OAAO;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,kBAAkB,YAAY,OAAO;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,+BAA+B;AAC/D,gCAAgC,+BAA+B;AAC/D,gCAAgC,+BAA+B;AAC/D,gCAAgC,+BAA+B;AAC/D,gCAAgC;AAChC;;;;;;;;;;;;ACnEY;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;;;;;;;;;;;;;;;;;;;;ACtCzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ,aAAa,oCAAoC;AACjD,IAAI;AACJ,aAAa,gDAAgD;AAC7D,IAAI;AACJ,aAAa,oCAAoC;AACjD,IAAI;AACJ,aAAa,gDAAgD;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,oCAAoC,SAAS;AAC7C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA,+CAA+C,EAAE;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;;;;;;;;;;;AAYA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;AAQD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;;;;;;;;;;;AAYA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oKAAoK,gCAAgC;AACpM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,+GAA+G;AAC/G,GAAG;AACH;AACA;AACA;AACA,2JAA2J;AAC3J,wJAAwJ;AACxJ,mJAAmJ;AACnJ,oJAAoJ;AACpJ,gJAAgJ;AAChJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,0DAA0D;AACnH;AACA,uDAAuD,sCAAsC;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAE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AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,gFAAgF,uEAAuE;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+D;AAC/D,iEAAe,KAAK,EAAC;AACrB;;;;;;;;;;;;AC39EY;;AAEZ;;AAEA,mBAAmB,mBAAO,CAAC,8DAAe;AAC1C,cAAc,mBAAO,CAAC,kFAAsB;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB;AACA;AACA,MAAM;AACN;AACA,mBAAmB,KAAK;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,MAAM;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClSA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3BA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC1BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;AC7BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;AC9CA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACpDA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC1BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACtDA,eAAe,mBAAO,CAAC,sDAAY;;AAEnC;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACzFA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,WAAW,WAAW;AACrC;AACA;AACA;AACA;;AAEA,eAAe,WAAW,YAAY;AACtC;AACA;AACA;AACA;;AAEA,gBAAgB,YAAY,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACzCA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAgB,YAAY,YAAY;AACxC,gBAAgB,YAAY,YAAY;AACxC,gBAAgB,YAAY,aAAa;;AAEzC;AACA,yBAAyB,yBAAyB;AAClD,6BAA6B,qBAAqB;AAClD,6BAA6B,yBAAyB;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC/DA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3CA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3CA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3CA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC9BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,YAAY,YAAY;AAC5C,oBAAoB,YAAY,YAAY;AAC5C,oBAAoB,YAAY,aAAa;;AAE7C,sBAAsB,cAAc,cAAc;AAClD,sBAAsB,cAAc,cAAc;AAClD,sBAAsB,cAAc,eAAe;;AAEnD;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACrCA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACP;AACA;AACA;AACA,WAAW,4CAA4C;AACvD;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjDwC;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;;AAEnC,MAAM,kDAAmB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;;AAEnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;;AAEnC;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,+CAAgB;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA,YAAY,+CAAgB;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B,aAAa,MAAM;AACnB;;AAEO;AACP,wBAAwB,kDAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;;AAEzD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,cAAc;AAC1B,YAAY,MAAM;AAClB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,cAAc;AAC1B,YAAY,MAAM;AAClB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,YAAY,MAAM;AAClB;;AAEO;AACP,oBAAoB,kDAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB;AACA,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,+CAAgB,+BAA+B,+CAAgB,+BAA+B,+CAAgB;AAC/I;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,uEAAuE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB;AAC/zC;AACA;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrxDiC;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;;AAEnC,MAAM,kDAAmB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,UAAU,8CAAe;AACzB,UAAU,8CAAe;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,cAAc;;AAEd;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,sDAAsD;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,cAAc;;AAEd;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,sDAAsD;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,cAAc;;AAEd;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB;AACxN;AACA;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClxBuC;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;;AAEnC,MAAM,kDAAmB;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,wBAAwB;AACxB;AACA;;AAEA;AACA;;AAEA;AACA,SAAS,8CAAe;AACxB,SAAS,8CAAe;AACxB;AACA,IAAI;;AAEJ;AACA,SAAS,8CAAe;AACxB,SAAS,8CAAe;AACxB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,sCAAsC;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB;AAC7S;AACA;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;;;;;;;;;ACtpBD;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;AClDA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;AClBA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;;;;;;;;;ACXA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACbA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACnBA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBY;AACZ;AACA,gBAAgB,mBAAO,CAAC,uDAAY;AACpC;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvBA;;;;;;;;;;ACAA;AACA;AACA,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,+DAAa;;AAErC,aAAa,mBAAO,CAAC,wDAAgB;AACrC,YAAY,mBAAO,CAAC,sDAAe;AACnC,kBAAkB,mBAAO,CAAC,kEAAqB;AAC/C,aAAa,mBAAO,CAAC,wDAAgB;AACrC,gBAAgB,mBAAO,CAAC,8DAAmB;AAC3C;AACA,YAAY,mBAAO,CAAC,wDAAgB;AACpC,eAAe,mBAAO,CAAC,8DAAmB;AAC1C,SAAS,mBAAO,CAAC,kDAAa;AAC9B,WAAW,mBAAO,CAAC,sDAAe;AAClC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB;AACA;AACA;;;;;;;;;;ACTA,WAAW,mBAAO,CAAC,oDAAc;;AAEjC,gBAAgB,mBAAO,CAAC,8DAAgB;AACxC,gBAAgB,mBAAO,CAAC,8DAAgB;AACxC,kBAAkB,mBAAO,CAAC,kEAAqB;AAC/C,YAAY,mBAAO,CAAC,sDAAY;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;ACnDA;AACA,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;;AAEtB;AACA;;AAEA;AACA,cAAc,mBAAO,CAAC,4DAAkB;AACxC,eAAe,mBAAO,CAAC,8DAAmB;AAC1C,cAAc,mBAAO,CAAC,4DAAkB;AACxC,YAAY,mBAAO,CAAC,wDAAgB;AACpC,WAAW,mBAAO,CAAC,sDAAe;AAClC,6BAA6B,mBAAO,CAAC,0FAAiC;AACtE;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3DY;;AAEZ,gBAAgB,mBAAO,CAAC,kFAAsB;AAC9C,gBAAgB,mBAAO,CAAC,kEAAkB;AAC1C,gBAAgB,mBAAO,CAAC,wDAAgB;AACxC,gBAAgB,mBAAO,CAAC,0DAAiB;AACzC,gBAAgB,mBAAO,CAAC,0DAAiB;AACzC,gBAAgB,mBAAO,CAAC,0DAAiB;AACzC,gBAAgB,mBAAO,CAAC,wDAAgB;AACxC,gBAAgB,mBAAO,CAAC,8DAAmB;AAC3C,gBAAgB,mBAAO,CAAC,sDAAe;AACvC,gBAAgB,mBAAO,CAAC,8DAAmB;;AAE3C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACrMY;;AAEZ;;AAEA,YAAY,mBAAO,CAAC,wDAAa;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA,yBAAyB,oBAAoB;AAC7C;AACA,KAAK;AACL;AACA,yBAAyB,UAAU;AACnC;AACA,KAAK;AACL;AACA,yBAAyB,UAAU;AACnC;AACA,KAAK;AACL;AACA,yBAAyB,aAAa;AACtC;AACA;AACA,GAAG;;AAEH;AACA;;;;;;;;;;;AC5MA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;;;;;;;;;;;ACxBY;;AAEZ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;;;;;;;;;;;AC3DG;;AAEZ,WAAW,mBAAO,CAAC,8CAAO;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvCY;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxCY;;AAEZ;;AAEA,oBAAoB,mBAAO,CAAC,+DAAiB;AAC7C,oBAAoB,mBAAO,CAAC,wDAAgB;AAC5C,oBAAoB,mBAAO,CAAC,4DAAkB;AAC9C,oBAAoB,mBAAO,CAAC,wDAAgB;AAC5C,oBAAoB,mBAAO,CAAC,wFAAqB;;AAEjD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,KAAK;AACpB;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACxYA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACTA;;;;;;;;;;ACAA;AACA,EAAE,qBAAM;AACR,EAAE,qBAAM;AACR;AACA,IAAI;AACJ;AACA;;;;;;;;;;;ACNA,eAAe,KAAoD,oBAAoB,CAA2D,CAAC,iBAAiB,aAAa,iBAAiB,wCAAwC,cAAc,8BAA8B,cAAc,YAAY,oBAAoB,qDAAqD,IAAI,gCAAgC,MAAM,OAAO,eAAe,YAAY,sDAAsD,4CAA4C,KAAK,mHAAmH,sFAAsF,aAAa,0DAA0D,4BAA4B,gBAAgB,IAAI,gCAAgC,sEAAsE,yBAAyB,6DAA6D,SAAS,mBAAmB,aAAa,0BAA0B,+BAA+B,mJAAmJ,iDAAiD,aAAa,yBAAyB,yNAAyN,2BAA2B,mRAAmR,GAAG;;;;;;;;;;;;ACAl3D;;AAEZ,gBAAgB,mBAAO,CAAC,sDAAY;;AAEpC;;AAEA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;ACzEA,IAAI,cAAc,GAAG,mBAAO,CAAC,mEAAkB,CAAC,CAAC;AACZ;AAErC,MAAM,MAAM;IAaV,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xC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,KAAK;AACpB;AACA;;AAEA,eAAe,KAAK;AACpB;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA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","sources":["webpack:///./node_modules/3d-view-controls/camera.js","webpack:///./node_modules/3d-view/view.js","webpack:///./node_modules/binary-search-bounds/search-bounds.js","webpack:///./node_modules/cubic-hermite/hermite.js","webpack:///./node_modules/dat.gui/build/dat.gui.module.js","webpack:///./node_modules/filtered-vector/fvec.js","webpack:///./node_modules/gl-mat4/clone.js","webpack:///./node_modules/gl-mat4/create.js","webpack:///./node_modules/gl-mat4/determinant.js","webpack:///./node_modules/gl-mat4/fromQuat.js","webpack:///./node_modules/gl-mat4/fromRotationTranslation.js","webpack:///./node_modules/gl-mat4/identity.js","webpack:///./node_modules/gl-mat4/invert.js","webpack:///./node_modules/gl-mat4/lookAt.js","webpack:///./node_modules/gl-mat4/multiply.js","webpack:///./node_modules/gl-mat4/rotate.js","webpack:///./node_modules/gl-mat4/rotateX.js","webpack:///./node_modules/gl-mat4/rotateY.js","webpack:///./node_modules/gl-mat4/rotateZ.js","webpack:///./node_modules/gl-mat4/scale.js","webpack:///./node_modules/gl-mat4/translate.js","webpack:///./node_modules/gl-mat4/transpose.js","webpack:///./node_modules/gl-matrix/esm/common.js","webpack:///./node_modules/gl-matrix/esm/mat4.js","webpack:///./node_modules/gl-matrix/esm/vec3.js","webpack:///./node_modules/gl-matrix/esm/vec4.js","webpack:///./node_modules/gl-quat/slerp.js","webpack:///./node_modules/gl-vec3/cross.js","webpack:///./node_modules/gl-vec3/dot.js","webpack:///./node_modules/gl-vec3/length.js","webpack:///./node_modules/gl-vec3/lerp.js","webpack:///./node_modules/gl-vec3/normalize.js","webpack:///./node_modules/has-passive-events/index.js","webpack:///./node_modules/is-browser/client.js","webpack:///./node_modules/mat4-decompose/index.js","webpack:///./node_modules/mat4-decompose/normalize.js","webpack:///./node_modules/mat4-interpolate/index.js","webpack:///./node_modules/mat4-recompose/index.js","webpack:///./node_modules/matrix-camera-controller/matrix.js","webpack:///./node_modules/mouse-change/mouse-listen.js","webpack:///./node_modules/mouse-event-offset/index.js","webpack:///./node_modules/mouse-event/mouse.js","webpack:///./node_modules/mouse-wheel/wheel.js","webpack:///./node_modules/orbit-camera-controller/lib/quatFromFrame.js","webpack:///./node_modules/orbit-camera-controller/orbit.js","webpack:///./node_modules/parse-unit/index.js","webpack:///./node_modules/quat-slerp/index.js","webpack:///./node_modules/right-now/browser.js","webpack:///./node_modules/stats-js/build/stats.min.js","webpack:///./node_modules/to-px/browser.js","webpack:///./src/Camera.ts","webpack:///./src/geometry/Icosphere.ts","webpack:///./src/geometry/Square.ts","webpack:///./src/globals.ts","webpack:///./src/rendering/gl/Drawable.ts","webpack:///./src/rendering/gl/OpenGLRenderer.ts","webpack:///./src/rendering/gl/ShaderProgram.ts","webpack:///./node_modules/turntable-camera-controller/turntable.js","webpack:///./src/shaders/lambert-frag.glsl","webpack:///./src/shaders/lambert-vert.glsl","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/main.ts"],"sourcesContent":["'use strict'\r\n\r\nmodule.exports = createCamera\r\n\r\nvar now = require('right-now')\r\nvar createView = require('3d-view')\r\nvar mouseChange = require('mouse-change')\r\nvar mouseWheel = require('mouse-wheel')\r\nvar mouseOffset = require('mouse-event-offset')\r\nvar hasPassive = require('has-passive-events')\r\n\r\nfunction createCamera(element, options) {\r\n element = element || document.body\r\n options = options || {}\r\n\r\n var limits = [ 0.01, Infinity ]\r\n if('distanceLimits' in options) {\r\n limits[0] = options.distanceLimits[0]\r\n limits[1] = options.distanceLimits[1]\r\n }\r\n if('zoomMin' in options) {\r\n limits[0] = options.zoomMin\r\n }\r\n if('zoomMax' in options) {\r\n limits[1] = options.zoomMax\r\n }\r\n\r\n var view = createView({\r\n center: options.center || [0,0,0],\r\n up: options.up || [0,1,0],\r\n eye: options.eye || [0,0,10],\r\n mode: options.mode || 'orbit',\r\n distanceLimits: limits\r\n })\r\n\r\n var pmatrix = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\r\n var distance = 0.0\r\n var width = element.clientWidth\r\n var height = element.clientHeight\r\n\r\n var camera = {\r\n view: view,\r\n element: element,\r\n delay: options.delay || 16,\r\n rotateSpeed: options.rotateSpeed || 1,\r\n zoomSpeed: options.zoomSpeed || 1,\r\n translateSpeed: options.translateSpeed || 1,\r\n flipX: !!options.flipX,\r\n flipY: !!options.flipY,\r\n modes: view.modes,\r\n tick: function() {\r\n var t = now()\r\n var delay = this.delay\r\n view.idle(t-delay)\r\n view.flush(t-(100+delay*2))\r\n var ctime = t - 2 * delay\r\n view.recalcMatrix(ctime)\r\n var allEqual = true\r\n var matrix = view.computedMatrix\r\n for(var i=0; i<16; ++i) {\r\n allEqual = allEqual && (pmatrix[i] === matrix[i])\r\n pmatrix[i] = matrix[i]\r\n }\r\n var sizeChanged =\r\n element.clientWidth === width &&\r\n element.clientHeight === height\r\n width = element.clientWidth\r\n height = element.clientHeight\r\n if(allEqual) {\r\n return !sizeChanged\r\n }\r\n distance = Math.exp(view.computedRadius[0])\r\n return true\r\n },\r\n lookAt: function(center, eye, up) {\r\n view.lookAt(view.lastT(), center, eye, up)\r\n },\r\n rotate: function(pitch, yaw, roll) {\r\n view.rotate(view.lastT(), pitch, yaw, roll)\r\n },\r\n pan: function(dx, dy, dz) {\r\n view.pan(view.lastT(), dx, dy, dz)\r\n },\r\n translate: function(dx, dy, dz) {\r\n view.translate(view.lastT(), dx, dy, dz)\r\n }\r\n }\r\n\r\n Object.defineProperties(camera, {\r\n matrix: {\r\n get: function() {\r\n return view.computedMatrix\r\n },\r\n set: function(mat) {\r\n view.setMatrix(view.lastT(), mat)\r\n return view.computedMatrix\r\n },\r\n enumerable: true\r\n },\r\n mode: {\r\n get: function() {\r\n return view.getMode()\r\n },\r\n set: function(mode) {\r\n view.setMode(mode)\r\n return view.getMode()\r\n },\r\n enumerable: true\r\n },\r\n center: {\r\n get: function() {\r\n return view.computedCenter\r\n },\r\n set: function(ncenter) {\r\n view.lookAt(view.lastT(), ncenter)\r\n return view.computedCenter\r\n },\r\n enumerable: true\r\n },\r\n eye: {\r\n get: function() {\r\n return view.computedEye\r\n },\r\n set: function(neye) {\r\n view.lookAt(view.lastT(), null, neye)\r\n return view.computedEye\r\n },\r\n enumerable: true\r\n },\r\n up: {\r\n get: function() {\r\n return view.computedUp\r\n },\r\n set: function(nup) {\r\n view.lookAt(view.lastT(), null, null, nup)\r\n return view.computedUp\r\n },\r\n enumerable: true\r\n },\r\n distance: {\r\n get: function() {\r\n return distance\r\n },\r\n set: function(d) {\r\n view.setDistance(view.lastT(), d)\r\n return d\r\n },\r\n enumerable: true\r\n },\r\n distanceLimits: {\r\n get: function() {\r\n return view.getDistanceLimits(limits)\r\n },\r\n set: function(v) {\r\n view.setDistanceLimits(v)\r\n return v\r\n },\r\n enumerable: true\r\n }\r\n })\r\n\r\n element.addEventListener('contextmenu', function(ev) {\r\n ev.preventDefault()\r\n return false\r\n })\r\n\r\n var lastX = 0, lastY = 0, lastMods = {shift: false, control: false, alt: false, meta: false}\r\n mouseChange(element, handleInteraction)\r\n\r\n //enable simple touch interactions\r\n element.addEventListener('touchstart', function (ev) {\r\n var xy = mouseOffset(ev.changedTouches[0], element)\r\n handleInteraction(0, xy[0], xy[1], lastMods)\r\n handleInteraction(1, xy[0], xy[1], lastMods)\r\n\r\n ev.preventDefault()\r\n }, hasPassive ? {passive: false} : false)\r\n\r\n element.addEventListener('touchmove', function (ev) {\r\n var xy = mouseOffset(ev.changedTouches[0], element)\r\n handleInteraction(1, xy[0], xy[1], lastMods)\r\n\r\n ev.preventDefault()\r\n }, hasPassive ? {passive: false} : false)\r\n\r\n element.addEventListener('touchend', function (ev) {\r\n var xy = mouseOffset(ev.changedTouches[0], element)\r\n handleInteraction(0, lastX, lastY, lastMods)\r\n\r\n ev.preventDefault()\r\n }, hasPassive ? {passive: false} : false)\r\n\r\n function handleInteraction (buttons, x, y, mods) {\r\n var scale = 1.0 / element.clientHeight\r\n var dx = scale * (x - lastX)\r\n var dy = scale * (y - lastY)\r\n\r\n var flipX = camera.flipX ? 1 : -1\r\n var flipY = camera.flipY ? 1 : -1\r\n\r\n var drot = Math.PI * camera.rotateSpeed\r\n\r\n var t = now()\r\n\r\n if(buttons & 1) {\r\n if(mods.shift) {\r\n view.rotate(t, 0, 0, -dx * drot)\r\n } else {\r\n view.rotate(t, flipX * drot * dx, -flipY * drot * dy, 0)\r\n }\r\n } else if(buttons & 2) {\r\n view.pan(t, -camera.translateSpeed * dx * distance, camera.translateSpeed * dy * distance, 0)\r\n } else if(buttons & 4) {\r\n var kzoom = camera.zoomSpeed * dy / window.innerHeight * (t - view.lastT()) * 50.0\r\n view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1))\r\n }\r\n\r\n lastX = x\r\n lastY = y\r\n lastMods = mods\r\n }\r\n\r\n mouseWheel(element, function(dx, dy, dz) {\r\n var flipX = camera.flipX ? 1 : -1\r\n var flipY = camera.flipY ? 1 : -1\r\n var t = now()\r\n if(Math.abs(dx) > Math.abs(dy)) {\r\n view.rotate(t, 0, 0, -dx * flipX * Math.PI * camera.rotateSpeed / window.innerWidth)\r\n } else {\r\n var kzoom = camera.zoomSpeed * flipY * dy / window.innerHeight * (t - view.lastT()) / 100.0\r\n view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1))\r\n }\r\n }, true)\r\n\r\n return camera\r\n}\r\n","'use strict'\n\nmodule.exports = createViewController\n\nvar createTurntable = require('turntable-camera-controller')\nvar createOrbit = require('orbit-camera-controller')\nvar createMatrix = require('matrix-camera-controller')\n\nfunction ViewController(controllers, mode) {\n this._controllerNames = Object.keys(controllers)\n this._controllerList = this._controllerNames.map(function(n) {\n return controllers[n]\n })\n this._mode = mode\n this._active = controllers[mode]\n if(!this._active) {\n this._mode = 'turntable'\n this._active = controllers.turntable\n }\n this.modes = this._controllerNames\n this.computedMatrix = this._active.computedMatrix\n this.computedEye = this._active.computedEye\n this.computedUp = this._active.computedUp\n this.computedCenter = this._active.computedCenter\n this.computedRadius = this._active.computedRadius\n}\n\nvar proto = ViewController.prototype\n\nproto.flush = function(a0) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].flush(a0)\n }\n}\nproto.idle = function(a0) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].idle(a0)\n }\n}\nproto.lookAt = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].lookAt(a0, a1, a2, a3)\n }\n}\nproto.rotate = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].rotate(a0, a1, a2, a3)\n }\n}\nproto.pan = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].pan(a0, a1, a2, a3)\n }\n}\nproto.translate = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].translate(a0, a1, a2, a3)\n }\n}\nproto.setMatrix = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setMatrix(a0, a1)\n }\n}\nproto.setDistanceLimits = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setDistanceLimits(a0, a1)\n }\n}\nproto.setDistance = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setDistance(a0, a1)\n }\n}\n\nproto.recalcMatrix = function(t) {\n this._active.recalcMatrix(t)\n}\n\nproto.getDistance = function(t) {\n return this._active.getDistance(t)\n}\nproto.getDistanceLimits = function(out) {\n return this._active.getDistanceLimits(out)\n}\n\nproto.lastT = function() {\n return this._active.lastT()\n}\n\nproto.setMode = function(mode) {\n if(mode === this._mode) {\n return\n }\n var idx = this._controllerNames.indexOf(mode)\n if(idx < 0) {\n return\n }\n var prev = this._active\n var next = this._controllerList[idx]\n var lastT = Math.max(prev.lastT(), next.lastT())\n\n prev.recalcMatrix(lastT)\n next.setMatrix(lastT, prev.computedMatrix)\n\n this._active = next\n this._mode = mode\n\n //Update matrix properties\n this.computedMatrix = this._active.computedMatrix\n this.computedEye = this._active.computedEye\n this.computedUp = this._active.computedUp\n this.computedCenter = this._active.computedCenter\n this.computedRadius = this._active.computedRadius\n}\n\nproto.getMode = function() {\n return this._mode\n}\n\nfunction createViewController(options) {\n options = options || {}\n\n var eye = options.eye || [0,0,1]\n var center = options.center || [0,0,0]\n var up = options.up || [0,1,0]\n var limits = options.distanceLimits || [0, Infinity]\n var mode = options.mode || 'turntable'\n\n var turntable = createTurntable()\n var orbit = createOrbit()\n var matrix = createMatrix()\n\n turntable.setDistanceLimits(limits[0], limits[1])\n turntable.lookAt(0, eye, center, up)\n orbit.setDistanceLimits(limits[0], limits[1])\n orbit.lookAt(0, eye, center, up)\n matrix.setDistanceLimits(limits[0], limits[1])\n matrix.lookAt(0, eye, center, up)\n\n return new ViewController({\n turntable: turntable,\n orbit: orbit,\n matrix: matrix\n }, mode)\n}","\"use strict\"\n\n// (a, y, c, l, h) = (array, y[, cmp, lo, hi])\n\nfunction ge(a, y, c, l, h) {\n var i = h + 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p >= 0) { i = m; h = m - 1 } else { l = m + 1 }\n }\n return i;\n};\n\nfunction gt(a, y, c, l, h) {\n var i = h + 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p > 0) { i = m; h = m - 1 } else { l = m + 1 }\n }\n return i;\n};\n\nfunction lt(a, y, c, l, h) {\n var i = l - 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p < 0) { i = m; l = m + 1 } else { h = m - 1 }\n }\n return i;\n};\n\nfunction le(a, y, c, l, h) {\n var i = l - 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p <= 0) { i = m; l = m + 1 } else { h = m - 1 }\n }\n return i;\n};\n\nfunction eq(a, y, c, l, h) {\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p === 0) { return m }\n if (p <= 0) { l = m + 1 } else { h = m - 1 }\n }\n return -1;\n};\n\nfunction norm(a, y, c, l, h, f) {\n if (typeof c === 'function') {\n return f(a, y, c, (l === undefined) ? 0 : l | 0, (h === undefined) ? a.length - 1 : h | 0);\n }\n return f(a, y, undefined, (c === undefined) ? 0 : c | 0, (l === undefined) ? a.length - 1 : l | 0);\n}\n\nmodule.exports = {\n ge: function(a, y, c, l, h) { return norm(a, y, c, l, h, ge)},\n gt: function(a, y, c, l, h) { return norm(a, y, c, l, h, gt)},\n lt: function(a, y, c, l, h) { return norm(a, y, c, l, h, lt)},\n le: function(a, y, c, l, h) { return norm(a, y, c, l, h, le)},\n eq: function(a, y, c, l, h) { return norm(a, y, c, l, h, eq)}\n}\n","\"use strict\"\n\nfunction dcubicHermite(p0, v0, p1, v1, t, f) {\n var dh00 = 6*t*t-6*t,\n dh10 = 3*t*t-4*t + 1,\n dh01 = -6*t*t+6*t,\n dh11 = 3*t*t-2*t\n if(p0.length) {\n if(!f) {\n f = new Array(p0.length)\n }\n for(var i=p0.length-1; i>=0; --i) {\n f[i] = dh00*p0[i] + dh10*v0[i] + dh01*p1[i] + dh11*v1[i]\n }\n return f\n }\n return dh00*p0 + dh10*v0 + dh01*p1[i] + dh11*v1\n}\n\nfunction cubicHermite(p0, v0, p1, v1, t, f) {\n var ti = (t-1), t2 = t*t, ti2 = ti*ti,\n h00 = (1+2*t)*ti2,\n h10 = t*ti2,\n h01 = t2*(3-2*t),\n h11 = t2*ti\n if(p0.length) {\n if(!f) {\n f = new Array(p0.length)\n }\n for(var i=p0.length-1; i>=0; --i) {\n f[i] = h00*p0[i] + h10*v0[i] + h01*p1[i] + h11*v1[i]\n }\n return f\n }\n return h00*p0 + h10*v0 + h01*p1 + h11*v1\n}\n\nmodule.exports = cubicHermite\nmodule.exports.derivative = dcubicHermite","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n\\n
\\n\\n
\\n\\n
\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","'use strict'\n\nmodule.exports = createFilteredVector\n\nvar cubicHermite = require('cubic-hermite')\nvar bsearch = require('binary-search-bounds')\n\nfunction clamp(lo, hi, x) {\n return Math.min(hi, Math.max(lo, x))\n}\n\nfunction FilteredVector(state0, velocity0, t0) {\n this.dimension = state0.length\n this.bounds = [ new Array(this.dimension), new Array(this.dimension) ]\n for(var i=0; i= n-1) {\n var ptr = state.length-1\n var tf = t - time[n-1]\n for(var i=0; i= n-1) {\n var ptr = state.length-1\n var tf = t - time[n-1]\n for(var i=0; i=0; --i) {\n if(velocity[--ptr]) {\n return false\n }\n }\n return true\n}\n\nproto.jump = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t < t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var ptr = state.length-this.dimension\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n this._time.push(t0, t)\n for(var j=0; j<2; ++j) {\n for(var i=0; i0; --i) {\n state.push(clamp(lo[i-1], hi[i-1], arguments[i]))\n velocity.push(0)\n }\n}\n\nproto.push = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t < t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var ptr = state.length-this.dimension\n var dt = t - t0\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var sf = (dt > 1e-6) ? 1/dt : 0\n this._time.push(t)\n for(var i=d; i>0; --i) {\n var xc = clamp(lo[i-1], hi[i-1], arguments[i])\n state.push(xc)\n velocity.push((xc - state[ptr++]) * sf)\n }\n}\n\nproto.set = function(t) {\n var d = this.dimension\n if(t < this.lastT() || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n this._time.push(t)\n for(var i=d; i>0; --i) {\n state.push(clamp(lo[i-1], hi[i-1], arguments[i]))\n velocity.push(0)\n }\n}\n\nproto.move = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t <= t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var statePtr = state.length - this.dimension\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var dt = t - t0\n var sf = (dt > 1e-6) ? 1/dt : 0.0\n this._time.push(t)\n for(var i=d; i>0; --i) {\n var dx = arguments[i]\n state.push(clamp(lo[i-1], hi[i-1], state[statePtr++] + dx))\n velocity.push(dx * sf)\n }\n}\n\nproto.idle = function(t) {\n var t0 = this.lastT()\n if(t < t0) {\n return\n }\n var d = this.dimension\n var state = this._state\n var velocity = this._velocity\n var statePtr = state.length-d\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var dt = t - t0\n this._time.push(t)\n for(var i=d-1; i>=0; --i) {\n state.push(clamp(lo[i], hi[i], state[statePtr] + dt * velocity[statePtr]))\n velocity.push(0)\n statePtr += 1\n }\n}\n\nfunction getZero(d) {\n var result = new Array(d)\n for(var i=0; iFormat: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nexport function perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","module.exports = slerp\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nfunction slerp (out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3]\n\n var omega, cosom, sinom, scale0, scale1\n\n // calc cosine\n cosom = ax * bx + ay * by + az * bz + aw * bw\n // adjust signs (if necessary)\n if (cosom < 0.0) {\n cosom = -cosom\n bx = -bx\n by = -by\n bz = -bz\n bw = -bw\n }\n // calculate coefficients\n if ((1.0 - cosom) > 0.000001) {\n // standard case (slerp)\n omega = Math.acos(cosom)\n sinom = Math.sin(omega)\n scale0 = Math.sin((1.0 - t) * omega) / sinom\n scale1 = Math.sin(t * omega) / sinom\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t\n scale1 = t\n }\n // calculate final values\n out[0] = scale0 * ax + scale1 * bx\n out[1] = scale0 * ay + scale1 * by\n out[2] = scale0 * az + scale1 * bz\n out[3] = scale0 * aw + scale1 * bw\n\n return out\n}\n","module.exports = cross;\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nfunction cross(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2],\n bx = b[0], by = b[1], bz = b[2]\n\n out[0] = ay * bz - az * by\n out[1] = az * bx - ax * bz\n out[2] = ax * by - ay * bx\n return out\n}","module.exports = dot;\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}","module.exports = length;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nfunction length(a) {\n var x = a[0],\n y = a[1],\n z = a[2]\n return Math.sqrt(x*x + y*y + z*z)\n}","module.exports = lerp;\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nfunction lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2]\n out[0] = ax + t * (b[0] - ax)\n out[1] = ay + t * (b[1] - ay)\n out[2] = az + t * (b[2] - az)\n return out\n}","module.exports = normalize;\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nfunction normalize(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2]\n var len = x*x + y*y + z*z\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len)\n out[0] = a[0] * len\n out[1] = a[1] * len\n out[2] = a[2] * len\n }\n return out\n}","'use strict'\r\n\r\nvar isBrowser = require('is-browser')\r\n\r\nfunction detect() {\r\n\tvar supported = false\r\n\r\n\ttry {\r\n\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\tget: function() {\r\n\t\t\t\tsupported = true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\twindow.addEventListener('test', null, opts)\r\n\t\twindow.removeEventListener('test', null, opts)\r\n\t} catch(e) {\r\n\t\tsupported = false\r\n\t}\r\n\r\n\treturn supported\r\n}\r\n\r\nmodule.exports = isBrowser && detect()\r\n","module.exports = true;","/*jshint unused:true*/\n/*\nInput: matrix ; a 4x4 matrix\nOutput: translation ; a 3 component vector\n scale ; a 3 component vector\n skew ; skew factors XY,XZ,YZ represented as a 3 component vector\n perspective ; a 4 component vector\n quaternion ; a 4 component vector\nReturns false if the matrix cannot be decomposed, true if it can\n\n\nReferences:\nhttps://github.com/kamicane/matrix3d/blob/master/lib/Matrix3d.js\nhttps://github.com/ChromiumWebApps/chromium/blob/master/ui/gfx/transform_util.cc\nhttp://www.w3.org/TR/css3-transforms/#decomposing-a-3d-matrix\n*/\n\nvar normalize = require('./normalize')\n\nvar create = require('gl-mat4/create')\nvar clone = require('gl-mat4/clone')\nvar determinant = require('gl-mat4/determinant')\nvar invert = require('gl-mat4/invert')\nvar transpose = require('gl-mat4/transpose')\nvar vec3 = {\n length: require('gl-vec3/length'),\n normalize: require('gl-vec3/normalize'),\n dot: require('gl-vec3/dot'),\n cross: require('gl-vec3/cross')\n}\n\nvar tmp = create()\nvar perspectiveMatrix = create()\nvar tmpVec4 = [0, 0, 0, 0]\nvar row = [ [0,0,0], [0,0,0], [0,0,0] ]\nvar pdum3 = [0,0,0]\n\nmodule.exports = function decomposeMat4(matrix, translation, scale, skew, perspective, quaternion) {\n if (!translation) translation = [0,0,0]\n if (!scale) scale = [0,0,0]\n if (!skew) skew = [0,0,0]\n if (!perspective) perspective = [0,0,0,1]\n if (!quaternion) quaternion = [0,0,0,1]\n\n //normalize, if not possible then bail out early\n if (!normalize(tmp, matrix))\n return false\n\n // perspectiveMatrix is used to solve for perspective, but it also provides\n // an easy way to test for singularity of the upper 3x3 component.\n clone(perspectiveMatrix, tmp)\n\n perspectiveMatrix[3] = 0\n perspectiveMatrix[7] = 0\n perspectiveMatrix[11] = 0\n perspectiveMatrix[15] = 1\n\n // If the perspectiveMatrix is not invertible, we are also unable to\n // decompose, so we'll bail early. Constant taken from SkMatrix44::invert.\n if (Math.abs(determinant(perspectiveMatrix) < 1e-8))\n return false\n\n var a03 = tmp[3], a13 = tmp[7], a23 = tmp[11],\n a30 = tmp[12], a31 = tmp[13], a32 = tmp[14], a33 = tmp[15]\n\n // First, isolate perspective.\n if (a03 !== 0 || a13 !== 0 || a23 !== 0) {\n tmpVec4[0] = a03\n tmpVec4[1] = a13\n tmpVec4[2] = a23\n tmpVec4[3] = a33\n\n // Solve the equation by inverting perspectiveMatrix and multiplying\n // rightHandSide by the inverse.\n // resuing the perspectiveMatrix here since it's no longer needed\n var ret = invert(perspectiveMatrix, perspectiveMatrix)\n if (!ret) return false\n transpose(perspectiveMatrix, perspectiveMatrix)\n\n //multiply by transposed inverse perspective matrix, into perspective vec4\n vec4multMat4(perspective, tmpVec4, perspectiveMatrix)\n } else { \n //no perspective\n perspective[0] = perspective[1] = perspective[2] = 0\n perspective[3] = 1\n }\n\n // Next take care of translation\n translation[0] = a30\n translation[1] = a31\n translation[2] = a32\n\n // Now get scale and shear. 'row' is a 3 element array of 3 component vectors\n mat3from4(row, tmp)\n\n // Compute X scale factor and normalize first row.\n scale[0] = vec3.length(row[0])\n vec3.normalize(row[0], row[0])\n\n // Compute XY shear factor and make 2nd row orthogonal to 1st.\n skew[0] = vec3.dot(row[0], row[1])\n combine(row[1], row[1], row[0], 1.0, -skew[0])\n\n // Now, compute Y scale and normalize 2nd row.\n scale[1] = vec3.length(row[1])\n vec3.normalize(row[1], row[1])\n skew[0] /= scale[1]\n\n // Compute XZ and YZ shears, orthogonalize 3rd row\n skew[1] = vec3.dot(row[0], row[2])\n combine(row[2], row[2], row[0], 1.0, -skew[1])\n skew[2] = vec3.dot(row[1], row[2])\n combine(row[2], row[2], row[1], 1.0, -skew[2])\n\n // Next, get Z scale and normalize 3rd row.\n scale[2] = vec3.length(row[2])\n vec3.normalize(row[2], row[2])\n skew[1] /= scale[2]\n skew[2] /= scale[2]\n\n\n // At this point, the matrix (in rows) is orthonormal.\n // Check for a coordinate system flip. If the determinant\n // is -1, then negate the matrix and the scaling factors.\n vec3.cross(pdum3, row[1], row[2])\n if (vec3.dot(row[0], pdum3) < 0) {\n for (var i = 0; i < 3; i++) {\n scale[i] *= -1;\n row[i][0] *= -1\n row[i][1] *= -1\n row[i][2] *= -1\n }\n }\n\n // Now, get the rotations out\n quaternion[0] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] - row[1][1] - row[2][2], 0))\n quaternion[1] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] + row[1][1] - row[2][2], 0))\n quaternion[2] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] - row[1][1] + row[2][2], 0))\n quaternion[3] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] + row[1][1] + row[2][2], 0))\n\n if (row[2][1] > row[1][2])\n quaternion[0] = -quaternion[0]\n if (row[0][2] > row[2][0])\n quaternion[1] = -quaternion[1]\n if (row[1][0] > row[0][1])\n quaternion[2] = -quaternion[2]\n return true\n}\n\n//will be replaced by gl-vec4 eventually\nfunction vec4multMat4(out, a, m) {\n var x = a[0], y = a[1], z = a[2], w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n\n//gets upper-left of a 4x4 matrix into a 3x3 of vectors\nfunction mat3from4(out, mat4x4) {\n out[0][0] = mat4x4[0]\n out[0][1] = mat4x4[1]\n out[0][2] = mat4x4[2]\n \n out[1][0] = mat4x4[4]\n out[1][1] = mat4x4[5]\n out[1][2] = mat4x4[6]\n\n out[2][0] = mat4x4[8]\n out[2][1] = mat4x4[9]\n out[2][2] = mat4x4[10]\n}\n\nfunction combine(out, a, b, scale1, scale2) {\n out[0] = a[0] * scale1 + b[0] * scale2\n out[1] = a[1] * scale1 + b[1] * scale2\n out[2] = a[2] * scale1 + b[2] * scale2\n}","module.exports = function normalize(out, mat) {\n var m44 = mat[15]\n // Cannot normalize.\n if (m44 === 0) \n return false\n var scale = 1 / m44\n for (var i=0; i<16; i++)\n out[i] = mat[i] * scale\n return true\n}","var lerp = require('gl-vec3/lerp')\n\nvar recompose = require('mat4-recompose')\nvar decompose = require('mat4-decompose')\nvar determinant = require('gl-mat4/determinant')\nvar slerp = require('quat-slerp')\n\nvar state0 = state()\nvar state1 = state()\nvar tmp = state()\n\nmodule.exports = interpolate\nfunction interpolate(out, start, end, alpha) {\n if (determinant(start) === 0 || determinant(end) === 0)\n return false\n\n //decompose the start and end matrices into individual components\n var r0 = decompose(start, state0.translate, state0.scale, state0.skew, state0.perspective, state0.quaternion)\n var r1 = decompose(end, state1.translate, state1.scale, state1.skew, state1.perspective, state1.quaternion)\n if (!r0 || !r1)\n return false \n\n\n //now lerp/slerp the start and end components into a temporary lerp(tmptranslate, state0.translate, state1.translate, alpha)\n lerp(tmp.translate, state0.translate, state1.translate, alpha)\n lerp(tmp.skew, state0.skew, state1.skew, alpha)\n lerp(tmp.scale, state0.scale, state1.scale, alpha)\n lerp(tmp.perspective, state0.perspective, state1.perspective, alpha)\n slerp(tmp.quaternion, state0.quaternion, state1.quaternion, alpha)\n\n //and recompose into our 'out' matrix\n recompose(out, tmp.translate, tmp.scale, tmp.skew, tmp.perspective, tmp.quaternion)\n return true\n}\n\nfunction state() {\n return {\n translate: vec3(),\n scale: vec3(1),\n skew: vec3(),\n perspective: vec4(),\n quaternion: vec4()\n }\n}\n\nfunction vec3(n) {\n return [n||0,n||0,n||0]\n}\n\nfunction vec4() {\n return [0,0,0,1]\n}","/*\nInput: translation ; a 3 component vector\n scale ; a 3 component vector\n skew ; skew factors XY,XZ,YZ represented as a 3 component vector\n perspective ; a 4 component vector\n quaternion ; a 4 component vector\nOutput: matrix ; a 4x4 matrix\n\nFrom: http://www.w3.org/TR/css3-transforms/#recomposing-to-a-3d-matrix\n*/\n\nvar mat4 = {\n identity: require('gl-mat4/identity'),\n translate: require('gl-mat4/translate'),\n multiply: require('gl-mat4/multiply'),\n create: require('gl-mat4/create'),\n scale: require('gl-mat4/scale'),\n fromRotationTranslation: require('gl-mat4/fromRotationTranslation')\n}\n\nvar rotationMatrix = mat4.create()\nvar temp = mat4.create()\n\nmodule.exports = function recomposeMat4(matrix, translation, scale, skew, perspective, quaternion) {\n mat4.identity(matrix)\n\n //apply translation & rotation\n mat4.fromRotationTranslation(matrix, quaternion, translation)\n\n //apply perspective\n matrix[3] = perspective[0]\n matrix[7] = perspective[1]\n matrix[11] = perspective[2]\n matrix[15] = perspective[3]\n \n // apply skew\n // temp is a identity 4x4 matrix initially\n mat4.identity(temp)\n\n if (skew[2] !== 0) {\n temp[9] = skew[2]\n mat4.multiply(matrix, matrix, temp)\n }\n\n if (skew[1] !== 0) {\n temp[9] = 0\n temp[8] = skew[1]\n mat4.multiply(matrix, matrix, temp)\n }\n\n if (skew[0] !== 0) {\n temp[8] = 0\n temp[4] = skew[0]\n mat4.multiply(matrix, matrix, temp)\n }\n\n //apply scale\n mat4.scale(matrix, matrix, scale)\n return matrix\n}","'use strict'\n\nvar bsearch = require('binary-search-bounds')\nvar m4interp = require('mat4-interpolate')\nvar invert44 = require('gl-mat4/invert')\nvar rotateX = require('gl-mat4/rotateX')\nvar rotateY = require('gl-mat4/rotateY')\nvar rotateZ = require('gl-mat4/rotateZ')\nvar lookAt = require('gl-mat4/lookAt')\nvar translate = require('gl-mat4/translate')\nvar scale = require('gl-mat4/scale')\nvar normalize = require('gl-vec3/normalize')\n\nvar DEFAULT_CENTER = [0,0,0]\n\nmodule.exports = createMatrixCameraController\n\nfunction MatrixCameraController(initialMatrix) {\n this._components = initialMatrix.slice()\n this._time = [0]\n this.prevMatrix = initialMatrix.slice()\n this.nextMatrix = initialMatrix.slice()\n this.computedMatrix = initialMatrix.slice()\n this.computedInverse = initialMatrix.slice()\n this.computedEye = [0,0,0]\n this.computedUp = [0,0,0]\n this.computedCenter = [0,0,0]\n this.computedRadius = [0]\n this._limits = [-Infinity, Infinity]\n}\n\nvar proto = MatrixCameraController.prototype\n\nproto.recalcMatrix = function(t) {\n var time = this._time\n var tidx = bsearch.le(time, t)\n var mat = this.computedMatrix\n if(tidx < 0) {\n return\n }\n var comps = this._components\n if(tidx === time.length-1) {\n var ptr = 16*tidx\n for(var i=0; i<16; ++i) {\n mat[i] = comps[ptr++]\n }\n } else {\n var dt = (time[tidx+1] - time[tidx])\n var ptr = 16*tidx\n var prev = this.prevMatrix\n var allEqual = true\n for(var i=0; i<16; ++i) {\n prev[i] = comps[ptr++]\n }\n var next = this.nextMatrix\n for(var i=0; i<16; ++i) {\n next[i] = comps[ptr++]\n allEqual = allEqual && (prev[i] === next[i])\n }\n if(dt < 1e-6 || allEqual) {\n for(var i=0; i<16; ++i) {\n mat[i] = prev[i]\n }\n } else {\n m4interp(mat, prev, next, (t - time[tidx])/dt)\n }\n }\n\n var up = this.computedUp\n up[0] = mat[1]\n up[1] = mat[5]\n up[2] = mat[9]\n normalize(up, up)\n\n var imat = this.computedInverse\n invert44(imat, mat)\n var eye = this.computedEye\n var w = imat[15]\n eye[0] = imat[12]/w\n eye[1] = imat[13]/w\n eye[2] = imat[14]/w\n\n var center = this.computedCenter\n var radius = Math.exp(this.computedRadius[0])\n for(var i=0; i<3; ++i) {\n center[i] = eye[i] - mat[2+4*i] * radius\n }\n}\n\nproto.idle = function(t) {\n if(t < this.lastT()) {\n return\n }\n var mc = this._components\n var ptr = mc.length-16\n for(var i=0; i<16; ++i) {\n mc.push(mc[ptr++])\n }\n this._time.push(t)\n}\n\nproto.flush = function(t) {\n var idx = bsearch.gt(this._time, t) - 2\n if(idx < 0) {\n return\n }\n this._time.splice(0, idx)\n this._components.splice(0, 16*idx)\n}\n\nproto.lastT = function() {\n return this._time[this._time.length-1]\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n eye = eye || this.computedEye\n center = center || DEFAULT_CENTER\n up = up || this.computedUp\n this.setMatrix(t, lookAt(this.computedMatrix, eye, center, up))\n var d2 = 0.0\n for(var i=0; i<3; ++i) {\n d2 += Math.pow(center[i] - eye[i], 2)\n }\n d2 = Math.log(Math.sqrt(d2))\n this.computedRadius[0] = d2\n}\n\nproto.rotate = function(t, yaw, pitch, roll) {\n this.recalcMatrix(t)\n var mat = this.computedInverse\n if(yaw) rotateY(mat, mat, yaw)\n if(pitch) rotateX(mat, mat, pitch)\n if(roll) rotateZ(mat, mat, roll)\n this.setMatrix(t, invert44(this.computedMatrix, mat))\n}\n\nvar tvec = [0,0,0]\n\nproto.pan = function(t, dx, dy, dz) {\n tvec[0] = -(dx || 0.0)\n tvec[1] = -(dy || 0.0)\n tvec[2] = -(dz || 0.0)\n this.recalcMatrix(t)\n var mat = this.computedInverse\n translate(mat, mat, tvec)\n this.setMatrix(t, invert44(mat, mat))\n}\n\nproto.translate = function(t, dx, dy, dz) {\n tvec[0] = dx || 0.0\n tvec[1] = dy || 0.0\n tvec[2] = dz || 0.0\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n translate(mat, mat, tvec)\n this.setMatrix(t, mat)\n}\n\nproto.setMatrix = function(t, mat) {\n if(t < this.lastT()) {\n return\n }\n this._time.push(t)\n for(var i=0; i<16; ++i) {\n this._components.push(mat[i])\n }\n}\n\nproto.setDistance = function(t, d) {\n this.computedRadius[0] = d\n}\n\nproto.setDistanceLimits = function(a,b) {\n var lim = this._limits\n lim[0] = a\n lim[1] = b\n}\n\nproto.getDistanceLimits = function(out) {\n var lim = this._limits\n if(out) {\n out[0] = lim[0]\n out[1] = lim[1]\n return out\n }\n return lim\n}\n\nfunction createMatrixCameraController(options) {\n options = options || {}\n var matrix = options.matrix || \n [1,0,0,0,\n 0,1,0,0,\n 0,0,1,0,\n 0,0,0,1]\n return new MatrixCameraController(matrix)\n}\n","'use strict'\n\nmodule.exports = mouseListen\n\nvar mouse = require('mouse-event')\n\nfunction mouseListen (element, callback) {\n if (!callback) {\n callback = element\n element = window\n }\n\n var buttonState = 0\n var x = 0\n var y = 0\n var mods = {\n shift: false,\n alt: false,\n control: false,\n meta: false\n }\n var attached = false\n\n function updateMods (ev) {\n var changed = false\n if ('altKey' in ev) {\n changed = changed || ev.altKey !== mods.alt\n mods.alt = !!ev.altKey\n }\n if ('shiftKey' in ev) {\n changed = changed || ev.shiftKey !== mods.shift\n mods.shift = !!ev.shiftKey\n }\n if ('ctrlKey' in ev) {\n changed = changed || ev.ctrlKey !== mods.control\n mods.control = !!ev.ctrlKey\n }\n if ('metaKey' in ev) {\n changed = changed || ev.metaKey !== mods.meta\n mods.meta = !!ev.metaKey\n }\n return changed\n }\n\n function handleEvent (nextButtons, ev) {\n var nextX = mouse.x(ev)\n var nextY = mouse.y(ev)\n if ('buttons' in ev) {\n nextButtons = ev.buttons | 0\n }\n if (nextButtons !== buttonState ||\n nextX !== x ||\n nextY !== y ||\n updateMods(ev)) {\n buttonState = nextButtons | 0\n x = nextX || 0\n y = nextY || 0\n callback && callback(buttonState, x, y, mods)\n }\n }\n\n function clearState (ev) {\n handleEvent(0, ev)\n }\n\n function handleBlur () {\n if (buttonState ||\n x ||\n y ||\n mods.shift ||\n mods.alt ||\n mods.meta ||\n mods.control) {\n x = y = 0\n buttonState = 0\n mods.shift = mods.alt = mods.control = mods.meta = false\n callback && callback(0, 0, 0, mods)\n }\n }\n\n function handleMods (ev) {\n if (updateMods(ev)) {\n callback && callback(buttonState, x, y, mods)\n }\n }\n\n function handleMouseMove (ev) {\n if (mouse.buttons(ev) === 0) {\n handleEvent(0, ev)\n } else {\n handleEvent(buttonState, ev)\n }\n }\n\n function handleMouseDown (ev) {\n handleEvent(buttonState | mouse.buttons(ev), ev)\n }\n\n function handleMouseUp (ev) {\n handleEvent(buttonState & ~mouse.buttons(ev), ev)\n }\n\n function attachListeners () {\n if (attached) {\n return\n }\n attached = true\n\n element.addEventListener('mousemove', handleMouseMove)\n\n element.addEventListener('mousedown', handleMouseDown)\n\n element.addEventListener('mouseup', handleMouseUp)\n\n element.addEventListener('mouseleave', clearState)\n element.addEventListener('mouseenter', clearState)\n element.addEventListener('mouseout', clearState)\n element.addEventListener('mouseover', clearState)\n\n element.addEventListener('blur', handleBlur)\n\n element.addEventListener('keyup', handleMods)\n element.addEventListener('keydown', handleMods)\n element.addEventListener('keypress', handleMods)\n\n if (element !== window) {\n window.addEventListener('blur', handleBlur)\n\n window.addEventListener('keyup', handleMods)\n window.addEventListener('keydown', handleMods)\n window.addEventListener('keypress', handleMods)\n }\n }\n\n function detachListeners () {\n if (!attached) {\n return\n }\n attached = false\n\n element.removeEventListener('mousemove', handleMouseMove)\n\n element.removeEventListener('mousedown', handleMouseDown)\n\n element.removeEventListener('mouseup', handleMouseUp)\n\n element.removeEventListener('mouseleave', clearState)\n element.removeEventListener('mouseenter', clearState)\n element.removeEventListener('mouseout', clearState)\n element.removeEventListener('mouseover', clearState)\n\n element.removeEventListener('blur', handleBlur)\n\n element.removeEventListener('keyup', handleMods)\n element.removeEventListener('keydown', handleMods)\n element.removeEventListener('keypress', handleMods)\n\n if (element !== window) {\n window.removeEventListener('blur', handleBlur)\n\n window.removeEventListener('keyup', handleMods)\n window.removeEventListener('keydown', handleMods)\n window.removeEventListener('keypress', handleMods)\n }\n }\n\n // Attach listeners\n attachListeners()\n\n var result = {\n element: element\n }\n\n Object.defineProperties(result, {\n enabled: {\n get: function () { return attached },\n set: function (f) {\n if (f) {\n attachListeners()\n } else {\n detachListeners()\n }\n },\n enumerable: true\n },\n buttons: {\n get: function () { return buttonState },\n enumerable: true\n },\n x: {\n get: function () { return x },\n enumerable: true\n },\n y: {\n get: function () { return y },\n enumerable: true\n },\n mods: {\n get: function () { return mods },\n enumerable: true\n }\n })\n\n return result\n}\n","var rootPosition = { left: 0, top: 0 }\n\nmodule.exports = mouseEventOffset\nfunction mouseEventOffset (ev, target, out) {\n target = target || ev.currentTarget || ev.srcElement\n if (!Array.isArray(out)) {\n out = [ 0, 0 ]\n }\n var cx = ev.clientX || 0\n var cy = ev.clientY || 0\n var rect = getBoundingClientOffset(target)\n out[0] = cx - rect.left\n out[1] = cy - rect.top\n return out\n}\n\nfunction getBoundingClientOffset (element) {\n if (element === window ||\n element === document ||\n element === document.body) {\n return rootPosition\n } else {\n return element.getBoundingClientRect()\n }\n}\n","'use strict'\n\nfunction mouseButtons(ev) {\n if(typeof ev === 'object') {\n if('buttons' in ev) {\n return ev.buttons\n } else if('which' in ev) {\n var b = ev.which\n if(b === 2) {\n return 4\n } else if(b === 3) {\n return 2\n } else if(b > 0) {\n return 1<<(b-1)\n }\n } else if('button' in ev) {\n var b = ev.button\n if(b === 1) {\n return 4\n } else if(b === 2) {\n return 2\n } else if(b >= 0) {\n return 1< 0) {\n var l = Math.sqrt(tr + 1.0)\n out[0] = 0.5 * (uz - fy) / l\n out[1] = 0.5 * (fx - rz) / l\n out[2] = 0.5 * (ry - uy) / l\n out[3] = 0.5 * l\n } else {\n var tf = Math.max(rx, uy, fz)\n var l = Math.sqrt(2 * tf - tr + 1.0)\n if(rx >= tf) {\n //x y z order\n out[0] = 0.5 * l\n out[1] = 0.5 * (ux + ry) / l\n out[2] = 0.5 * (fx + rz) / l\n out[3] = 0.5 * (uz - fy) / l\n } else if(uy >= tf) {\n //y z x order\n out[0] = 0.5 * (ry + ux) / l\n out[1] = 0.5 * l\n out[2] = 0.5 * (fy + uz) / l\n out[3] = 0.5 * (fx - rz) / l\n } else {\n //z x y order\n out[0] = 0.5 * (rz + fx) / l\n out[1] = 0.5 * (uz + fy) / l\n out[2] = 0.5 * l\n out[3] = 0.5 * (ry - ux) / l\n }\n }\n return out\n}","'use strict'\n\nmodule.exports = createOrbitController\n\nvar filterVector = require('filtered-vector')\nvar lookAt = require('gl-mat4/lookAt')\nvar mat4FromQuat = require('gl-mat4/fromQuat')\nvar invert44 = require('gl-mat4/invert')\nvar quatFromFrame = require('./lib/quatFromFrame')\n\nfunction len3(x,y,z) {\n return Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2))\n}\n\nfunction len4(w,x,y,z) {\n return Math.sqrt(Math.pow(w,2) + Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2))\n}\n\nfunction normalize4(out, a) {\n var ax = a[0]\n var ay = a[1]\n var az = a[2]\n var aw = a[3]\n var al = len4(ax, ay, az, aw)\n if(al > 1e-6) {\n out[0] = ax/al\n out[1] = ay/al\n out[2] = az/al\n out[3] = aw/al\n } else {\n out[0] = out[1] = out[2] = 0.0\n out[3] = 1.0\n }\n}\n\nfunction OrbitCameraController(initQuat, initCenter, initRadius) {\n this.radius = filterVector([initRadius])\n this.center = filterVector(initCenter)\n this.rotation = filterVector(initQuat)\n\n this.computedRadius = this.radius.curve(0)\n this.computedCenter = this.center.curve(0)\n this.computedRotation = this.rotation.curve(0)\n this.computedUp = [0.1,0,0]\n this.computedEye = [0.1,0,0]\n this.computedMatrix = [0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\n\n this.recalcMatrix(0)\n}\n\nvar proto = OrbitCameraController.prototype\n\nproto.lastT = function() {\n return Math.max(\n this.radius.lastT(),\n this.center.lastT(),\n this.rotation.lastT())\n}\n\nproto.recalcMatrix = function(t) {\n this.radius.curve(t)\n this.center.curve(t)\n this.rotation.curve(t)\n\n var quat = this.computedRotation\n normalize4(quat, quat)\n\n var mat = this.computedMatrix\n mat4FromQuat(mat, quat)\n\n var center = this.computedCenter\n var eye = this.computedEye\n var up = this.computedUp\n var radius = Math.exp(this.computedRadius[0])\n\n eye[0] = center[0] + radius * mat[2]\n eye[1] = center[1] + radius * mat[6]\n eye[2] = center[2] + radius * mat[10]\n up[0] = mat[1]\n up[1] = mat[5]\n up[2] = mat[9]\n\n for(var i=0; i<3; ++i) {\n var rr = 0.0\n for(var j=0; j<3; ++j) {\n rr += mat[i+4*j] * eye[j]\n }\n mat[12+i] = -rr\n }\n}\n\nproto.getMatrix = function(t, result) {\n this.recalcMatrix(t)\n var m = this.computedMatrix\n if(result) {\n for(var i=0; i<16; ++i) {\n result[i] = m[i]\n }\n return result\n }\n return m\n}\n\nproto.idle = function(t) {\n this.center.idle(t)\n this.radius.idle(t)\n this.rotation.idle(t)\n}\n\nproto.flush = function(t) {\n this.center.flush(t)\n this.radius.flush(t)\n this.rotation.flush(t)\n}\n\nproto.pan = function(t, dx, dy, dz) {\n dx = dx || 0.0\n dy = dy || 0.0\n dz = dz || 0.0\n\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n\n var fx = mat[2]\n var fy = mat[6]\n var fz = mat[10]\n var fu = fx * ux + fy * uy + fz * uz\n var fr = fx * rx + fy * ry + fz * rz\n fx -= fu * ux + fr * rx\n fy -= fu * uy + fr * ry\n fz -= fu * uz + fr * rz\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n var vx = rx * dx + ux * dy\n var vy = ry * dx + uy * dy\n var vz = rz * dx + uz * dy\n\n this.center.move(t, vx, vy, vz)\n\n //Update z-component of radius\n var radius = Math.exp(this.computedRadius[0])\n radius = Math.max(1e-4, radius + dz)\n this.radius.set(t, Math.log(radius))\n}\n\nproto.rotate = function(t, dx, dy, dz) {\n this.recalcMatrix(t)\n\n dx = dx||0.0\n dy = dy||0.0\n\n var mat = this.computedMatrix\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n\n var fx = mat[2]\n var fy = mat[6]\n var fz = mat[10]\n\n var qx = dx * rx + dy * ux\n var qy = dx * ry + dy * uy\n var qz = dx * rz + dy * uz\n\n var bx = -(fy * qz - fz * qy)\n var by = -(fz * qx - fx * qz)\n var bz = -(fx * qy - fy * qx) \n var bw = Math.sqrt(Math.max(0.0, 1.0 - Math.pow(bx,2) - Math.pow(by,2) - Math.pow(bz,2)))\n var bl = len4(bx, by, bz, bw)\n if(bl > 1e-6) {\n bx /= bl\n by /= bl\n bz /= bl\n bw /= bl\n } else {\n bx = by = bz = 0.0\n bw = 1.0\n }\n\n var rotation = this.computedRotation\n var ax = rotation[0]\n var ay = rotation[1]\n var az = rotation[2]\n var aw = rotation[3]\n\n var cx = ax*bw + aw*bx + ay*bz - az*by\n var cy = ay*bw + aw*by + az*bx - ax*bz\n var cz = az*bw + aw*bz + ax*by - ay*bx\n var cw = aw*bw - ax*bx - ay*by - az*bz\n \n //Apply roll\n if(dz) {\n bx = fx\n by = fy\n bz = fz\n var s = Math.sin(dz) / len3(bx, by, bz)\n bx *= s\n by *= s\n bz *= s\n bw = Math.cos(dx)\n cx = cx*bw + cw*bx + cy*bz - cz*by\n cy = cy*bw + cw*by + cz*bx - cx*bz\n cz = cz*bw + cw*bz + cx*by - cy*bx\n cw = cw*bw - cx*bx - cy*by - cz*bz\n }\n\n var cl = len4(cx, cy, cz, cw)\n if(cl > 1e-6) {\n cx /= cl\n cy /= cl\n cz /= cl\n cw /= cl\n } else {\n cx = cy = cz = 0.0\n cw = 1.0\n }\n\n this.rotation.set(t, cx, cy, cz, cw)\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n\n center = center || this.computedCenter\n eye = eye || this.computedEye\n up = up || this.computedUp\n\n var mat = this.computedMatrix\n lookAt(mat, eye, center, up)\n\n var rotation = this.computedRotation\n quatFromFrame(rotation,\n mat[0], mat[1], mat[2],\n mat[4], mat[5], mat[6],\n mat[8], mat[9], mat[10])\n normalize4(rotation, rotation)\n this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3])\n\n var fl = 0.0\n for(var i=0; i<3; ++i) {\n fl += Math.pow(center[i] - eye[i], 2)\n }\n this.radius.set(t, 0.5 * Math.log(Math.max(fl, 1e-6)))\n\n this.center.set(t, center[0], center[1], center[2])\n}\n\nproto.translate = function(t, dx, dy, dz) {\n this.center.move(t,\n dx||0.0,\n dy||0.0,\n dz||0.0)\n}\n\nproto.setMatrix = function(t, matrix) {\n\n var rotation = this.computedRotation\n quatFromFrame(rotation,\n matrix[0], matrix[1], matrix[2],\n matrix[4], matrix[5], matrix[6],\n matrix[8], matrix[9], matrix[10])\n normalize4(rotation, rotation)\n this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3])\n\n var mat = this.computedMatrix\n invert44(mat, matrix)\n var w = mat[15]\n if(Math.abs(w) > 1e-6) {\n var cx = mat[12]/w\n var cy = mat[13]/w\n var cz = mat[14]/w\n\n this.recalcMatrix(t) \n var r = Math.exp(this.computedRadius[0])\n this.center.set(t, cx-mat[2]*r, cy-mat[6]*r, cz-mat[10]*r)\n this.radius.idle(t)\n } else {\n this.center.idle(t)\n this.radius.idle(t)\n }\n}\n\nproto.setDistance = function(t, d) {\n if(d > 0) {\n this.radius.set(t, Math.log(d))\n }\n}\n\nproto.setDistanceLimits = function(lo, hi) {\n if(lo > 0) {\n lo = Math.log(lo)\n } else {\n lo = -Infinity \n }\n if(hi > 0) {\n hi = Math.log(hi)\n } else {\n hi = Infinity\n }\n hi = Math.max(hi, lo)\n this.radius.bounds[0][0] = lo\n this.radius.bounds[1][0] = hi\n}\n\nproto.getDistanceLimits = function(out) {\n var bounds = this.radius.bounds\n if(out) {\n out[0] = Math.exp(bounds[0][0])\n out[1] = Math.exp(bounds[1][0])\n return out\n }\n return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ]\n}\n\nproto.toJSON = function() {\n this.recalcMatrix(this.lastT())\n return {\n center: this.computedCenter.slice(),\n rotation: this.computedRotation.slice(),\n distance: Math.log(this.computedRadius[0]),\n zoomMin: this.radius.bounds[0][0],\n zoomMax: this.radius.bounds[1][0]\n }\n}\n\nproto.fromJSON = function(options) {\n var t = this.lastT()\n var c = options.center\n if(c) {\n this.center.set(t, c[0], c[1], c[2])\n }\n var r = options.rotation\n if(r) {\n this.rotation.set(t, r[0], r[1], r[2], r[3])\n }\n var d = options.distance\n if(d && d > 0) {\n this.radius.set(t, Math.log(d))\n }\n this.setDistanceLimits(options.zoomMin, options.zoomMax)\n}\n\nfunction createOrbitController(options) {\n options = options || {}\n var center = options.center || [0,0,0]\n var rotation = options.rotation || [0,0,0,1]\n var radius = options.radius || 1.0\n\n center = [].slice.call(center, 0, 3)\n rotation = [].slice.call(rotation, 0, 4)\n normalize4(rotation, rotation)\n\n var result = new OrbitCameraController(\n rotation,\n center,\n Math.log(radius))\n\n result.setDistanceLimits(options.zoomMin, options.zoomMax)\n\n if('eye' in options || 'up' in options) {\n result.lookAt(0, options.eye, options.center, options.up)\n }\n\n return result\n}","module.exports = function parseUnit(str, out) {\n if (!out)\n out = [ 0, '' ]\n\n str = String(str)\n var num = parseFloat(str, 10)\n out[0] = num\n out[1] = str.match(/[\\d.\\-\\+]*\\s*(.*)/)[1] || ''\n return out\n}","module.exports = require('gl-quat/slerp')","module.exports =\n global.performance &&\n global.performance.now ? function now() {\n return performance.now()\n } : Date.now || function now() {\n return +new Date\n }\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.Stats=t()}(this,function(){\"use strict\";var c=function(){var n=0,l=document.createElement(\"div\");function e(e){return l.appendChild(e.dom),e}function t(e){for(var t=0;t*>(&buffer[offset]);\n let triangles: Array = new Array(20);\n let nextTriangles: Array = new Array();\n for (let i = 0; i < 20; ++i) {\n triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n }\n\n // Create 3-float buffer views into the backing buffer to represent positions\n let vertices: Array = new Array(12);\n for (let i = 0; i < 12; ++i) {\n vertices[i] =new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n }\n\n // Initialize normals for a 20-sided icosahedron\n vertices[0].set([ -X,N,Z,0 ]);\n vertices[1].set([ X,N,Z,0 ]);\n vertices[2].set([ -X,N,-Z,0 ]);\n vertices[3].set([ X,N,-Z,0 ]);\n vertices[4].set([ N,Z,X,0 ]);\n vertices[5].set([ N,Z,-X,0 ]);\n vertices[6].set([ N,-Z,X,0 ]);\n vertices[7].set([ N,-Z,-X,0 ]);\n vertices[8].set([ Z,X,N,0 ]);\n vertices[9].set([ -Z,X, N,0 ]);\n vertices[10].set([ Z,-X,N,0 ]);\n vertices[11].set([ -Z,-X,N,0 ]);\n\n // Initialize indices for a 20-sided icosahedron\n triangles[0].set([ 0,4,1 ]);\n triangles[1].set([ 0,9,4 ]);\n triangles[2].set([ 9,5,4 ]);\n triangles[3].set([ 4,5,8 ]);\n triangles[4].set([ 4,8,1 ]);\n triangles[5].set([ 8,10,1 ]);\n triangles[6].set([ 8,3,10 ]);\n triangles[7].set([ 5,3,8 ]);\n triangles[8].set([ 5,2,3 ]);\n triangles[9].set([ 2,7,3 ]);\n triangles[10].set([ 7,10,3 ]);\n triangles[11].set([ 7,6,10 ]);\n triangles[12].set([ 7,11,6 ]);\n triangles[13].set([ 11,0,6 ]);\n triangles[14].set([ 0,1,6 ],);\n triangles[15].set([ 6,1,10 ]);\n triangles[16].set([ 9,0,11 ]);\n triangles[17].set([ 9,11,2 ]);\n triangles[18].set([ 9,2,5 ]);\n triangles[19].set([ 7,2,11 ]);\n\n // This loop subdivides the icosahedron\n for (let s = 0; s < this.subdivisions; ++s) {\n b = 1 - b;\n nextTriangles.length = triangles.length * 4;\n let triangleIdx = 0;\n\n // edgeMap maps a pair of vertex indices to a vertex index at their midpoint\n // The function `mid` will get that midpoint vertex if it has already been created\n // or it will create the vertex and add it to the map\n let edgeMap: Map = new Map();\n function mid(v0: number, v1: number): number {\n let key = [v0, v1].sort().join('_');\n if (!edgeMap.has(key)) {\n let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n vec4.add(midpoint, vertices[v0], vertices[v1]);\n vec4.normalize(midpoint, midpoint);\n edgeMap.set(key, vertices.length);\n vertices.push(midpoint);\n }\n return edgeMap.get(key);\n }\n\n for (let t = 0; t < triangles.length; ++t) {\n let v0 = triangles[t][0];\n let v1 = triangles[t][1];\n let v2 = triangles[t][2];\n let v3 = mid(v0, v1); // Get or create a vertex between these two vertices\n let v4 = mid(v1, v2);\n let v5 = mid(v2, v0);\n\n let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n\n let triangleOffset = nextTriangles.length;\n t0.set([v0, v3, v5]);\n t1.set([v3, v4, v5]);\n t2.set([v3, v1, v4]);\n t3.set([v5, v4, v2]);\n }\n\n // swap buffers\n let temp = triangles;\n triangles = nextTriangles;\n nextTriangles = temp;\n }\n\n if (b === 1) {\n // if indices did not end up in buffer0, copy them there now\n let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length);\n let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length);\n temp0.set(temp1);\n }\n\n // Populate one position for each normal\n for (let i = 0; i < vertices.length; ++i) {\n let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n vec4.scaleAndAdd(pos, this.center, vertices[i], this.radius);\n }\n\n this.buffer = buffer0;\n this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3);\n this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4);\n this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4);\n\n this.generateIdx();\n this.generatePos();\n this.generateNor();\n\n this.count = this.indices.length;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW);\n\n console.log(`Created icosphere with ${vertices.length} vertices`);\n }\n};\n\nexport default Icosphere;\n","import {vec3, vec4} from 'gl-matrix';\nimport Drawable from '../rendering/gl/Drawable';\nimport {gl} from '../globals';\n\nclass Square extends Drawable {\n indices: Uint32Array;\n positions: Float32Array;\n normals: Float32Array;\n center: vec4;\n\n constructor(center: vec3) {\n super(); // Call the constructor of the super class. This is required.\n this.center = vec4.fromValues(center[0], center[1], center[2], 1);\n }\n\n create() {\n\n this.indices = new Uint32Array([0, 1, 2,\n 0, 2, 3]);\n this.normals = new Float32Array([0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0]);\n this.positions = new Float32Array([-1, -1, 0, 1,\n 1, -1, 0, 1,\n 1, 1, 0, 1,\n -1, 1, 0, 1]);\n\n this.generateIdx();\n this.generatePos();\n this.generateNor();\n\n this.count = this.indices.length;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW);\n\n console.log(`Created square`);\n }\n};\n\nexport default Square;\n","\nexport var gl: WebGL2RenderingContext;\nexport function setGL(_gl: WebGL2RenderingContext) {\n gl = _gl;\n}\n","import {gl} from '../../globals';\n\nabstract class Drawable {\n count: number = 0;\n\n bufIdx: WebGLBuffer;\n bufPos: WebGLBuffer;\n bufNor: WebGLBuffer;\n\n idxBound: boolean = false;\n posBound: boolean = false;\n norBound: boolean = false;\n\n abstract create() : void;\n\n destory() {\n gl.deleteBuffer(this.bufIdx);\n gl.deleteBuffer(this.bufPos);\n gl.deleteBuffer(this.bufNor);\n }\n\n generateIdx() {\n this.idxBound = true;\n this.bufIdx = gl.createBuffer();\n }\n\n generatePos() {\n this.posBound = true;\n this.bufPos = gl.createBuffer();\n }\n\n generateNor() {\n this.norBound = true;\n this.bufNor = gl.createBuffer();\n }\n\n bindIdx(): boolean {\n if (this.idxBound) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n }\n return this.idxBound;\n }\n\n bindPos(): boolean {\n if (this.posBound) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n }\n return this.posBound;\n }\n\n bindNor(): boolean {\n if (this.norBound) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n }\n return this.norBound;\n }\n\n elemCount(): number {\n return this.count;\n }\n\n drawMode(): GLenum {\n return gl.TRIANGLES;\n }\n};\n\nexport default Drawable;\n","import {mat4, vec4} from 'gl-matrix';\nimport Drawable from './Drawable';\nimport Camera from '../../Camera';\nimport {gl} from '../../globals';\nimport ShaderProgram from './ShaderProgram';\n\n// In this file, `gl` is accessible because it is imported above\nclass OpenGLRenderer {\n constructor(public canvas: HTMLCanvasElement) {\n }\n\n setClearColor(r: number, g: number, b: number, a: number) {\n gl.clearColor(r, g, b, a);\n }\n\n setSize(width: number, height: number) {\n this.canvas.width = width;\n this.canvas.height = height;\n }\n\n clear() {\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n }\n\n render(camera: Camera, prog: ShaderProgram, drawables: Array) {\n let model = mat4.create();\n let viewProj = mat4.create();\n let color = vec4.fromValues(1, 0, 0, 1);\n\n mat4.identity(model);\n mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix);\n prog.setModelMatrix(model);\n prog.setViewProjMatrix(viewProj);\n prog.setGeometryColor(color);\n\n for (let drawable of drawables) {\n prog.draw(drawable);\n }\n }\n};\n\nexport default OpenGLRenderer;\n","import {vec4, mat4} from 'gl-matrix';\nimport Drawable from './Drawable';\nimport {gl} from '../../globals';\n\nvar activeProgram: WebGLProgram = null;\n\nexport class Shader {\n shader: WebGLShader;\n\n constructor(type: number, source: string) {\n this.shader = gl.createShader(type);\n gl.shaderSource(this.shader, source);\n gl.compileShader(this.shader);\n\n if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) {\n throw gl.getShaderInfoLog(this.shader);\n }\n }\n};\n\nclass ShaderProgram {\n prog: WebGLProgram;\n\n attrPos: number;\n attrNor: number;\n attrCol: number;\n\n unifModel: WebGLUniformLocation;\n unifModelInvTr: WebGLUniformLocation;\n unifViewProj: WebGLUniformLocation;\n unifColor: WebGLUniformLocation;\n\n constructor(shaders: Array) {\n this.prog = gl.createProgram();\n\n for (let shader of shaders) {\n gl.attachShader(this.prog, shader.shader);\n }\n gl.linkProgram(this.prog);\n if (!gl.getProgramParameter(this.prog, gl.LINK_STATUS)) {\n throw gl.getProgramInfoLog(this.prog);\n }\n\n this.attrPos = gl.getAttribLocation(this.prog, \"vs_Pos\");\n this.attrNor = gl.getAttribLocation(this.prog, \"vs_Nor\");\n this.attrCol = gl.getAttribLocation(this.prog, \"vs_Col\");\n this.unifModel = gl.getUniformLocation(this.prog, \"u_Model\");\n this.unifModelInvTr = gl.getUniformLocation(this.prog, \"u_ModelInvTr\");\n this.unifViewProj = gl.getUniformLocation(this.prog, \"u_ViewProj\");\n this.unifColor = gl.getUniformLocation(this.prog, \"u_Color\");\n }\n\n use() {\n if (activeProgram !== this.prog) {\n gl.useProgram(this.prog);\n activeProgram = this.prog;\n }\n }\n\n setModelMatrix(model: mat4) {\n this.use();\n if (this.unifModel !== -1) {\n gl.uniformMatrix4fv(this.unifModel, false, model);\n }\n\n if (this.unifModelInvTr !== -1) {\n let modelinvtr: mat4 = mat4.create();\n mat4.transpose(modelinvtr, model);\n mat4.invert(modelinvtr, modelinvtr);\n gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr);\n }\n }\n\n setViewProjMatrix(vp: mat4) {\n this.use();\n if (this.unifViewProj !== -1) {\n gl.uniformMatrix4fv(this.unifViewProj, false, vp);\n }\n }\n\n setGeometryColor(color: vec4) {\n this.use();\n if (this.unifColor !== -1) {\n gl.uniform4fv(this.unifColor, color);\n }\n }\n\n draw(d: Drawable) {\n this.use();\n\n if (this.attrPos != -1 && d.bindPos()) {\n gl.enableVertexAttribArray(this.attrPos);\n gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0);\n }\n\n if (this.attrNor != -1 && d.bindNor()) {\n gl.enableVertexAttribArray(this.attrNor);\n gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0);\n }\n\n d.bindIdx();\n gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0);\n\n if (this.attrPos != -1) gl.disableVertexAttribArray(this.attrPos);\n if (this.attrNor != -1) gl.disableVertexAttribArray(this.attrNor);\n }\n};\n\nexport default ShaderProgram;\n","'use strict'\n\nmodule.exports = createTurntableController\n\nvar filterVector = require('filtered-vector')\nvar invert44 = require('gl-mat4/invert')\nvar rotateM = require('gl-mat4/rotate')\nvar cross = require('gl-vec3/cross')\nvar normalize3 = require('gl-vec3/normalize')\nvar dot3 = require('gl-vec3/dot')\n\nfunction len3(x, y, z) {\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2))\n}\n\nfunction clamp1(x) {\n return Math.min(1.0, Math.max(-1.0, x))\n}\n\nfunction findOrthoPair(v) {\n var vx = Math.abs(v[0])\n var vy = Math.abs(v[1])\n var vz = Math.abs(v[2])\n\n var u = [0,0,0]\n if(vx > Math.max(vy, vz)) {\n u[2] = 1\n } else if(vy > Math.max(vx, vz)) {\n u[0] = 1\n } else {\n u[1] = 1\n }\n\n var vv = 0\n var uv = 0\n for(var i=0; i<3; ++i ) {\n vv += v[i] * v[i]\n uv += u[i] * v[i]\n }\n for(var i=0; i<3; ++i) {\n u[i] -= (uv / vv) * v[i]\n }\n normalize3(u, u)\n return u\n}\n\nfunction TurntableController(zoomMin, zoomMax, center, up, right, radius, theta, phi) {\n this.center = filterVector(center)\n this.up = filterVector(up)\n this.right = filterVector(right)\n this.radius = filterVector([radius])\n this.angle = filterVector([theta, phi])\n this.angle.bounds = [[-Infinity,-Math.PI/2], [Infinity,Math.PI/2]]\n this.setDistanceLimits(zoomMin, zoomMax)\n\n this.computedCenter = this.center.curve(0)\n this.computedUp = this.up.curve(0)\n this.computedRight = this.right.curve(0)\n this.computedRadius = this.radius.curve(0)\n this.computedAngle = this.angle.curve(0)\n this.computedToward = [0,0,0]\n this.computedEye = [0,0,0]\n this.computedMatrix = new Array(16)\n for(var i=0; i<16; ++i) {\n this.computedMatrix[i] = 0.5\n }\n\n this.recalcMatrix(0)\n}\n\nvar proto = TurntableController.prototype\n\nproto.setDistanceLimits = function(minDist, maxDist) {\n if(minDist > 0) {\n minDist = Math.log(minDist)\n } else {\n minDist = -Infinity\n }\n if(maxDist > 0) {\n maxDist = Math.log(maxDist)\n } else {\n maxDist = Infinity\n }\n maxDist = Math.max(maxDist, minDist)\n this.radius.bounds[0][0] = minDist\n this.radius.bounds[1][0] = maxDist\n}\n\nproto.getDistanceLimits = function(out) {\n var bounds = this.radius.bounds[0]\n if(out) {\n out[0] = Math.exp(bounds[0][0])\n out[1] = Math.exp(bounds[1][0])\n return out\n }\n return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ]\n}\n\nproto.recalcMatrix = function(t) {\n //Recompute curves\n this.center.curve(t)\n this.up.curve(t)\n this.right.curve(t)\n this.radius.curve(t)\n this.angle.curve(t)\n\n //Compute frame for camera matrix\n var up = this.computedUp\n var right = this.computedRight\n var uu = 0.0\n var ur = 0.0\n for(var i=0; i<3; ++i) {\n ur += up[i] * right[i]\n uu += up[i] * up[i]\n }\n var ul = Math.sqrt(uu)\n var rr = 0.0\n for(var i=0; i<3; ++i) {\n right[i] -= up[i] * ur / uu\n rr += right[i] * right[i]\n up[i] /= ul\n }\n var rl = Math.sqrt(rr)\n for(var i=0; i<3; ++i) {\n right[i] /= rl\n }\n\n //Compute toward vector\n var toward = this.computedToward\n cross(toward, up, right)\n normalize3(toward, toward)\n\n //Compute angular parameters\n var radius = Math.exp(this.computedRadius[0])\n var theta = this.computedAngle[0]\n var phi = this.computedAngle[1]\n\n var ctheta = Math.cos(theta)\n var stheta = Math.sin(theta)\n var cphi = Math.cos(phi)\n var sphi = Math.sin(phi)\n\n var center = this.computedCenter\n\n var wx = ctheta * cphi \n var wy = stheta * cphi\n var wz = sphi\n\n var sx = -ctheta * sphi\n var sy = -stheta * sphi\n var sz = cphi\n\n var eye = this.computedEye\n var mat = this.computedMatrix\n for(var i=0; i<3; ++i) {\n var x = wx * right[i] + wy * toward[i] + wz * up[i]\n mat[4*i+1] = sx * right[i] + sy * toward[i] + sz * up[i]\n mat[4*i+2] = x\n mat[4*i+3] = 0.0\n }\n\n var ax = mat[1]\n var ay = mat[5]\n var az = mat[9]\n var bx = mat[2]\n var by = mat[6]\n var bz = mat[10]\n var cx = ay * bz - az * by\n var cy = az * bx - ax * bz\n var cz = ax * by - ay * bx\n var cl = len3(cx, cy, cz)\n cx /= cl\n cy /= cl\n cz /= cl\n mat[0] = cx\n mat[4] = cy\n mat[8] = cz\n\n for(var i=0; i<3; ++i) {\n eye[i] = center[i] + mat[2+4*i]*radius\n }\n\n for(var i=0; i<3; ++i) {\n var rr = 0.0\n for(var j=0; j<3; ++j) {\n rr += mat[i+4*j] * eye[j]\n }\n mat[12+i] = -rr\n }\n mat[15] = 1.0\n}\n\nproto.getMatrix = function(t, result) {\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n if(result) {\n for(var i=0; i<16; ++i) {\n result[i] = mat[i]\n }\n return result\n }\n return mat\n}\n\nvar zAxis = [0,0,0]\nproto.rotate = function(t, dtheta, dphi, droll) {\n this.angle.move(t, dtheta, dphi)\n if(droll) {\n this.recalcMatrix(t)\n\n var mat = this.computedMatrix\n zAxis[0] = mat[2]\n zAxis[1] = mat[6]\n zAxis[2] = mat[10]\n\n var up = this.computedUp\n var right = this.computedRight\n var toward = this.computedToward\n\n for(var i=0; i<3; ++i) {\n mat[4*i] = up[i]\n mat[4*i+1] = right[i]\n mat[4*i+2] = toward[i]\n }\n rotateM(mat, mat, droll, zAxis)\n for(var i=0; i<3; ++i) {\n up[i] = mat[4*i]\n right[i] = mat[4*i+1]\n }\n\n this.up.set(t, up[0], up[1], up[2])\n this.right.set(t, right[0], right[1], right[2])\n }\n}\n\nproto.pan = function(t, dx, dy, dz) {\n dx = dx || 0.0\n dy = dy || 0.0\n dz = dz || 0.0\n\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n\n var dist = Math.exp(this.computedRadius[0])\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n\n var vx = rx * dx + ux * dy\n var vy = ry * dx + uy * dy\n var vz = rz * dx + uz * dy\n this.center.move(t, vx, vy, vz)\n\n //Update z-component of radius\n var radius = Math.exp(this.computedRadius[0])\n radius = Math.max(1e-4, radius + dz)\n this.radius.set(t, Math.log(radius))\n}\n\nproto.translate = function(t, dx, dy, dz) {\n this.center.move(t,\n dx||0.0,\n dy||0.0,\n dz||0.0)\n}\n\n//Recenters the coordinate axes\nproto.setMatrix = function(t, mat, axes, noSnap) {\n \n //Get the axes for tare\n var ushift = 1\n if(typeof axes === 'number') {\n ushift = (axes)|0\n } \n if(ushift < 0 || ushift > 3) {\n ushift = 1\n }\n var vshift = (ushift + 2) % 3\n var fshift = (ushift + 1) % 3\n\n //Recompute state for new t value\n if(!mat) { \n this.recalcMatrix(t)\n mat = this.computedMatrix\n }\n\n //Get right and up vectors\n var ux = mat[ushift]\n var uy = mat[ushift+4]\n var uz = mat[ushift+8]\n if(!noSnap) {\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n } else {\n var ax = Math.abs(ux)\n var ay = Math.abs(uy)\n var az = Math.abs(uz)\n var am = Math.max(ax,ay,az)\n if(ax === am) {\n ux = (ux < 0) ? -1 : 1\n uy = uz = 0\n } else if(az === am) {\n uz = (uz < 0) ? -1 : 1\n ux = uy = 0\n } else {\n uy = (uy < 0) ? -1 : 1\n ux = uz = 0\n }\n }\n\n var rx = mat[vshift]\n var ry = mat[vshift+4]\n var rz = mat[vshift+8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n \n var fx = uy * rz - uz * ry\n var fy = uz * rx - ux * rz\n var fz = ux * ry - uy * rx\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n this.center.jump(t, ex, ey, ez)\n this.radius.idle(t)\n this.up.jump(t, ux, uy, uz)\n this.right.jump(t, rx, ry, rz)\n\n var phi, theta\n if(ushift === 2) {\n var cx = mat[1]\n var cy = mat[5]\n var cz = mat[9]\n var cr = cx * rx + cy * ry + cz * rz\n var cf = cx * fx + cy * fy + cz * fz\n if(tu < 0) {\n phi = -Math.PI/2\n } else {\n phi = Math.PI/2\n }\n theta = Math.atan2(cf, cr)\n } else {\n var tx = mat[2]\n var ty = mat[6]\n var tz = mat[10]\n var tu = tx * ux + ty * uy + tz * uz\n var tr = tx * rx + ty * ry + tz * rz\n var tf = tx * fx + ty * fy + tz * fz\n\n phi = Math.asin(clamp1(tu))\n theta = Math.atan2(tf, tr)\n }\n\n this.angle.jump(t, theta, phi)\n\n this.recalcMatrix(t)\n var dx = mat[2]\n var dy = mat[6]\n var dz = mat[10]\n\n var imat = this.computedMatrix\n invert44(imat, mat)\n var w = imat[15]\n var ex = imat[12] / w\n var ey = imat[13] / w\n var ez = imat[14] / w\n\n var gs = Math.exp(this.computedRadius[0])\n this.center.jump(t, ex-dx*gs, ey-dy*gs, ez-dz*gs)\n}\n\nproto.lastT = function() {\n return Math.max(\n this.center.lastT(),\n this.up.lastT(),\n this.right.lastT(),\n this.radius.lastT(),\n this.angle.lastT())\n}\n\nproto.idle = function(t) {\n this.center.idle(t)\n this.up.idle(t)\n this.right.idle(t)\n this.radius.idle(t)\n this.angle.idle(t)\n}\n\nproto.flush = function(t) {\n this.center.flush(t)\n this.up.flush(t)\n this.right.flush(t)\n this.radius.flush(t)\n this.angle.flush(t)\n}\n\nproto.setDistance = function(t, d) {\n if(d > 0) {\n this.radius.set(t, Math.log(d))\n }\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n\n eye = eye || this.computedEye\n center = center || this.computedCenter\n up = up || this.computedUp\n\n var ux = up[0]\n var uy = up[1]\n var uz = up[2]\n var ul = len3(ux, uy, uz)\n if(ul < 1e-6) {\n return\n }\n ux /= ul\n uy /= ul\n uz /= ul\n\n var tx = eye[0] - center[0]\n var ty = eye[1] - center[1]\n var tz = eye[2] - center[2]\n var tl = len3(tx, ty, tz)\n if(tl < 1e-6) {\n return\n }\n tx /= tl\n ty /= tl\n tz /= tl\n\n var right = this.computedRight\n var rx = right[0]\n var ry = right[1]\n var rz = right[2]\n var ru = ux*rx + uy*ry + uz*rz\n rx -= ru * ux\n ry -= ru * uy\n rz -= ru * uz\n var rl = len3(rx, ry, rz)\n\n if(rl < 0.01) {\n rx = uy * tz - uz * ty\n ry = uz * tx - ux * tz\n rz = ux * ty - uy * tx\n rl = len3(rx, ry, rz)\n if(rl < 1e-6) {\n return\n }\n }\n rx /= rl\n ry /= rl\n rz /= rl\n\n this.up.set(t, ux, uy, uz)\n this.right.set(t, rx, ry, rz)\n this.center.set(t, center[0], center[1], center[2])\n this.radius.set(t, Math.log(tl))\n\n var fx = uy * rz - uz * ry\n var fy = uz * rx - ux * rz\n var fz = ux * ry - uy * rx\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n var tu = ux*tx + uy*ty + uz*tz\n var tr = rx*tx + ry*ty + rz*tz\n var tf = fx*tx + fy*ty + fz*tz\n\n var phi = Math.asin(clamp1(tu))\n var theta = Math.atan2(tf, tr)\n\n var angleState = this.angle._state\n var lastTheta = angleState[angleState.length-1]\n var lastPhi = angleState[angleState.length-2]\n lastTheta = lastTheta % (2.0 * Math.PI)\n var dp = Math.abs(lastTheta + 2.0 * Math.PI - theta)\n var d0 = Math.abs(lastTheta - theta)\n var dn = Math.abs(lastTheta - 2.0 * Math.PI - theta)\n if(dp < d0) {\n lastTheta += 2.0 * Math.PI\n }\n if(dn < d0) {\n lastTheta -= 2.0 * Math.PI\n }\n\n this.angle.jump(this.angle.lastT(), lastTheta, lastPhi)\n this.angle.set(t, theta, phi)\n}\n\nfunction createTurntableController(options) {\n options = options || {}\n\n var center = options.center || [0,0,0]\n var up = options.up || [0,1,0]\n var right = options.right || findOrthoPair(up)\n var radius = options.radius || 1.0\n var theta = options.theta || 0.0\n var phi = options.phi || 0.0\n\n center = [].slice.call(center, 0, 3)\n\n up = [].slice.call(up, 0, 3)\n normalize3(up, up)\n\n right = [].slice.call(right, 0, 3)\n normalize3(right, right)\n\n if('eye' in options) {\n var eye = options.eye\n var toward = [\n eye[0]-center[0],\n eye[1]-center[1],\n eye[2]-center[2]\n ]\n cross(right, toward, up)\n if(len3(right[0], right[1], right[2]) < 1e-6) {\n right = findOrthoPair(up)\n } else {\n normalize3(right, right)\n }\n\n radius = len3(toward[0], toward[1], toward[2])\n\n var ut = dot3(up, toward) / radius\n var rt = dot3(right, toward) / radius\n phi = Math.acos(ut)\n theta = Math.acos(rt)\n }\n\n //Use logarithmic coordinates for radius\n radius = Math.log(radius)\n\n //Return the controller\n return new TurntableController(\n options.zoomMin,\n options.zoomMax,\n center,\n up,\n right,\n radius,\n theta,\n phi)\n}","module.exports = \"#version 300 es\\n\\n// This is a fragment shader. If you've opened this file first, please\\n// open and read lambert.vert.glsl before reading on.\\n// Unlike the vertex shader, the fragment shader actually does compute\\n// the shading of geometry. For every pixel in your program's output\\n// screen, the fragment shader is run for every bit of geometry that\\n// particular pixel overlaps. By implicitly interpolating the position\\n// data passed into the fragment shader by the vertex shader, the fragment shader\\n// can compute what color to apply to its pixel based on things like vertex\\n// position, light position, and vertex color.\\nprecision highp float;\\n\\nuniform vec4 u_Color; // The color with which to render this instance of geometry.\\n\\n// These are the interpolated values out of the rasterizer, so you can't know\\n// their specific values without knowing the vertices that contributed to them\\nin vec4 fs_Nor;\\nin vec4 fs_LightVec;\\nin vec4 fs_Col;\\n\\nout vec4 out_Col; // This is the final output color that you will see on your\\n // screen for the pixel that is currently being processed.\\n\\nvoid main()\\n{\\n // Material base color (before shading)\\n vec4 diffuseColor = u_Color;\\n\\n // Calculate the diffuse term for Lambert shading\\n float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec));\\n // Avoid negative lighting values\\n // diffuseTerm = clamp(diffuseTerm, 0, 1);\\n\\n float ambientTerm = 0.2;\\n\\n float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier\\n //to simulate ambient lighting. This ensures that faces that are not\\n //lit by our point light are not completely black.\\n\\n // Compute final shaded color\\n out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a);\\n}\\n\"","module.exports = \"#version 300 es\\n\\n//This is a vertex shader. While it is called a \\\"shader\\\" due to outdated conventions, this file\\n//is used to apply matrix transformations to the arrays of vertex data passed to it.\\n//Since this code is run on your GPU, each vertex is transformed simultaneously.\\n//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time.\\n//This simultaneous transformation allows your program to run much faster, especially when rendering\\n//geometry with millions of vertices.\\n\\nuniform mat4 u_Model; // The matrix that defines the transformation of the\\n // object we're rendering. In this assignment,\\n // this will be the result of traversing your scene graph.\\n\\nuniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix.\\n // This allows us to transform the object's normals properly\\n // if the object has been non-uniformly scaled.\\n\\nuniform mat4 u_ViewProj; // The matrix that defines the camera's transformation.\\n // We've written a static matrix for you to use for HW2,\\n // but in HW3 you'll have to generate one yourself\\n\\nin vec4 vs_Pos; // The array of vertex positions passed to the shader\\n\\nin vec4 vs_Nor; // The array of vertex normals passed to the shader\\n\\nin vec4 vs_Col; // The array of vertex colors passed to the shader.\\n\\nout vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader.\\nout vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader.\\nout vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader.\\n\\nconst vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of\\n //the geometry in the fragment shader.\\n\\nvoid main()\\n{\\n fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation\\n\\n mat3 invTranspose = mat3(u_ModelInvTr);\\n fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation.\\n // Transform the geometry's normals by the inverse transpose of the\\n // model matrix. This is necessary to ensure the normals remain\\n // perpendicular to the surface after the surface is transformed by\\n // the model matrix.\\n\\n\\n vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below\\n\\n fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies\\n\\n gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is\\n // used to render the final positions of the geometry's vertices\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {vec3} from 'gl-matrix';\nconst Stats = require('stats-js');\nimport * as DAT from 'dat.gui';\nimport Icosphere from './geometry/Icosphere';\nimport Square from './geometry/Square';\nimport OpenGLRenderer from './rendering/gl/OpenGLRenderer';\nimport Camera from './Camera';\nimport {setGL} from './globals';\nimport ShaderProgram, {Shader} from './rendering/gl/ShaderProgram';\n\n// Define an object with application parameters and button callbacks\n// This will be referred to by dat.GUI's functions that add GUI elements.\nconst controls = {\n tesselations: 5,\n 'Load Scene': loadScene, // A function pointer, essentially\n};\n\nlet icosphere: Icosphere;\nlet square: Square;\nlet prevTesselations: number = 5;\n\nfunction loadScene() {\n icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, controls.tesselations);\n icosphere.create();\n square = new Square(vec3.fromValues(0, 0, 0));\n square.create();\n}\n\nfunction main() {\n // Initial display for framerate\n const stats = Stats();\n stats.setMode(0);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n // Add controls to the gui\n const gui = new DAT.GUI();\n gui.add(controls, 'tesselations', 0, 8).step(1);\n gui.add(controls, 'Load Scene');\n\n // get canvas and webgl context\n const canvas = document.getElementById('canvas');\n const gl = canvas.getContext('webgl2');\n if (!gl) {\n alert('WebGL 2 not supported!');\n }\n // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module.\n // Later, we can import `gl` from `globals.ts` to access it\n setGL(gl);\n\n // Initial call to load scene\n loadScene();\n\n const camera = new Camera(vec3.fromValues(0, 0, 5), vec3.fromValues(0, 0, 0));\n\n const renderer = new OpenGLRenderer(canvas);\n renderer.setClearColor(0.2, 0.2, 0.2, 1);\n gl.enable(gl.DEPTH_TEST);\n\n const lambert = new ShaderProgram([\n new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')),\n new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')),\n ]);\n\n // This function will be called every frame\n function tick() {\n camera.update();\n stats.begin();\n gl.viewport(0, 0, window.innerWidth, window.innerHeight);\n renderer.clear();\n if(controls.tesselations != prevTesselations)\n {\n prevTesselations = controls.tesselations;\n icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations);\n icosphere.create();\n }\n renderer.render(camera, lambert, [\n icosphere,\n // square,\n ]);\n stats.end();\n\n // Tell the browser to call `tick` again whenever it renders a new frame\n requestAnimationFrame(tick);\n }\n\n window.addEventListener('resize', function() {\n renderer.setSize(window.innerWidth, window.innerHeight);\n camera.setAspectRatio(window.innerWidth / window.innerHeight);\n camera.updateProjectionMatrix();\n }, false);\n\n renderer.setSize(window.innerWidth, window.innerHeight);\n camera.setAspectRatio(window.innerWidth / window.innerHeight);\n camera.updateProjectionMatrix();\n\n // Start the render loop\n tick();\n}\n\nmain();\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 00000000..6d5f19b2 --- /dev/null +++ b/dist/index.html @@ -0,0 +1,20 @@ + + + + Project 1: Noisy Planets | CIS 566 + + + + + + + diff --git a/img/HW00-CustomShader-01.png b/img/HW00-CustomShader-01.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f0c0548bc49efbc73e1ff2e1ef6388c9103b6b GIT binary patch literal 164519 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 literal 0 HcmV?d00001 diff --git a/img/HW00-CustomShader-02.png b/img/HW00-CustomShader-02.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c8846fcc2d5a8e6b08575275cd08acf016dd64 GIT binary patch literal 134945 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�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 Ioxb>g0TG5i;{X5v literal 0 HcmV?d00001 diff --git a/img/HW00-LambertShader.png b/img/HW00-LambertShader.png new file mode 100644 index 0000000000000000000000000000000000000000..cee143be92c3381111f48eabad3b20d48bbd3017 GIT binary patch literal 109008 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 AB>(^b literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..e1a47a34 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3120 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "3d-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.1.tgz", + "integrity": "sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA==", + "requires": { + "matrix-camera-controller": "^2.1.1", + "orbit-camera-controller": "^4.0.0", + "turntable-camera-controller": "^3.0.0" + } + }, + "3d-view-controls": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", + "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", + "requires": { + "3d-view": "^2.0.0", + "has-passive-events": "^1.0.0", + "mouse-change": "^1.1.1", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.0.2", + "right-now": "^1.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/dat.gui": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.7.tgz", + "integrity": "sha512-CxLCme0He5Jk3uQwfO/fGZMyNhb/ypANzqX0yU9lviBQMlen5SOvQTBQ/Cd9x5mFlUAK5Tk8RgvTyLj1nYkz+w==", + "dev": true + }, + "@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/node": { + "version": "9.6.61", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.61.tgz", + "integrity": "sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==", + "dev": true + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "@types/webgl2": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.6.tgz", + "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", + "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", + "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", + "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", + "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.0.tgz", + "integrity": "sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001254", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.830", + "escalade": "^3.1.1", + "node-releases": "^1.1.75" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caniuse-lite": { + "version": "1.0.30001255", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", + "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cubic-hermite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", + "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" + }, + "dat.gui": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.7.tgz", + "integrity": "sha512-sRl/28gF/XRC5ywC9I4zriATTsQcpSsRG7seXCPnTkK8/EQMIbCu5NPMpICLGxX9ZEUvcXR3ArLYCtgreFoMDw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.832", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.832.tgz", + "integrity": "sha512-x7lO8tGoW0CyV53qON4Lb5Rok9ipDelNdBIAiYUZ03dqy4u9vohMM1qV047+s/hiyJiqUWX/3PNwkX3kexX5ig==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "enhanced-resolve": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "filtered-vector": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.5.tgz", + "integrity": "sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw==", + "requires": { + "binary-search-bounds": "^2.0.0", + "cubic-hermite": "^1.0.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", + "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=", + "dev": true + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "gl-mat3": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", + "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" + }, + "gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "gl-matrix": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", + "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + }, + "gl-quat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", + "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", + "requires": { + "gl-mat3": "^1.0.0", + "gl-vec3": "^1.0.3", + "gl-vec4": "^1.0.0" + } + }, + "gl-vec3": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", + "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" + }, + "gl-vec4": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", + "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-ip": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", + "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", + "dev": true, + "requires": { + "default-gateway": "^6.0.0", + "ipaddr.js": "^1.9.1", + "is-ip": "^3.1.0", + "p-event": "^4.2.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, + "requires": { + "ip-regex": "^4.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", + "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "mat4-decompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", + "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2" + } + }, + "mat4-interpolate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", + "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2", + "mat4-decompose": "^1.0.3", + "mat4-recompose": "^1.0.3", + "quat-slerp": "^1.0.0" + } + }, + "mat4-recompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", + "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", + "requires": { + "gl-mat4": "^1.0.1" + } + }, + "matrix-camera-controller": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz", + "integrity": "sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA==", + "requires": { + "binary-search-bounds": "^2.0.0", + "gl-mat4": "^1.1.2", + "gl-vec3": "^1.0.3", + "mat4-interpolate": "^1.0.3" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + } + } + }, + "memfs": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.4.tgz", + "integrity": "sha512-2mDCPhuduRPOxlfgsXF9V+uqC6Jgz8zt/bNe4d4W7d5f6pCzHrWkxLNr17jKGXd4+j2kQNsAG2HARPnt74sqVQ==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "requires": { + "mouse-event": "^1.0.0" + } + }, + "mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" + }, + "mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" + }, + "mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", + "requires": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-releases": { + "version": "1.1.75", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", + "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "orbit-camera-controller": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", + "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.3" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "requires": { + "p-timeout": "^3.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "requires": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", + "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "quat-slerp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", + "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", + "requires": { + "gl-quat": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "stats-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stats-js/-/stats-js-1.0.1.tgz", + "integrity": "sha512-EAwEFghGNv8mlYC4CZzI5kWghsnP8uBKXw6VLRHtXkOk5xySfUKLTqTkjgJFfDluIkf/O7eZwi5MXP50VeTbUg==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz", + "integrity": "sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "terser": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", + "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", + "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", + "dev": true, + "requires": { + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "to-px": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", + "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", + "requires": { + "parse-unit": "^1.0.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "ts-loader": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.5.tgz", + "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "turntable-camera-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", + "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.2", + "gl-vec3": "^1.0.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", + "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", + "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + } + }, + "webpack-cli": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", + "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.4", + "@webpack-cli/info": "^1.3.0", + "@webpack-cli/serve": "^1.5.2", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.0.0" + } + }, + "webpack-dev-server": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.1.1.tgz", + "integrity": "sha512-Kl1mnCEw8Cy1Kw173gCxLIB242LfPKEOj9WoKhKz/MbryZTNrILzOJTk8kiczw/YUEPzn3gcltCQv6hDsLudRg==", + "dev": true, + "requires": { + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.1", + "colorette": "^1.2.2", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "internal-ip": "^6.2.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^3.1.0", + "selfsigned": "^1.10.11", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^5.0.0", + "ws": "^8.1.0" + } + }, + "webpack-glsl-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-glsl-loader/-/webpack-glsl-loader-1.0.1.tgz", + "integrity": "sha1-cqDjAZK9V5R9YNbVBckVvmgNCsw=", + "dev": true, + "requires": { + "fs": "0.0.2", + "path": "^0.11.14" + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..16277910 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "scripts": { + "start": "webpack-dev-server --no-hot --live-reload", + "build": "webpack" + }, + "devDependencies": { + "@types/dat.gui": "^0.7.7", + "@types/webgl2": "0.0.6", + "ts-loader": "^9.2.5", + "typescript": "^4.4.2", + "webpack": "^5.52.0", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.1.1", + "webpack-glsl-loader": "^1.0.1" + }, + "dependencies": { + "3d-view-controls": "^2.2.2", + "dat.gui": "^0.7.7", + "gl-matrix": "^3.3.0", + "stats-js": "^1.0.1" + } +} diff --git a/src/Camera.ts b/src/Camera.ts new file mode 100644 index 00000000..77a76105 --- /dev/null +++ b/src/Camera.ts @@ -0,0 +1,41 @@ +var CameraControls = require('3d-view-controls'); +import {vec3, mat4} from 'gl-matrix'; + +class Camera { + controls: any; + projectionMatrix: mat4 = mat4.create(); + viewMatrix: mat4 = mat4.create(); + fovy: number = 45; + aspectRatio: number = 1; + near: number = 0.1; + far: number = 1000; + position: vec3 = vec3.create(); + direction: vec3 = vec3.create(); + target: vec3 = vec3.create(); + up: vec3 = vec3.create(); + + constructor(position: vec3, target: vec3) { + this.controls = CameraControls(document.getElementById('canvas'), { + eye: position, + center: target, + }); + vec3.add(this.target, this.position, this.direction); + mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); + } + + setAspectRatio(aspectRatio: number) { + this.aspectRatio = aspectRatio; + } + + updateProjectionMatrix() { + mat4.perspective(this.projectionMatrix, this.fovy, this.aspectRatio, this.near, this.far); + } + + update() { + this.controls.tick(); + vec3.add(this.target, this.position, this.direction); + mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); + } +}; + +export default Camera; diff --git a/src/geometry/Cube.ts b/src/geometry/Cube.ts new file mode 100644 index 00000000..e2947ee3 --- /dev/null +++ b/src/geometry/Cube.ts @@ -0,0 +1,99 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Cube extends Drawable { + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + + this.indices = new Uint32Array([0, 1, 2, + 0, 2, 3, + 4, 5, 6, + 4, 6, 7, + 8, 9, 10, + 8, 10, 11, + 12, 13, 14, + 12, 14, 15, + 16, 17, 18, + 16, 18, 19, + 20, 21, 22, + 20, 22, 23]); + + this.normals = new Float32Array([0, 0, 1, 0, //front face + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 1, 0, 0, 0, //right face + 1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0, + -1, 0, 0, 0, //left face + -1, 0, 0, 0, + -1, 0, 0, 0, + -1, 0, 0, 0, + 0, 1, 0, 0, //up face + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, -1, 0, 0, //down face + 0, -1, 0, 0, + 0, -1, 0, 0, + 0, -1, 0, 0, + 0, 0, -1, 0, //back face + 0, 0, -1, 0, + 0, 0, -1, 0, + 0, 0, -1, 0,]); + + this.positions = new Float32Array([-1, -1, 1, 1, //front face + 1, -1, 1, 1, + 1, 1, 1, 1, + -1, 1, 1, 1, + 1, -1, 1, 1, //right face + 1, -1, -1, 1, + 1, 1, -1, 1, + 1, 1, 1, 1, + -1, -1, -1, 1, //left face + -1, -1, 1, 1, + -1, 1, 1, 1, + -1, 1, -1, 1, + -1, 1, 1, 1, //up face + 1, 1, 1, 1, + 1, 1, -1, 1, + -1, 1, -1, 1, + -1, -1, -1, 1, //down face + 1, -1, -1, 1, + 1, -1, 1, 1, + -1, -1, 1, 1, + -1, 1, -1, 1, //back face + 1, 1, -1, 1, + 1, -1, -1, 1, + -1, -1, -1, 1]); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created cube`); + } +}; + +export default Cube; diff --git a/src/geometry/Icosphere.ts b/src/geometry/Icosphere.ts new file mode 100644 index 00000000..722f7034 --- /dev/null +++ b/src/geometry/Icosphere.ts @@ -0,0 +1,179 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Icosphere extends Drawable { + buffer: ArrayBuffer; + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3, public radius: number, public subdivisions: number) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + const X = 0.525731112119133606; + const Z = 0.850650808352039932; + const N = 0; + + let maxIndexCount = 20 * Math.pow(4, this.subdivisions); + let maxVertexCount = 10 * Math.pow(4, this.subdivisions) + 2; + + // Create buffers to back geometry data + // Index data will ping pong back and forth between buffer0 and buffer1 during creation + // All data will be in buffer0 at the end + const buffer0 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + ); + const buffer1 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + ); + const buffers = [buffer0, buffer1]; + let b = 0; + + const indexByteOffset = 0; + const vertexByteOffset = maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT; + const normalByteOffset = vertexByteOffset; + const positionByteOffset = vertexByteOffset + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT; + + // Create 3-uint buffer views into the backing buffer to represent triangles + // The C++ analogy to this would be something like: + // triangles[i] = reinterpret_cast*>(&buffer[offset]); + let triangles: Array = new Array(20); + let nextTriangles: Array = new Array(); + for (let i = 0; i < 20; ++i) { + triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + } + + // Create 3-float buffer views into the backing buffer to represent positions + let vertices: Array = new Array(12); + for (let i = 0; i < 12; ++i) { + vertices[i] =new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + } + + // Initialize normals for a 20-sided icosahedron + vertices[0].set([ -X,N,Z,0 ]); + vertices[1].set([ X,N,Z,0 ]); + vertices[2].set([ -X,N,-Z,0 ]); + vertices[3].set([ X,N,-Z,0 ]); + vertices[4].set([ N,Z,X,0 ]); + vertices[5].set([ N,Z,-X,0 ]); + vertices[6].set([ N,-Z,X,0 ]); + vertices[7].set([ N,-Z,-X,0 ]); + vertices[8].set([ Z,X,N,0 ]); + vertices[9].set([ -Z,X, N,0 ]); + vertices[10].set([ Z,-X,N,0 ]); + vertices[11].set([ -Z,-X,N,0 ]); + + // Initialize indices for a 20-sided icosahedron + triangles[0].set([ 0,4,1 ]); + triangles[1].set([ 0,9,4 ]); + triangles[2].set([ 9,5,4 ]); + triangles[3].set([ 4,5,8 ]); + triangles[4].set([ 4,8,1 ]); + triangles[5].set([ 8,10,1 ]); + triangles[6].set([ 8,3,10 ]); + triangles[7].set([ 5,3,8 ]); + triangles[8].set([ 5,2,3 ]); + triangles[9].set([ 2,7,3 ]); + triangles[10].set([ 7,10,3 ]); + triangles[11].set([ 7,6,10 ]); + triangles[12].set([ 7,11,6 ]); + triangles[13].set([ 11,0,6 ]); + triangles[14].set([ 0,1,6 ],); + triangles[15].set([ 6,1,10 ]); + triangles[16].set([ 9,0,11 ]); + triangles[17].set([ 9,11,2 ]); + triangles[18].set([ 9,2,5 ]); + triangles[19].set([ 7,2,11 ]); + + // This loop subdivides the icosahedron + for (let s = 0; s < this.subdivisions; ++s) { + b = 1 - b; + nextTriangles.length = triangles.length * 4; + let triangleIdx = 0; + + // edgeMap maps a pair of vertex indices to a vertex index at their midpoint + // The function `mid` will get that midpoint vertex if it has already been created + // or it will create the vertex and add it to the map + let edgeMap: Map = new Map(); + function mid(v0: number, v1: number): number { + let key = [v0, v1].sort().join('_'); + if (!edgeMap.has(key)) { + let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.add(midpoint, vertices[v0], vertices[v1]); + vec4.normalize(midpoint, midpoint); + edgeMap.set(key, vertices.length); + vertices.push(midpoint); + } + return edgeMap.get(key); + } + + for (let t = 0; t < triangles.length; ++t) { + let v0 = triangles[t][0]; + let v1 = triangles[t][1]; + let v2 = triangles[t][2]; + let v3 = mid(v0, v1); // Get or create a vertex between these two vertices + let v4 = mid(v1, v2); + let v5 = mid(v2, v0); + + let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + + let triangleOffset = nextTriangles.length; + t0.set([v0, v3, v5]); + t1.set([v3, v4, v5]); + t2.set([v3, v1, v4]); + t3.set([v5, v4, v2]); + } + + // swap buffers + let temp = triangles; + triangles = nextTriangles; + nextTriangles = temp; + } + + if (b === 1) { + // if indices did not end up in buffer0, copy them there now + let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length); + let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length); + temp0.set(temp1); + } + + // Populate one position for each normal + for (let i = 0; i < vertices.length; ++i) { + let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.scaleAndAdd(pos, this.center, vertices[i], this.radius); + } + + this.buffer = buffer0; + this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3); + this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4); + this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + // console.log(`Created icosphere with ${vertices.length} vertices`); + } +}; + +export default Icosphere; diff --git a/src/geometry/Square.ts b/src/geometry/Square.ts new file mode 100644 index 00000000..1a21a10d --- /dev/null +++ b/src/geometry/Square.ts @@ -0,0 +1,47 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Square extends Drawable { + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + + this.indices = new Uint32Array([0, 1, 2, + 0, 2, 3]); + this.normals = new Float32Array([0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0]); + this.positions = new Float32Array([-1, -1, 0, 1, + 1, -1, 0, 1, + 1, 1, 0, 1, + -1, 1, 0, 1]); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created square`); + } +}; + +export default Square; diff --git a/src/globals.ts b/src/globals.ts new file mode 100644 index 00000000..cac5bf28 --- /dev/null +++ b/src/globals.ts @@ -0,0 +1,5 @@ + +export var gl: WebGL2RenderingContext; +export function setGL(_gl: WebGL2RenderingContext) { + gl = _gl; +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 00000000..e22d6988 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,178 @@ +import {vec3, vec4} from 'gl-matrix'; +const Stats = require('stats-js'); +import * as DAT from 'dat.gui'; +import Icosphere from './geometry/Icosphere'; +import Square from './geometry/Square'; +import Cube from './geometry/Cube'; +import OpenGLRenderer from './rendering/gl/OpenGLRenderer'; +import Camera from './Camera'; +import {setGL} from './globals'; +import ShaderProgram, {Shader} from './rendering/gl/ShaderProgram'; + +// Define an object with application parameters and button callbacks +// This will be referred to by dat.GUI's functions that add GUI elements. +const controls = { + tesselations: 5, + 'Load Scene': loadScene, // A function pointer, essentially + moonSpeed: 2, + continentNumber: 5, + temparature: 25, + 'Lambert Shader': toggleLambert, + 'Blinn-Phong Shader': toggleCustom, + currColor: [255, 0, 0, 1], +}; + +let mainPlanet: Icosphere; +let moonObject: Icosphere; +let moonPos: vec3 = vec3.fromValues(3.0, 0.0, 0.0); +let square: Square; +let cube: Cube; +let prevTesselations: number = 5; +let time: number = 0; +let currMoonSpeed: number = 2; +let currContinentSize: number = 1; +let currTemp: number = 2; //1: Arctic, 2: Earth, 3: Dessert, 4: Lava +let shader: number = 0; + +function loadScene() { + mainPlanet = new Icosphere(vec3.fromValues(0, 0, 0), 1, controls.tesselations); + mainPlanet.create(); + moonObject = new Icosphere(moonPos, 0.25, controls.tesselations); + moonObject.create(); + square = new Square(vec3.fromValues(0, 0, 0)); + square.create(); + cube = new Cube(vec3.fromValues(0, 0, 0)); + cube.create(); +} + +function toggleLambert() { + shader = 0; +} + +function toggleCustom() { + shader = 1; +} + +function main() { + // Initial display for framerate + const stats = Stats(); + stats.setMode(0); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + + // Add controls to the gui + const gui = new DAT.GUI(); + gui.add(controls, 'tesselations', 0, 8).step(1); + gui.add(controls, 'Load Scene'); + gui.add(controls, 'moonSpeed', 0, 10).step(1).onChange(function(val){ + currMoonSpeed = val; + }); + gui.add(controls, 'continentNumber', 1, 10).step(1).onChange(function(val){ + currContinentSize = (val / 5.0); + }); + gui.add(controls, 'temparature', 0, 100).step(1).onChange(function(val){ + if (val < 10) { + currTemp = 1; + } else if (val < 30) { + currTemp = 2; + } else if (val < 50) { + currTemp = 3; + } else { + currTemp = 4; + } + }); + gui.add(controls, 'Lambert Shader'); + gui.add(controls, 'Blinn-Phong Shader'); + // gui.addColor(controls, "currColor"); + + // get canvas and webgl context + const canvas = document.getElementById('canvas'); + const gl = canvas.getContext('webgl2'); + if (!gl) { + alert('WebGL 2 not supported!'); + } + // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module. + // Later, we can import `gl` from `globals.ts` to access it + setGL(gl); + + // Initial call to load scene + loadScene(); + + const camera = new Camera(vec3.fromValues(0, 0, 5), vec3.fromValues(0, 0, 0)); + + const renderer = new OpenGLRenderer(canvas); + renderer.setClearColor(0.2, 0.2, 0.2, 1); + gl.enable(gl.DEPTH_TEST); + + const lambert = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')), + ]); + + const custom = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/custom-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/custom-frag.glsl')), + ]); + + const planet = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/planet-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/planet-frag.glsl')), + ]); + + const moon = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/moon-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/moon-frag.glsl')), + ]); + + function rotateY(pos: vec3, a: number) { + return vec3.fromValues(Math.cos(a) * pos[0] + Math.sin(a) * pos[2], pos[1], -Math.sin(a) * pos[0] + Math.cos(a) * pos[2]); + } + + // This function will be called every frame + function tick() { + camera.update(); + stats.begin(); + gl.viewport(0, 0, window.innerWidth, window.innerHeight); + renderer.clear(); + if(controls.tesselations != prevTesselations) + { + prevTesselations = controls.tesselations; + mainPlanet = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations); + mainPlanet.create(); + } + moonPos = rotateY(vec3.fromValues(3, 0, 0), time * (currMoonSpeed / 2.0)); + + moonObject = new Icosphere(moonPos, 0.25, prevTesselations); + moonObject.create(); + // moonObject.center = vec4.fromValues(moonPos[0], moonPos[1], moonPos[2], 1.0); + + let newColor = vec4.fromValues((controls.currColor[0] / 255.0), + (controls.currColor[1] / 255.0), + (controls.currColor[2] / 255.0), 1); + time += 0.01; + renderer.render(camera, planet, [mainPlanet], newColor, time, currMoonSpeed, currContinentSize, currTemp, shader); + renderer.render(camera, moon, [moonObject], newColor, time, currMoonSpeed, currContinentSize, currTemp, shader); + + stats.end(); + + // Tell the browser to call `tick` again whenever it renders a new frame + requestAnimationFrame(tick); + } + + window.addEventListener('resize', function() { + renderer.setSize(window.innerWidth, window.innerHeight); + camera.setAspectRatio(window.innerWidth / window.innerHeight); + camera.updateProjectionMatrix(); + }, false); + + renderer.setSize(window.innerWidth, window.innerHeight); + camera.setAspectRatio(window.innerWidth / window.innerHeight); + camera.updateProjectionMatrix(); + + // Start the render loop + tick(); +} + +main(); diff --git a/src/rendering/gl/Drawable.ts b/src/rendering/gl/Drawable.ts new file mode 100644 index 00000000..3006b5cd --- /dev/null +++ b/src/rendering/gl/Drawable.ts @@ -0,0 +1,67 @@ +import {gl} from '../../globals'; + +abstract class Drawable { + count: number = 0; + + bufIdx: WebGLBuffer; + bufPos: WebGLBuffer; + bufNor: WebGLBuffer; + + idxBound: boolean = false; + posBound: boolean = false; + norBound: boolean = false; + + abstract create() : void; + + destory() { + gl.deleteBuffer(this.bufIdx); + gl.deleteBuffer(this.bufPos); + gl.deleteBuffer(this.bufNor); + } + + generateIdx() { + this.idxBound = true; + this.bufIdx = gl.createBuffer(); + } + + generatePos() { + this.posBound = true; + this.bufPos = gl.createBuffer(); + } + + generateNor() { + this.norBound = true; + this.bufNor = gl.createBuffer(); + } + + bindIdx(): boolean { + if (this.idxBound) { + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + } + return this.idxBound; + } + + bindPos(): boolean { + if (this.posBound) { + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + } + return this.posBound; + } + + bindNor(): boolean { + if (this.norBound) { + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + } + return this.norBound; + } + + elemCount(): number { + return this.count; + } + + drawMode(): GLenum { + return gl.TRIANGLES; + } +}; + +export default Drawable; diff --git a/src/rendering/gl/OpenGLRenderer.ts b/src/rendering/gl/OpenGLRenderer.ts new file mode 100644 index 00000000..20277115 --- /dev/null +++ b/src/rendering/gl/OpenGLRenderer.ts @@ -0,0 +1,46 @@ +import {mat4, vec4} from 'gl-matrix'; +import Drawable from './Drawable'; +import Camera from '../../Camera'; +import {gl} from '../../globals'; +import ShaderProgram from './ShaderProgram'; + +// In this file, `gl` is accessible because it is imported above +class OpenGLRenderer { + constructor(public canvas: HTMLCanvasElement) { + } + + setClearColor(r: number, g: number, b: number, a: number) { + gl.clearColor(r, g, b, a); + } + + setSize(width: number, height: number) { + this.canvas.width = width; + this.canvas.height = height; + } + + clear() { + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + } + + render(camera: Camera, prog: ShaderProgram, drawables: Array, color: vec4, time: number, moonSpeed: number, continentSize: number, temp: number, shader: number) { + let model = mat4.create(); + let viewProj = mat4.create(); + + mat4.identity(model); + mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); + prog.setModelMatrix(model); + prog.setViewProjMatrix(viewProj); + prog.setGeometryColor(color); + prog.setTime(time); + prog.setMoonSpeed(moonSpeed); + prog.setContinentSize(continentSize); + prog.setTemp(temp); + prog.setShader(shader); + + for (let drawable of drawables) { + prog.draw(drawable); + } + } +}; + +export default OpenGLRenderer; diff --git a/src/rendering/gl/ShaderProgram.ts b/src/rendering/gl/ShaderProgram.ts new file mode 100644 index 00000000..1439bb40 --- /dev/null +++ b/src/rendering/gl/ShaderProgram.ts @@ -0,0 +1,154 @@ +import {vec4, mat4} from 'gl-matrix'; +import Drawable from './Drawable'; +import {gl} from '../../globals'; + +var activeProgram: WebGLProgram = null; + +export class Shader { + shader: WebGLShader; + + constructor(type: number, source: string) { + this.shader = gl.createShader(type); + gl.shaderSource(this.shader, source); + gl.compileShader(this.shader); + + if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) { + throw gl.getShaderInfoLog(this.shader); + } + } +}; + +class ShaderProgram { + prog: WebGLProgram; + + attrPos: number; + attrNor: number; + attrCol: number; + + unifModel: WebGLUniformLocation; + unifModelInvTr: WebGLUniformLocation; + unifViewProj: WebGLUniformLocation; + unifColor: WebGLUniformLocation; + unifTime: WebGLUniformLocation; + unifMoonSpeed: WebGLUniformLocation; + unifContinentSize: WebGLUniformLocation; + unifTemp: WebGLUniformLocation; + unifShader: WebGLUniformLocation; + + constructor(shaders: Array) { + this.prog = gl.createProgram(); + + for (let shader of shaders) { + gl.attachShader(this.prog, shader.shader); + } + gl.linkProgram(this.prog); + if (!gl.getProgramParameter(this.prog, gl.LINK_STATUS)) { + throw gl.getProgramInfoLog(this.prog); + } + + this.attrPos = gl.getAttribLocation(this.prog, "vs_Pos"); + this.attrNor = gl.getAttribLocation(this.prog, "vs_Nor"); + this.attrCol = gl.getAttribLocation(this.prog, "vs_Col"); + this.unifModel = gl.getUniformLocation(this.prog, "u_Model"); + this.unifModelInvTr = gl.getUniformLocation(this.prog, "u_ModelInvTr"); + this.unifViewProj = gl.getUniformLocation(this.prog, "u_ViewProj"); + this.unifColor = gl.getUniformLocation(this.prog, "u_Color"); + this.unifTime = gl.getUniformLocation(this.prog, "u_Time"); + this.unifMoonSpeed = gl.getUniformLocation(this.prog, "u_MoonSpeed"); + this.unifContinentSize = gl.getUniformLocation(this.prog, "u_ContinentSize"); + this.unifTemp = gl.getUniformLocation(this.prog, "u_Temp"); + this.unifShader = gl.getUniformLocation(this.prog, "u_Shader"); + } + + use() { + if (activeProgram !== this.prog) { + gl.useProgram(this.prog); + activeProgram = this.prog; + } + } + + setModelMatrix(model: mat4) { + this.use(); + if (this.unifModel !== -1) { + gl.uniformMatrix4fv(this.unifModel, false, model); + } + + if (this.unifModelInvTr !== -1) { + let modelinvtr: mat4 = mat4.create(); + mat4.transpose(modelinvtr, model); + mat4.invert(modelinvtr, modelinvtr); + gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); + } + } + + setViewProjMatrix(vp: mat4) { + this.use(); + if (this.unifViewProj !== -1) { + gl.uniformMatrix4fv(this.unifViewProj, false, vp); + } + } + + setTime(t: number) { + this.use(); + if (this.unifTime !== -1) { + gl.uniform1f(this.unifTime, t); + } + } + + setMoonSpeed(ms: number) { + this.use(); + if (this.unifMoonSpeed != -1) { + gl.uniform1f(this.unifMoonSpeed, ms); + } + } + + setContinentSize(cs: number) { + this.use(); + if (this.unifContinentSize != -1) { + gl.uniform1f(this.unifContinentSize, cs); + } + } + + setTemp(t: number) { + this.use(); + if (this.unifTemp != -1) { + gl.uniform1f(this.unifTemp, t); + } + } + + setShader(s: number) { + this.use(); + if (this.unifShader != -1) { + gl.uniform1f(this.unifShader, s); + } + } + + setGeometryColor(color: vec4) { + this.use(); + if (this.unifColor !== -1) { + gl.uniform4fv(this.unifColor, color); + } + } + + draw(d: Drawable) { + this.use(); + + if (this.attrPos != -1 && d.bindPos()) { + gl.enableVertexAttribArray(this.attrPos); + gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0); + } + + if (this.attrNor != -1 && d.bindNor()) { + gl.enableVertexAttribArray(this.attrNor); + gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0); + } + + d.bindIdx(); + gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0); + + if (this.attrPos != -1) gl.disableVertexAttribArray(this.attrPos); + if (this.attrNor != -1) gl.disableVertexAttribArray(this.attrNor); + } +}; + +export default ShaderProgram; diff --git a/src/shaders/custom-frag.glsl b/src/shaders/custom-frag.glsl new file mode 100644 index 00000000..1cc083d7 --- /dev/null +++ b/src/shaders/custom-frag.glsl @@ -0,0 +1,101 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. +uniform float u_Time; + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; +in vec4 fs_Pos; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +//perlin noise function +vec3 random3(vec3 p) { + return fract(sin(vec3(dot(p,vec3(137.1, 927.6, 371.919)), + dot(p,vec3(716.5, 213.3, 617.14)), + dot(p, vec3(237.69, 313.2, 107.23)))) + *23873.3207); +} + +float surflet(vec3 p, vec3 gridPoint) { + // Compute the distance between p and the grid point along each axis, and warp it with a + // quintic function so we can smooth our cells + vec3 t2 = abs(p - gridPoint); + vec3 t = vec3(1.0) - 6.0 * pow(t2, vec3(5.0)) + 15.0 * pow(t2, vec3(4.0)) - 10.0 * pow(t2, vec3(3.0)); + // Get the random vector for the grid point (assume we wrote a function random2 + // that returns a vec2 in the range [0, 1]) + vec3 gradient = random3(gridPoint) * 2. - vec3(1., 1., 1.); + // Get the vector from the grid point to P + vec3 diff = p - gridPoint; + // Get the value of our height field by dotting grid->P with our gradient + float height = dot(diff, gradient); + // Scale our height field (i.e. reduce it) by our polynomial falloff function + return height * t.x * t.y * t.z; +} + +float perlinNoise3D(vec3 p) +{ + float surfletSum = 0.0; + p = (p + (u_Time + 721.22913)) * 0.5; + for (int dx = 0; dx <= 1; ++dx) { + for (int dy = 0; dy <= 1; ++dy) { + for (int dz = 0; dz <= 1; ++dz) { + surfletSum += surflet(p, floor(p) + vec3(dx, dy, dz)); + } + } + } + return surfletSum; +} + +vec3 palette(in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d) +{ + return a + b * cos(7.28318 * (c * t + d)); +} + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // apply perlin noise function + vec3 pos = vec3(fs_Pos.x, fs_Pos.y, fs_Pos.z); + float p = perlinNoise3D(pos); + // (fs_Col.xyz / 255.0) + //vec3 perlinA = vec3(0.2,0.8,0.8); + vec3 perlinA = diffuseColor.rgb; + vec3 perlinB = vec3(0.5,0.5,0.5); + vec3 perlinC = vec3(1.0,1.0,1.0); + vec3 perlinD = vec3(0.5,0.6,0.6); + vec3 newColor = palette(p, perlinA, perlinB, perlinC, perlinD); + + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + diffuseTerm = clamp(diffuseTerm, 0.0, 1.0); + + float ambientTerm = 0.2; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + + // Compute final shaded color + out_Col = vec4(newColor.rgb * lightIntensity, diffuseColor.a); + +} diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl new file mode 100644 index 00000000..83291bf8 --- /dev/null +++ b/src/shaders/custom-vert.glsl @@ -0,0 +1,135 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself +uniform float u_Time; + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Pos; + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +//noise basis function +float noiseFBM2D(vec2 n) +{ + return (fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453)); +} + +//interpNoise2D +float interpNoise2D(float x, float y) +{ + float intX = floor(x); + float fractX = fract(x); + float intY = floor(y); + float fractY = fract(y); + + float v1 = noiseFBM2D(vec2(intX, intY)); + float v2 = noiseFBM2D(vec2(intX + 1.0, intY)); + float v3 = noiseFBM2D(vec2(intX, intY + 1.0)); + float v4 = noiseFBM2D(vec2(intX + 1.0, intY + 1.0)); + + float i1 = mix(v1, v2, fractX); + float i2 = mix(v3, v4, fractX); + return mix(i1, i2, fractY); +} + +//fbm function +float fbm(float x, float y) +{ + float total = 0.0; + float persistence = 0.5; + float octaves = 4.0; + total = (total + sin((u_Time + 71.22913)) * 0.5); + for(float i = 1.0; i <= octaves; i++) { + float freq = pow(2.0, i); + float amp = pow(persistence, i); + + total += interpNoise2D(x * freq, y * freq) * amp; + } + return total; +} + +vec3 newPosGenerate(vec3 pos, vec3 nor) { + vec3 newPos = vec3(0, 0, 0); + if (nor.x > 0.2) { //right case + newPos = vec3((fbm(pos.z, pos.y) * 2.0), pos.y, pos.z); + } else if (nor.x < -0.2) { //left case + newPos = vec3(-(fbm(pos.z, pos.y) * 2.0), pos.y, pos.z); + } else if (nor.y > 0.2) { //up case + newPos = vec3(pos.x, (fbm(pos.x, pos.z) * 2.0), pos.z); + } else if (nor.y < -0.2) { //up case + newPos = vec3(pos.x, -(fbm(pos.x, pos.z) * 2.0), pos.z); + } else if (nor.z > 0.2) { //front case + newPos = vec3(pos.x, pos.y, (fbm(pos.x, pos.y) * 2.0)); + } else { //back case + newPos = vec3(pos.x, pos.y, -(fbm(pos.x, pos.y) * 2.0)); + } + return newPos; +} + +vec3 newPosGenerate1(vec3 pos, vec3 nor) { + float val = 0.0; + if (nor.x > 0.1) { //right case + val = fbm(pos.y, pos.z); + } else if (nor.x < -0.1) { //left case + val = fbm(pos.y, pos.z); + } else if (nor.y > 0.1) { //up case + val = fbm(pos.x, pos.z); + } else if (nor.y < -0.1) { //up case + val = fbm(pos.x, pos.z); + } else if (nor.z > 0.1) { //front case + val = fbm(pos.x, pos.y); + } else if (nor.z < -0.1) { //back case + val = fbm(pos.x, pos.y); + } + return (normalize(pos) * val * 0.8); +} + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + vec4 modelposition = u_Model * + mix( + (vs_Pos + (sin(vs_Pos * 10.0 + u_Time * 10.0) * 0.1 + cos(vs_Pos * 10.0 + u_Time * 10.0)) * 0.3), + vec4(normalize(vec3(vs_Pos)), 1), + 0.2 + 0.15 * sin(u_Time * 0.2) + ); + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + fs_Pos = modelposition; // Pass the vertex positions to the fragment shader + + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices +} diff --git a/src/shaders/lambert-frag.glsl b/src/shaders/lambert-frag.glsl new file mode 100644 index 00000000..08c99361 --- /dev/null +++ b/src/shaders/lambert-frag.glsl @@ -0,0 +1,47 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. +uniform float u_Time; + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; +in vec4 fs_Pos; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + + + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + diffuseTerm = clamp(diffuseTerm, 0.0, 1.0); + + float ambientTerm = 0.2; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + + // Compute final shaded color + out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); +} diff --git a/src/shaders/lambert-vert.glsl b/src/shaders/lambert-vert.glsl new file mode 100644 index 00000000..a4547533 --- /dev/null +++ b/src/shaders/lambert-vert.glsl @@ -0,0 +1,55 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself +uniform float u_Time; + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Pos; + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + + vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices +} diff --git a/src/shaders/moon-frag.glsl b/src/shaders/moon-frag.glsl new file mode 100644 index 00000000..f70aef4a --- /dev/null +++ b/src/shaders/moon-frag.glsl @@ -0,0 +1,156 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. +uniform float u_Time; + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; +in vec4 fs_Pos; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +// Noise FBM Functions============================================================== +vec3 noise3D(vec3 p) { + float val1 = fract(sin((dot(p, vec3(378.1, 31.7, 137.999)))) * 38958.5453); + float val2 = fract(sin((dot(p, vec3(129.967, 131.1, 37.7)))) * 3193.5453); + float val3 = fract(sin((dot(p, vec3(171.7, 191.979, 127.1)))) * 758.5413); + + return vec3(val1, val2, val3); +} + +vec3 interpolateNoise3D(float x, float y, float z) { + int intX = int(floor(x)); + float fractX = fract(x); + int intY = int(floor(y)); + float fractY = fract(y); + int intZ = int(floor(z)); + float fractZ = fract(z); + + vec3 v1 = noise3D(vec3(intX, intY, intZ)); + vec3 v2 = noise3D(vec3(intX + 1, intY, intZ)); + vec3 v3 = noise3D(vec3(intX, intY + 1, intZ)); + vec3 v4 = noise3D(vec3(intX + 1, intY + 1, intZ)); + + vec3 v5 = noise3D(vec3(intX, intY, intZ + 1)); + vec3 v6 = noise3D(vec3(intX + 1, intY, intZ + 1)); + vec3 v7 = noise3D(vec3(intX, intY + 1, intZ + 1)); + vec3 v8 = noise3D(vec3(intX + 1, intY + 1, intZ + 1)); + + vec3 i1 = mix(v1, v2, fractX); + vec3 i2 = mix(v3, v4, fractX); + + vec3 i3 = mix(i1, i2, fractY); + + vec3 i4 = mix(v5, v6, fractX); + vec3 i5 = mix(v7, v8, fractX); + + vec3 i6 = mix(i4, i5, fractY); + + vec3 i7 = mix(i3, i6, fractZ); + + return i7; +} + +vec3 fbm(float x, float y, float z) { + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 7; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + + return total; +} + +float getBias(float time, float bias) { + return (time / ((((1.0 / bias) - 2.0) * (1.0 - time)) + 1.0)); +} + +float getGain(float time, float gain) { + if (time < 0.5) { + return getBias(time * 2.0, gain) / 2.0; + } else { + return getBias(time * 2.0 - 1.0, 1.0 - gain) / 2.0 + 0.5; + } +} + +vec3 rgb(float r, float g, float b) { + return vec3(r / 255.0, g / 255.0, b / 255.0); +} + +vec3 palette(float t, vec3 a, vec3 b, vec3 c, vec3 d) +{ + return a + b * cos(6.28318*(c*t+d)); +} + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + // diffuseTerm = clamp(diffuseTerm, 0.0, 1.0); + + float ambientTerm = 0.3; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + // Compute final shaded color + // out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); + out_Col = vec4(diffuseColor.rrr * lightIntensity, diffuseColor.a); + + // Begin Tinkering==================== + vec3 noiseInput = fs_Pos.xyz; + noiseInput *= 4.0f; + // noiseInput += u_Time * 0.5; + // vec3 noise = earth_fbm(noiseInput.x, noiseInput.y, noiseInput.z); + vec3 noise = fbm(noiseInput.x, noiseInput.y, noiseInput.z); + // vec3 noise = vec3(noiseInput.x, perlinNoise3D(noiseInput), noiseInput.z); + + vec3 surfaceColor = noise.rrr; + // if (noise.r > 0.5) { + // surfaceColor = rgb(255.0, 255.0, 255.0); + // } else { + // surfaceColor = rgb(0.0, 0.0, 0.0); + // } + + vec3 color1 = rgb(223.0, 255.0, 254.0); + vec3 color2 = rgb(56.0, 102.0, 121.0); + float t = noise.r; + + vec3 a = vec3(0.53, 0.5, 0.5); + vec3 b = vec3(0.5, 0.5, 0.5); + vec3 c = vec3(1.0, 0.7, 0.4); + vec3 d = vec3(0.0, 0.15, 0.2); + + t = getGain(t, 0.2f); + + surfaceColor = mix(color1, color2, t); + // surfaceColor = palette(t, a, b, c, d); + + // vec3 surfaceColor = noise.rrr; + out_Col = vec4(surfaceColor.xyz, 1.0); + // out_Col = vec4(surfaceColor.xyz * lightIntensity, 1.0); +} diff --git a/src/shaders/moon-vert.glsl b/src/shaders/moon-vert.glsl new file mode 100644 index 00000000..7ca4ba07 --- /dev/null +++ b/src/shaders/moon-vert.glsl @@ -0,0 +1,62 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself +uniform float u_Time; +uniform float u_MoonSpeed; + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Pos; + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + + +vec3 rotateY(vec3 pos, float a) { + return vec3(cos(a) * pos.x + sin(a) * pos.z, pos.y, -sin(a) * pos.x + cos(a) * pos.z); +} + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + + vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + vec3 moonCenter = rotateY(vec3(3.0, 0.0, 0.0), u_Time * (u_MoonSpeed / 2.0)); + fs_Pos = vec4(vec3(vs_Pos) - moonCenter, vs_Pos.a); + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices +} diff --git a/src/shaders/planet-frag.glsl b/src/shaders/planet-frag.glsl new file mode 100644 index 00000000..e43d35a6 --- /dev/null +++ b/src/shaders/planet-frag.glsl @@ -0,0 +1,293 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. +uniform float u_Time; +uniform float u_ContinentSize; +uniform float u_Temp; +uniform float u_Shader; + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; +in vec4 fs_Pos; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +const vec4 lightPos = vec4(5, 5, 3, 1); + +// Normal Earth Biome Functions============================================================== +vec3 earth_noise3D(vec3 p) { + float val1 = fract(sin((dot(p, vec3(127.1, 311.7, 191.999)))) * 43758.5453); + float val2 = fract(sin((dot(p, vec3(191.999, 127.1, 311.7)))) * 3758.5453); + float val3 = fract(sin((dot(p, vec3(311.7, 191.999, 127.1)))) * 758.5453); + + return vec3(val1, val2, val3); +} + +vec3 earth_interpolateNoise3D(float x, float y, float z) { + int intX = int(floor(x)); + float fractX = fract(x); + int intY = int(floor(y)); + float fractY = fract(y); + int intZ = int(floor(z)); + float fractZ = fract(z); + + vec3 v1 = earth_noise3D(vec3(intX, intY, intZ)); + vec3 v2 = earth_noise3D(vec3(intX + 1, intY, intZ)); + vec3 v3 = earth_noise3D(vec3(intX, intY + 1, intZ)); + vec3 v4 = earth_noise3D(vec3(intX + 1, intY + 1, intZ)); + + vec3 v5 = earth_noise3D(vec3(intX, intY, intZ + 1)); + vec3 v6 = earth_noise3D(vec3(intX + 1, intY, intZ + 1)); + vec3 v7 = earth_noise3D(vec3(intX, intY + 1, intZ + 1)); + vec3 v8 = earth_noise3D(vec3(intX + 1, intY + 1, intZ + 1)); + + vec3 i1 = mix(v1, v2, fractX); + vec3 i2 = mix(v3, v4, fractX); + + vec3 i3 = mix(i1, i2, fractY); + + vec3 i4 = mix(v5, v6, fractX); + vec3 i5 = mix(v7, v8, fractX); + + vec3 i6 = mix(i4, i5, fractY); + + vec3 i7 = mix(i3, i6, fractZ); + + return i7; +} + +vec3 earth_fbm(float x, float y, float z) { + x *= 1.5f; + y *= 1.5f; + z *= 1.5f; + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 6; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += earth_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + + return total; +} +// End: Normal Earth Biome Functions============================================================== +// Cliff Biome Functions========================================================================== +vec3 cliff_noise3D(vec3 p) { + p *= 2.0f; + float val1 = fract(sin((dot(p, vec3(12.167, 432.7, 131.999)))) * 3718.5457); + float val2 = fract(sin((dot(p, vec3(141.999, 127.1, 311.7)))) * 1758.5457); + float val3 = fract(sin((dot(p, vec3(387.7, 191.997, 37.1)))) * 7518.5451); + + return vec3(val1, val2, val3); +} + +vec3 cliff_interpolateNoise3D(float x, float y, float z) { + int intX = int(floor(x)); + float fractX = fract(x); + int intY = int(floor(y)); + float fractY = fract(y); + int intZ = int(floor(z)); + float fractZ = fract(z); + + vec3 v1 = cliff_noise3D(vec3(intX, intY, intZ)); + vec3 v2 = cliff_noise3D(vec3(intX + 1, intY, intZ)); + vec3 v3 = cliff_noise3D(vec3(intX, intY + 1, intZ)); + vec3 v4 = cliff_noise3D(vec3(intX + 1, intY + 1, intZ)); + + vec3 v5 = cliff_noise3D(vec3(intX, intY, intZ + 1)); + vec3 v6 = cliff_noise3D(vec3(intX + 1, intY, intZ + 1)); + vec3 v7 = cliff_noise3D(vec3(intX, intY + 1, intZ + 1)); + vec3 v8 = cliff_noise3D(vec3(intX + 1, intY + 1, intZ + 1)); + + vec3 i1 = mix(v1, v2, fractX); + vec3 i2 = mix(v3, v4, fractX); + + vec3 i3 = mix(i1, i2, fractY); + + vec3 i4 = mix(v5, v6, fractX); + vec3 i5 = mix(v7, v8, fractX); + + vec3 i6 = mix(i4, i5, fractY); + + vec3 i7 = mix(i3, i6, fractZ); + + return i7; +} + +vec3 cliff_fbm(float x, float y, float z) { + x *= 3.f; + y *= 3.f; + z *= 3.f; + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 6; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += cliff_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + + return total; +} +// End: Cliff Biome Functions========================================================================== +// Arctic Biome Functions=================================================================== +vec3 arctic_fbm(float x, float y, float z) { + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 8; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += cliff_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + return total; +} +//End: Arctic Biome Functions========================================================================= +// Lava Biome Functions=============================================================================== +vec3 lava_fbm(float x, float y, float z) { + x *= 2.0; + y *= 2.0; + z *= 2.0; + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 8; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += cliff_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + return total; +} +//End: Lava Biomr Function============================================================================ +float getBias(float time, float bias) { + return (time / ((((1.0 / bias) - 2.0) * (1.0 - time)) + 1.0)); +} + +float getGain(float time, float gain) { + if (time < 0.5) { + return getBias(time * 2.0, gain) / 2.0; + } else { + return getBias(time * 2.0 - 1.0, 1.0 - gain) / 2.0 + 0.5; + } +} + +vec3 rgb(float r, float g, float b) { + return vec3(r / 255.0, g / 255.0, b / 255.0); +} + +vec3 palette(float t, vec3 a, vec3 b, vec3 c, vec3 d) { + return a + b * cos(6.28318*(c*t+d)); +} + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + // diffuseTerm = clamp(diffuseTerm, 0.0, 1.0); + + float ambientTerm = 0.3; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + // Compute final shaded color + // out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); + out_Col = vec4(diffuseColor.rrr * lightIntensity, diffuseColor.a); + + // Begin Tinkering==================== + vec3 noiseInput = fs_Pos.xyz; + noiseInput *= u_ContinentSize;//1.0f; + noiseInput += u_Time * 0.2; + vec3 noise = vec3(0.0); + if (u_Temp == 1.0) { + noise = arctic_fbm(noiseInput.x, noiseInput.y, noiseInput.z); + } else if (u_Temp == 2.0) { + noise = earth_fbm(noiseInput.x, noiseInput.y, noiseInput.z); + } else if (u_Temp == 3.0) { + noise = cliff_fbm(noiseInput.x, noiseInput.y, noiseInput.z); + } else { + noise = lava_fbm(noiseInput.x, noiseInput.y, noiseInput.z); + } + + vec3 surfaceColor = noise.rrr; + + vec3 color1 = rgb(40.0, 70.0, 125.0); + vec3 color2 = rgb(40.0, 130.0, 20.0); + float t = noise.r; + + //Earth Color============================= + vec3 earth_a = vec3(0.53, 0.5, 0.89); + vec3 earth_b = vec3(-0.6, 0.29, 0.55); + vec3 earth_c = vec3(-0.3, 0.658, 0.8); + vec3 earth_d = vec3(0.0, 0.33, 0.9); + //======================================== + //Canyon Color============================ + vec3 canyon_a = vec3(0.64, 0.61, 0.71); + vec3 canyon_b = vec3(0.37, 0.37, 0.5); + vec3 canyon_c = vec3(1.0, 0.7, 0.4); + vec3 canyon_d = vec3(0.0, 0.15, 0.31); + //======================================== + //Arctic Color============================ + vec3 arctic_a = vec3(0.31, 0.76, 0.97); + vec3 arctic_b = vec3(0.61, 0.57, 0.76); + vec3 arctic_c = vec3(1.14, 1.15, 1.23); + vec3 arctic_d = vec3(6.32, 6.31, 4.28); + //======================================== + //Lava Color============================ + vec3 lava_a = vec3(0.55, 0.36, -0.02); + vec3 lava_b = vec3(0.32, 0.21, 0.26); + vec3 lava_c = vec3(0.63, 0.03, 0.75); + vec3 lava_d = vec3(3.99, 5.63, 4.17); + //======================================== + + t = getGain(t, 0.2f); + + if (u_Temp == 1.0) { + surfaceColor = palette(t, arctic_a, arctic_b, arctic_c, arctic_d); + } else if (u_Temp == 2.0) { + surfaceColor = palette(t, earth_a, earth_b, earth_c, earth_d); + } else if (u_Temp == 3.0) { + surfaceColor = palette(t, canyon_a, canyon_b, canyon_c, canyon_d); + } else { + surfaceColor = palette(t, lava_a, lava_b, lava_c, lava_d); + } + + // vec3 surfaceColor = noise.rrr; + out_Col = vec4(surfaceColor.xyz, 1.0); + if (u_Shader == 0.0) { // lambert + out_Col = vec4(surfaceColor.xyz * lightIntensity, 1.0); + } else { // blinn-phong + vec4 avgViewLight = ((lightPos - fs_Pos) + fs_LightVec) / 2.0; + float exp = 60.0f; + float specularIntensity = max(pow(dot(normalize(avgViewLight), normalize(fs_Nor)), exp), 0.0); + out_Col = vec4(surfaceColor.xyz * lightIntensity + specularIntensity, 1.0); + } +} diff --git a/src/shaders/planet-vert.glsl b/src/shaders/planet-vert.glsl new file mode 100644 index 00000000..cb24d88d --- /dev/null +++ b/src/shaders/planet-vert.glsl @@ -0,0 +1,280 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself +uniform float u_Time; +uniform float u_ContinentSize; +uniform float u_Temp; + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Pos; + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +// Noise Functions============================================================== +vec3 earth_noise3D(vec3 p) { + float val1 = fract(sin((dot(p, vec3(127.1, 311.7, 191.999)))) * 43758.5453); + float val2 = fract(sin((dot(p, vec3(191.999, 127.1, 311.7)))) * 3758.5453); + float val3 = fract(sin((dot(p, vec3(311.7, 191.999, 127.1)))) * 758.5453); + + return vec3(val1, val2, val3); +} + +vec3 earth_interpolateNoise3D(float x, float y, float z) { + int intX = int(floor(x)); + float fractX = fract(x); + int intY = int(floor(y)); + float fractY = fract(y); + int intZ = int(floor(z)); + float fractZ = fract(z); + + vec3 v1 = earth_noise3D(vec3(intX, intY, intZ)); + vec3 v2 = earth_noise3D(vec3(intX + 1, intY, intZ)); + vec3 v3 = earth_noise3D(vec3(intX, intY + 1, intZ)); + vec3 v4 = earth_noise3D(vec3(intX + 1, intY + 1, intZ)); + + vec3 v5 = earth_noise3D(vec3(intX, intY, intZ + 1)); + vec3 v6 = earth_noise3D(vec3(intX + 1, intY, intZ + 1)); + vec3 v7 = earth_noise3D(vec3(intX, intY + 1, intZ + 1)); + vec3 v8 = earth_noise3D(vec3(intX + 1, intY + 1, intZ + 1)); + + vec3 i1 = mix(v1, v2, fractX); + vec3 i2 = mix(v3, v4, fractX); + + vec3 i3 = mix(i1, i2, fractY); + + vec3 i4 = mix(v5, v6, fractX); + vec3 i5 = mix(v7, v8, fractX); + + vec3 i6 = mix(i4, i5, fractY); + + vec3 i7 = mix(i3, i6, fractZ); + + return i7; +} + +vec3 earth_fbm(float x, float y, float z) { + x *= 1.5f; + y *= 1.5f; + z *= 1.5f; + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 6; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += earth_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + + return total; +} + +// Cliff Biome Functions========================================================================== +vec3 cliff_noise3D(vec3 p) { + p *= 2.0f; + float val1 = fract(sin((dot(p, vec3(12.167, 432.7, 131.999)))) * 3718.5457); + float val2 = fract(sin((dot(p, vec3(141.999, 127.1, 311.7)))) * 1758.5457); + float val3 = fract(sin((dot(p, vec3(387.7, 191.997, 37.1)))) * 7518.5451); + + return vec3(val1, val2, val3); +} + +vec3 cliff_interpolateNoise3D(float x, float y, float z) { + int intX = int(floor(x)); + float fractX = fract(x); + int intY = int(floor(y)); + float fractY = fract(y); + int intZ = int(floor(z)); + float fractZ = fract(z); + + vec3 v1 = cliff_noise3D(vec3(intX, intY, intZ)); + vec3 v2 = cliff_noise3D(vec3(intX + 1, intY, intZ)); + vec3 v3 = cliff_noise3D(vec3(intX, intY + 1, intZ)); + vec3 v4 = cliff_noise3D(vec3(intX + 1, intY + 1, intZ)); + + vec3 v5 = cliff_noise3D(vec3(intX, intY, intZ + 1)); + vec3 v6 = cliff_noise3D(vec3(intX + 1, intY, intZ + 1)); + vec3 v7 = cliff_noise3D(vec3(intX, intY + 1, intZ + 1)); + vec3 v8 = cliff_noise3D(vec3(intX + 1, intY + 1, intZ + 1)); + + vec3 i1 = mix(v1, v2, fractX); + vec3 i2 = mix(v3, v4, fractX); + + vec3 i3 = mix(i1, i2, fractY); + + vec3 i4 = mix(v5, v6, fractX); + vec3 i5 = mix(v7, v8, fractX); + + vec3 i6 = mix(i4, i5, fractY); + + vec3 i7 = mix(i3, i6, fractZ); + + return i7; +} + +vec3 cliff_fbm(float x, float y, float z) { + x *= 3.f; + y *= 3.f; + z *= 3.f; + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 8; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += cliff_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + // total = smoothstep(0.55f, 0.65f, total) * 0.4 + smoothstep(0.5f, 0.6f, total) * 0.1 + smoothstep(0.6f, 0.7f, total) * 0.4; + return total; +} +// End: Cliff Biome Functions========================================================================== +// Arctic Biome Functions=================================================================== +vec3 arctic_fbm(float x, float y, float z) { + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 8; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += cliff_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + total = smoothstep(0.1f, 0.25f, total) * 0.2 + smoothstep(0.28f, 0.35f, total) * 0.3 + smoothstep(0.4f, 0.55f, total) * 0.2 + smoothstep(0.5f, 0.65f, total) * 0.2 + smoothstep(0.7f, 0.8f, total) * 0.2+ smoothstep(0.83f, 0.95f, total) * 0.3; + return total; +} +//End: Arctic Biome Functions========================================================================= +// Lava Biome Functions=================================================================== +vec3 lava_fbm(float x, float y, float z) { + x *= 2.0; + y *= 2.0; + z *= 2.0; + vec3 total = vec3(0.f, 0.f, 0.f); + float persistence = 0.5f; + int octaves = 8; + + for(int i = 1; i <= octaves; i++) { + float freq = pow(2.f, float(i)); + float amp = pow(persistence, float(i)); + + total += cliff_interpolateNoise3D(x * freq, y * freq, z * freq) * amp; + } + total = smoothstep(0.1f, 0.25f, total) * 0.3 + smoothstep(0.4f, 0.55f, total) * 0.5 + smoothstep(0.6f, 0.8f, total) * 0.4; + return total; +} +//End: Lava Biome Functions========================================================================= + +float getBias(float time, float bias) { + return (time / ((((1.0 / bias) - 2.0) * (1.0 - time)) + 1.0)); +} + +float getGain(float time, float gain) { + if (time < 0.5) { + return getBias(time * 2.0, gain) / 2.0; + } else { + return getBias(time * 2.0 - 1.0, 1.0 - gain) / 2.0 + 0.5; + } +} + +vec3 rgb(float r, float g, float b) { + return vec3(r / 255.0, g / 255.0, b / 255.0); +} + +vec3 getHeight(float x, float y, float z) { + if (u_Temp == 1.0) { + return arctic_fbm(x, y, z);//arctic_fbm(x, y, z); + } else if (u_Temp == 2.0) { + return earth_fbm(x, y, z); + } else if (u_Temp == 3.0) { + return cliff_fbm(x, y, z); + } else { + return lava_fbm(x, y, z); + } +} + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + + vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices + + // Begin Tinkering======================= + vec3 noiseInput = modelposition.xyz; + noiseInput *= u_ContinentSize;//1.0f; + noiseInput += u_Time * 0.2; + + vec3 noise = vec3(0.0); + noise = getHeight(noiseInput.x, noiseInput.y, noiseInput.z); + + float noiseScale = noise.r; + if (u_Temp != 1.0) { + if (noise.r < 0.5) { + noiseScale = 0.5f; + } + } + vec3 offset = vec3(vs_Nor) * noiseScale; + vec3 noisyModelPosition = modelposition.xyz + offset; + gl_Position = u_ViewProj * vec4(noisyModelPosition, 1.0); + // End Tinkering========================== + // Computer Normal======================== + float d = 0.001f; + + vec3 tangent = normalize(cross(vec3(0, 1, 0), vec3(fs_Nor))); + vec3 bitangent = normalize(cross(vec3(fs_Nor), tangent)); + + vec3 p1 = vs_Pos.xyz + (tangent * d); + vec3 p2 = vs_Pos.xyz + (bitangent * d); + vec3 new1 = (getHeight(p1.x, p1.y, p1.z) * normalize(p1)) + normalize(p1); + vec3 new2 = (getHeight(p2.x, p2.y, p2.z) * normalize(p2)) + normalize(p2); + + vec3 newNor = normalize(cross((new1 - vs_Pos.xyz), (new2 - vs_Pos.xyz))); + // fs_Nor = vec4(newNor, 0.0); + // mat4 tbn = mat4(vec4(tangent, 0.0), vec4(bitangent, 0.0), vs_Nor, vec4(0.0, 0.0, 0.0, 1.0)); + // vec3 globalNor = tbn * localNor; + // fs_Nor = globalNor; + //======================================== + + fs_Pos = vs_Pos; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..79efea76 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "sourceMap": true, + "noImplicitAny": true, + "module": "es6", + "target": "es6", + "allowJs": true, + "moduleResolution": "node" + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..2cce33bb --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,37 @@ +const path = require('path'); + +module.exports = { + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + entry: path.resolve(__dirname, "src/main"), + output: { + path: path.resolve(__dirname, "dist"), + filename: "bundle.js", + publicPath: '/', + }, + module: { + rules: [ + { + test: /\.ts$/, + use: 'ts-loader', + exclude: /node_modules/ + }, + { + test: /\.glsl$/, + loader: 'webpack-glsl-loader' + }, + ] + }, + resolve: { + extensions: ['.ts', '.js' ], + }, + devtool: 'source-map', + devServer: { + port: 5660, + static: { + directory: path.join(__dirname, 'dist'), + }, + client: { + overlay: true, + } + }, +}; From c5801a5c40d832906cfcedb54e60089ce11bdf4f Mon Sep 17 00:00:00 2001 From: raykim1996 Date: Wed, 29 Sep 2021 23:39:14 -0400 Subject: [PATCH 02/10] img --- img/HW01-Earth.png | Bin 0 -> 359100 bytes img/HW01-Lava Planet.png | Bin 0 -> 374046 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/HW01-Earth.png create mode 100644 img/HW01-Lava Planet.png diff --git a/img/HW01-Earth.png b/img/HW01-Earth.png new file mode 100644 index 0000000000000000000000000000000000000000..b1da4d2fe47979cb812da87a5b2496f0a40c058a GIT binary patch literal 359100 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∾V_no7A_ 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±ja9cQZa7!}j~APH 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̜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

|M`$B6enO%~zVnDRcJ^Zl1cni8 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ⅈ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 Date: Wed, 29 Sep 2021 23:50:30 -0400 Subject: [PATCH 03/10] readme --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index c89dda1c..76afd9a3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,22 @@ # CIS 566 Project 1: Noisy Planets +## Submitted Version +- Name: Ray DongHo Kim +- PennKey: kdongho +- Features: + - Used FBM noise functions and toolbox functions, such as gain and smoothstep to generate multiple biomes + - Sliders: + - Moon Speed slider can modify the speed of moon's rotation around the planet + - Continent Number slider can modify the amount of continents + - Temparature slider changes the planet's biome based on the value + - Below 10: Arctic + - 10 ~ 30: Earth + - 30 ~ 50: Dessert + - Above 50: Lava + - + - +- Live Demo Link: + ## Objective - Continue practicing WebGL and Typescript - Experiment with noise functions to procedurally generate the surface of a planet From 40b99462df46f902fa7cfe6a66cec3d21af18850 Mon Sep 17 00:00:00 2001 From: "ray.dh.kim" Date: Wed, 29 Sep 2021 23:51:30 -0400 Subject: [PATCH 04/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 76afd9a3..04c20947 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ - 10 ~ 30: Earth - 30 ~ 50: Dessert - Above 50: Lava - - - - + - + - - Live Demo Link: ## Objective From 1fd08f8d6ffc36fc10f6481954fb92c92a327f71 Mon Sep 17 00:00:00 2001 From: "ray.dh.kim" Date: Wed, 29 Sep 2021 23:53:48 -0400 Subject: [PATCH 05/10] Create build-and-deploy.yml --- .github/workflows/build-and-deploy.yml | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/build-and-deploy.yml diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml new file mode 100644 index 00000000..d35abd7b --- /dev/null +++ b/.github/workflows/build-and-deploy.yml @@ -0,0 +1,39 @@ + + +name: Build and Deploy +on: + push: + branches: + - master +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2.3.1 + with: + persist-credentials: false + + - uses: actions/setup-node@v2-beta + with: + node-version: "15.x" + + - uses: actions/cache@v2 + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ hashFiles('**/package-lock.json') }} + + - name: Install and Build 🔧 + run: | + npm ci + export NODE_ENV=production + npm run-script build + touch dist/.nojekyll + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@3.6.2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: gh-pages + FOLDER: dist + CLEAN: true From bf652585a02656367aa57aa887ba23b46ce95043 Mon Sep 17 00:00:00 2001 From: "ray.dh.kim" Date: Wed, 29 Sep 2021 23:55:41 -0400 Subject: [PATCH 06/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 04c20947..6c729eb9 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ - 30 ~ 50: Dessert - Above 50: Lava - - - + - - Live Demo Link: ## Objective From cc16883d673cb253f182bc519ad0fe74be144990 Mon Sep 17 00:00:00 2001 From: raykim1996 Date: Wed, 29 Sep 2021 23:58:48 -0400 Subject: [PATCH 07/10] readme2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c729eb9..ab79bd57 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ - Above 50: Lava - - -- Live Demo Link: +- Live Demo Link: https://raykim1996.github.io/hw01-noisy-planet/ ## Objective - Continue practicing WebGL and Typescript From 42fbec3d826287378e8bb2d03c4ab93ed1014ff0 Mon Sep 17 00:00:00 2001 From: "ray.dh.kim" Date: Thu, 30 Sep 2021 00:05:55 -0400 Subject: [PATCH 08/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab79bd57..feed4ddd 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ - Used FBM noise functions and toolbox functions, such as gain and smoothstep to generate multiple biomes - Sliders: - Moon Speed slider can modify the speed of moon's rotation around the planet - - Continent Number slider can modify the amount of continents + - Continent Number slider can modify the amount of continents of the planet - Temparature slider changes the planet's biome based on the value - Below 10: Arctic - 10 ~ 30: Earth From 4a6af3f4af4cea80e3b752508648b403c6101312 Mon Sep 17 00:00:00 2001 From: Austin Eng Date: Thu, 30 Sep 2021 17:32:47 -0700 Subject: [PATCH 09/10] Remove bundled files in dist/ --- dist/bundle.js | 10798 ------------------------------------------- dist/bundle.js.map | 1 - 2 files changed, 10799 deletions(-) delete mode 100644 dist/bundle.js delete mode 100644 dist/bundle.js.map diff --git a/dist/bundle.js b/dist/bundle.js deleted file mode 100644 index 7a21c7b2..00000000 --- a/dist/bundle.js +++ /dev/null @@ -1,10798 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/3d-view-controls/camera.js": -/*!*************************************************!*\ - !*** ./node_modules/3d-view-controls/camera.js ***! - \*************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = createCamera - -var now = __webpack_require__(/*! right-now */ "./node_modules/right-now/browser.js") -var createView = __webpack_require__(/*! 3d-view */ "./node_modules/3d-view/view.js") -var mouseChange = __webpack_require__(/*! mouse-change */ "./node_modules/mouse-change/mouse-listen.js") -var mouseWheel = __webpack_require__(/*! mouse-wheel */ "./node_modules/mouse-wheel/wheel.js") -var mouseOffset = __webpack_require__(/*! mouse-event-offset */ "./node_modules/mouse-event-offset/index.js") -var hasPassive = __webpack_require__(/*! has-passive-events */ "./node_modules/has-passive-events/index.js") - -function createCamera(element, options) { - element = element || document.body - options = options || {} - - var limits = [ 0.01, Infinity ] - if('distanceLimits' in options) { - limits[0] = options.distanceLimits[0] - limits[1] = options.distanceLimits[1] - } - if('zoomMin' in options) { - limits[0] = options.zoomMin - } - if('zoomMax' in options) { - limits[1] = options.zoomMax - } - - var view = createView({ - center: options.center || [0,0,0], - up: options.up || [0,1,0], - eye: options.eye || [0,0,10], - mode: options.mode || 'orbit', - distanceLimits: limits - }) - - var pmatrix = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - var distance = 0.0 - var width = element.clientWidth - var height = element.clientHeight - - var camera = { - view: view, - element: element, - delay: options.delay || 16, - rotateSpeed: options.rotateSpeed || 1, - zoomSpeed: options.zoomSpeed || 1, - translateSpeed: options.translateSpeed || 1, - flipX: !!options.flipX, - flipY: !!options.flipY, - modes: view.modes, - tick: function() { - var t = now() - var delay = this.delay - view.idle(t-delay) - view.flush(t-(100+delay*2)) - var ctime = t - 2 * delay - view.recalcMatrix(ctime) - var allEqual = true - var matrix = view.computedMatrix - for(var i=0; i<16; ++i) { - allEqual = allEqual && (pmatrix[i] === matrix[i]) - pmatrix[i] = matrix[i] - } - var sizeChanged = - element.clientWidth === width && - element.clientHeight === height - width = element.clientWidth - height = element.clientHeight - if(allEqual) { - return !sizeChanged - } - distance = Math.exp(view.computedRadius[0]) - return true - }, - lookAt: function(center, eye, up) { - view.lookAt(view.lastT(), center, eye, up) - }, - rotate: function(pitch, yaw, roll) { - view.rotate(view.lastT(), pitch, yaw, roll) - }, - pan: function(dx, dy, dz) { - view.pan(view.lastT(), dx, dy, dz) - }, - translate: function(dx, dy, dz) { - view.translate(view.lastT(), dx, dy, dz) - } - } - - Object.defineProperties(camera, { - matrix: { - get: function() { - return view.computedMatrix - }, - set: function(mat) { - view.setMatrix(view.lastT(), mat) - return view.computedMatrix - }, - enumerable: true - }, - mode: { - get: function() { - return view.getMode() - }, - set: function(mode) { - view.setMode(mode) - return view.getMode() - }, - enumerable: true - }, - center: { - get: function() { - return view.computedCenter - }, - set: function(ncenter) { - view.lookAt(view.lastT(), ncenter) - return view.computedCenter - }, - enumerable: true - }, - eye: { - get: function() { - return view.computedEye - }, - set: function(neye) { - view.lookAt(view.lastT(), null, neye) - return view.computedEye - }, - enumerable: true - }, - up: { - get: function() { - return view.computedUp - }, - set: function(nup) { - view.lookAt(view.lastT(), null, null, nup) - return view.computedUp - }, - enumerable: true - }, - distance: { - get: function() { - return distance - }, - set: function(d) { - view.setDistance(view.lastT(), d) - return d - }, - enumerable: true - }, - distanceLimits: { - get: function() { - return view.getDistanceLimits(limits) - }, - set: function(v) { - view.setDistanceLimits(v) - return v - }, - enumerable: true - } - }) - - element.addEventListener('contextmenu', function(ev) { - ev.preventDefault() - return false - }) - - var lastX = 0, lastY = 0, lastMods = {shift: false, control: false, alt: false, meta: false} - mouseChange(element, handleInteraction) - - //enable simple touch interactions - element.addEventListener('touchstart', function (ev) { - var xy = mouseOffset(ev.changedTouches[0], element) - handleInteraction(0, xy[0], xy[1], lastMods) - handleInteraction(1, xy[0], xy[1], lastMods) - - ev.preventDefault() - }, hasPassive ? {passive: false} : false) - - element.addEventListener('touchmove', function (ev) { - var xy = mouseOffset(ev.changedTouches[0], element) - handleInteraction(1, xy[0], xy[1], lastMods) - - ev.preventDefault() - }, hasPassive ? {passive: false} : false) - - element.addEventListener('touchend', function (ev) { - var xy = mouseOffset(ev.changedTouches[0], element) - handleInteraction(0, lastX, lastY, lastMods) - - ev.preventDefault() - }, hasPassive ? {passive: false} : false) - - function handleInteraction (buttons, x, y, mods) { - var scale = 1.0 / element.clientHeight - var dx = scale * (x - lastX) - var dy = scale * (y - lastY) - - var flipX = camera.flipX ? 1 : -1 - var flipY = camera.flipY ? 1 : -1 - - var drot = Math.PI * camera.rotateSpeed - - var t = now() - - if(buttons & 1) { - if(mods.shift) { - view.rotate(t, 0, 0, -dx * drot) - } else { - view.rotate(t, flipX * drot * dx, -flipY * drot * dy, 0) - } - } else if(buttons & 2) { - view.pan(t, -camera.translateSpeed * dx * distance, camera.translateSpeed * dy * distance, 0) - } else if(buttons & 4) { - var kzoom = camera.zoomSpeed * dy / window.innerHeight * (t - view.lastT()) * 50.0 - view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1)) - } - - lastX = x - lastY = y - lastMods = mods - } - - mouseWheel(element, function(dx, dy, dz) { - var flipX = camera.flipX ? 1 : -1 - var flipY = camera.flipY ? 1 : -1 - var t = now() - if(Math.abs(dx) > Math.abs(dy)) { - view.rotate(t, 0, 0, -dx * flipX * Math.PI * camera.rotateSpeed / window.innerWidth) - } else { - var kzoom = camera.zoomSpeed * flipY * dy / window.innerHeight * (t - view.lastT()) / 100.0 - view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1)) - } - }, true) - - return camera -} - - -/***/ }), - -/***/ "./node_modules/3d-view/view.js": -/*!**************************************!*\ - !*** ./node_modules/3d-view/view.js ***! - \**************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = createViewController - -var createTurntable = __webpack_require__(/*! turntable-camera-controller */ "./node_modules/turntable-camera-controller/turntable.js") -var createOrbit = __webpack_require__(/*! orbit-camera-controller */ "./node_modules/orbit-camera-controller/orbit.js") -var createMatrix = __webpack_require__(/*! matrix-camera-controller */ "./node_modules/matrix-camera-controller/matrix.js") - -function ViewController(controllers, mode) { - this._controllerNames = Object.keys(controllers) - this._controllerList = this._controllerNames.map(function(n) { - return controllers[n] - }) - this._mode = mode - this._active = controllers[mode] - if(!this._active) { - this._mode = 'turntable' - this._active = controllers.turntable - } - this.modes = this._controllerNames - this.computedMatrix = this._active.computedMatrix - this.computedEye = this._active.computedEye - this.computedUp = this._active.computedUp - this.computedCenter = this._active.computedCenter - this.computedRadius = this._active.computedRadius -} - -var proto = ViewController.prototype - -proto.flush = function(a0) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].flush(a0) - } -} -proto.idle = function(a0) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].idle(a0) - } -} -proto.lookAt = function(a0, a1, a2, a3) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].lookAt(a0, a1, a2, a3) - } -} -proto.rotate = function(a0, a1, a2, a3) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].rotate(a0, a1, a2, a3) - } -} -proto.pan = function(a0, a1, a2, a3) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].pan(a0, a1, a2, a3) - } -} -proto.translate = function(a0, a1, a2, a3) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].translate(a0, a1, a2, a3) - } -} -proto.setMatrix = function(a0, a1) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].setMatrix(a0, a1) - } -} -proto.setDistanceLimits = function(a0, a1) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].setDistanceLimits(a0, a1) - } -} -proto.setDistance = function(a0, a1) { - var cc = this._controllerList - for (var i = 0; i < cc.length; ++i) { - cc[i].setDistance(a0, a1) - } -} - -proto.recalcMatrix = function(t) { - this._active.recalcMatrix(t) -} - -proto.getDistance = function(t) { - return this._active.getDistance(t) -} -proto.getDistanceLimits = function(out) { - return this._active.getDistanceLimits(out) -} - -proto.lastT = function() { - return this._active.lastT() -} - -proto.setMode = function(mode) { - if(mode === this._mode) { - return - } - var idx = this._controllerNames.indexOf(mode) - if(idx < 0) { - return - } - var prev = this._active - var next = this._controllerList[idx] - var lastT = Math.max(prev.lastT(), next.lastT()) - - prev.recalcMatrix(lastT) - next.setMatrix(lastT, prev.computedMatrix) - - this._active = next - this._mode = mode - - //Update matrix properties - this.computedMatrix = this._active.computedMatrix - this.computedEye = this._active.computedEye - this.computedUp = this._active.computedUp - this.computedCenter = this._active.computedCenter - this.computedRadius = this._active.computedRadius -} - -proto.getMode = function() { - return this._mode -} - -function createViewController(options) { - options = options || {} - - var eye = options.eye || [0,0,1] - var center = options.center || [0,0,0] - var up = options.up || [0,1,0] - var limits = options.distanceLimits || [0, Infinity] - var mode = options.mode || 'turntable' - - var turntable = createTurntable() - var orbit = createOrbit() - var matrix = createMatrix() - - turntable.setDistanceLimits(limits[0], limits[1]) - turntable.lookAt(0, eye, center, up) - orbit.setDistanceLimits(limits[0], limits[1]) - orbit.lookAt(0, eye, center, up) - matrix.setDistanceLimits(limits[0], limits[1]) - matrix.lookAt(0, eye, center, up) - - return new ViewController({ - turntable: turntable, - orbit: orbit, - matrix: matrix - }, mode) -} - -/***/ }), - -/***/ "./node_modules/binary-search-bounds/search-bounds.js": -/*!************************************************************!*\ - !*** ./node_modules/binary-search-bounds/search-bounds.js ***! - \************************************************************/ -/***/ ((module) => { - -"use strict"; - - -// (a, y, c, l, h) = (array, y[, cmp, lo, hi]) - -function ge(a, y, c, l, h) { - var i = h + 1; - while (l <= h) { - var m = (l + h) >>> 1, x = a[m]; - var p = (c !== undefined) ? c(x, y) : (x - y); - if (p >= 0) { i = m; h = m - 1 } else { l = m + 1 } - } - return i; -}; - -function gt(a, y, c, l, h) { - var i = h + 1; - while (l <= h) { - var m = (l + h) >>> 1, x = a[m]; - var p = (c !== undefined) ? c(x, y) : (x - y); - if (p > 0) { i = m; h = m - 1 } else { l = m + 1 } - } - return i; -}; - -function lt(a, y, c, l, h) { - var i = l - 1; - while (l <= h) { - var m = (l + h) >>> 1, x = a[m]; - var p = (c !== undefined) ? c(x, y) : (x - y); - if (p < 0) { i = m; l = m + 1 } else { h = m - 1 } - } - return i; -}; - -function le(a, y, c, l, h) { - var i = l - 1; - while (l <= h) { - var m = (l + h) >>> 1, x = a[m]; - var p = (c !== undefined) ? c(x, y) : (x - y); - if (p <= 0) { i = m; l = m + 1 } else { h = m - 1 } - } - return i; -}; - -function eq(a, y, c, l, h) { - while (l <= h) { - var m = (l + h) >>> 1, x = a[m]; - var p = (c !== undefined) ? c(x, y) : (x - y); - if (p === 0) { return m } - if (p <= 0) { l = m + 1 } else { h = m - 1 } - } - return -1; -}; - -function norm(a, y, c, l, h, f) { - if (typeof c === 'function') { - return f(a, y, c, (l === undefined) ? 0 : l | 0, (h === undefined) ? a.length - 1 : h | 0); - } - return f(a, y, undefined, (c === undefined) ? 0 : c | 0, (l === undefined) ? a.length - 1 : l | 0); -} - -module.exports = { - ge: function(a, y, c, l, h) { return norm(a, y, c, l, h, ge)}, - gt: function(a, y, c, l, h) { return norm(a, y, c, l, h, gt)}, - lt: function(a, y, c, l, h) { return norm(a, y, c, l, h, lt)}, - le: function(a, y, c, l, h) { return norm(a, y, c, l, h, le)}, - eq: function(a, y, c, l, h) { return norm(a, y, c, l, h, eq)} -} - - -/***/ }), - -/***/ "./node_modules/cubic-hermite/hermite.js": -/*!***********************************************!*\ - !*** ./node_modules/cubic-hermite/hermite.js ***! - \***********************************************/ -/***/ ((module) => { - -"use strict"; - - -function dcubicHermite(p0, v0, p1, v1, t, f) { - var dh00 = 6*t*t-6*t, - dh10 = 3*t*t-4*t + 1, - dh01 = -6*t*t+6*t, - dh11 = 3*t*t-2*t - if(p0.length) { - if(!f) { - f = new Array(p0.length) - } - for(var i=p0.length-1; i>=0; --i) { - f[i] = dh00*p0[i] + dh10*v0[i] + dh01*p1[i] + dh11*v1[i] - } - return f - } - return dh00*p0 + dh10*v0 + dh01*p1[i] + dh11*v1 -} - -function cubicHermite(p0, v0, p1, v1, t, f) { - var ti = (t-1), t2 = t*t, ti2 = ti*ti, - h00 = (1+2*t)*ti2, - h10 = t*ti2, - h01 = t2*(3-2*t), - h11 = t2*ti - if(p0.length) { - if(!f) { - f = new Array(p0.length) - } - for(var i=p0.length-1; i>=0; --i) { - f[i] = h00*p0[i] + h10*v0[i] + h01*p1[i] + h11*v1[i] - } - return f - } - return h00*p0 + h10*v0 + h01*p1 + h11*v1 -} - -module.exports = cubicHermite -module.exports.derivative = dcubicHermite - -/***/ }), - -/***/ "./node_modules/dat.gui/build/dat.gui.module.js": -/*!******************************************************!*\ - !*** ./node_modules/dat.gui/build/dat.gui.module.js ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "color": () => (/* binding */ color), -/* harmony export */ "controllers": () => (/* binding */ controllers), -/* harmony export */ "dom": () => (/* binding */ dom$1), -/* harmony export */ "gui": () => (/* binding */ gui), -/* harmony export */ "GUI": () => (/* binding */ GUI$1), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -function ___$insertStyle(css) { - if (!css) { - return; - } - if (typeof window === 'undefined') { - return; - } - - var style = document.createElement('style'); - - style.setAttribute('type', 'text/css'); - style.innerHTML = css; - document.head.appendChild(style); - - return css; -} - -function colorToString (color, forceCSSHex) { - var colorFormat = color.__state.conversionName.toString(); - var r = Math.round(color.r); - var g = Math.round(color.g); - var b = Math.round(color.b); - var a = color.a; - var h = Math.round(color.h); - var s = color.s.toFixed(1); - var v = color.v.toFixed(1); - if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') { - var str = color.hex.toString(16); - while (str.length < 6) { - str = '0' + str; - } - return '#' + str; - } else if (colorFormat === 'CSS_RGB') { - return 'rgb(' + r + ',' + g + ',' + b + ')'; - } else if (colorFormat === 'CSS_RGBA') { - return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; - } else if (colorFormat === 'HEX') { - return '0x' + color.hex.toString(16); - } else if (colorFormat === 'RGB_ARRAY') { - return '[' + r + ',' + g + ',' + b + ']'; - } else if (colorFormat === 'RGBA_ARRAY') { - return '[' + r + ',' + g + ',' + b + ',' + a + ']'; - } else if (colorFormat === 'RGB_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + '}'; - } else if (colorFormat === 'RGBA_OBJ') { - return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}'; - } else if (colorFormat === 'HSV_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + '}'; - } else if (colorFormat === 'HSVA_OBJ') { - return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}'; - } - return 'unknown format'; -} - -var ARR_EACH = Array.prototype.forEach; -var ARR_SLICE = Array.prototype.slice; -var Common = { - BREAK: {}, - extend: function extend(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (!this.isUndefined(obj[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - defaults: function defaults(target) { - this.each(ARR_SLICE.call(arguments, 1), function (obj) { - var keys = this.isObject(obj) ? Object.keys(obj) : []; - keys.forEach(function (key) { - if (this.isUndefined(target[key])) { - target[key] = obj[key]; - } - }.bind(this)); - }, this); - return target; - }, - compose: function compose() { - var toCall = ARR_SLICE.call(arguments); - return function () { - var args = ARR_SLICE.call(arguments); - for (var i = toCall.length - 1; i >= 0; i--) { - args = [toCall[i].apply(this, args)]; - } - return args[0]; - }; - }, - each: function each(obj, itr, scope) { - if (!obj) { - return; - } - if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) { - obj.forEach(itr, scope); - } else if (obj.length === obj.length + 0) { - var key = void 0; - var l = void 0; - for (key = 0, l = obj.length; key < l; key++) { - if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) { - return; - } - } - } else { - for (var _key in obj) { - if (itr.call(scope, obj[_key], _key) === this.BREAK) { - return; - } - } - } - }, - defer: function defer(fnc) { - setTimeout(fnc, 0); - }, - debounce: function debounce(func, threshold, callImmediately) { - var timeout = void 0; - return function () { - var obj = this; - var args = arguments; - function delayed() { - timeout = null; - if (!callImmediately) func.apply(obj, args); - } - var callNow = callImmediately || !timeout; - clearTimeout(timeout); - timeout = setTimeout(delayed, threshold); - if (callNow) { - func.apply(obj, args); - } - }; - }, - toArray: function toArray(obj) { - if (obj.toArray) return obj.toArray(); - return ARR_SLICE.call(obj); - }, - isUndefined: function isUndefined(obj) { - return obj === undefined; - }, - isNull: function isNull(obj) { - return obj === null; - }, - isNaN: function (_isNaN) { - function isNaN(_x) { - return _isNaN.apply(this, arguments); - } - isNaN.toString = function () { - return _isNaN.toString(); - }; - return isNaN; - }(function (obj) { - return isNaN(obj); - }), - isArray: Array.isArray || function (obj) { - return obj.constructor === Array; - }, - isObject: function isObject(obj) { - return obj === Object(obj); - }, - isNumber: function isNumber(obj) { - return obj === obj + 0; - }, - isString: function isString(obj) { - return obj === obj + ''; - }, - isBoolean: function isBoolean(obj) { - return obj === false || obj === true; - }, - isFunction: function isFunction(obj) { - return obj instanceof Function; - } -}; - -var INTERPRETATIONS = [ -{ - litmus: Common.isString, - conversions: { - THREE_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0) - }; - }, - write: colorToString - }, - SIX_CHAR_HEX: { - read: function read(original) { - var test = original.match(/^#([A-F0-9]{6})$/i); - if (test === null) { - return false; - } - return { - space: 'HEX', - hex: parseInt('0x' + test[1].toString(), 0) - }; - }, - write: colorToString - }, - CSS_RGB: { - read: function read(original) { - var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]) - }; - }, - write: colorToString - }, - CSS_RGBA: { - read: function read(original) { - var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); - if (test === null) { - return false; - } - return { - space: 'RGB', - r: parseFloat(test[1]), - g: parseFloat(test[2]), - b: parseFloat(test[3]), - a: parseFloat(test[4]) - }; - }, - write: colorToString - } - } -}, -{ - litmus: Common.isNumber, - conversions: { - HEX: { - read: function read(original) { - return { - space: 'HEX', - hex: original, - conversionName: 'HEX' - }; - }, - write: function write(color) { - return color.hex; - } - } - } -}, -{ - litmus: Common.isArray, - conversions: { - RGB_ARRAY: { - read: function read(original) { - if (original.length !== 3) { - return false; - } - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b]; - } - }, - RGBA_ARRAY: { - read: function read(original) { - if (original.length !== 4) return false; - return { - space: 'RGB', - r: original[0], - g: original[1], - b: original[2], - a: original[3] - }; - }, - write: function write(color) { - return [color.r, color.g, color.b, color.a]; - } - } - } -}, -{ - litmus: Common.isObject, - conversions: { - RGBA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b, - a: color.a - }; - } - }, - RGB_OBJ: { - read: function read(original) { - if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) { - return { - space: 'RGB', - r: original.r, - g: original.g, - b: original.b - }; - } - return false; - }, - write: function write(color) { - return { - r: color.r, - g: color.g, - b: color.b - }; - } - }, - HSVA_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v, - a: original.a - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v, - a: color.a - }; - } - }, - HSV_OBJ: { - read: function read(original) { - if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) { - return { - space: 'HSV', - h: original.h, - s: original.s, - v: original.v - }; - } - return false; - }, - write: function write(color) { - return { - h: color.h, - s: color.s, - v: color.v - }; - } - } - } -}]; -var result = void 0; -var toReturn = void 0; -var interpret = function interpret() { - toReturn = false; - var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0]; - Common.each(INTERPRETATIONS, function (family) { - if (family.litmus(original)) { - Common.each(family.conversions, function (conversion, conversionName) { - result = conversion.read(original); - if (toReturn === false && result !== false) { - toReturn = result; - result.conversionName = conversionName; - result.conversion = conversion; - return Common.BREAK; - } - }); - return Common.BREAK; - } - }); - return toReturn; -}; - -var tmpComponent = void 0; -var ColorMath = { - hsv_to_rgb: function hsv_to_rgb(h, s, v) { - var hi = Math.floor(h / 60) % 6; - var f = h / 60 - Math.floor(h / 60); - var p = v * (1.0 - s); - var q = v * (1.0 - f * s); - var t = v * (1.0 - (1.0 - f) * s); - var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi]; - return { - r: c[0] * 255, - g: c[1] * 255, - b: c[2] * 255 - }; - }, - rgb_to_hsv: function rgb_to_hsv(r, g, b) { - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h = void 0; - var s = void 0; - if (max !== 0) { - s = delta / max; - } else { - return { - h: NaN, - s: 0, - v: 0 - }; - } - if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else { - h = 4 + (r - g) / delta; - } - h /= 6; - if (h < 0) { - h += 1; - } - return { - h: h * 360, - s: s, - v: max / 255 - }; - }, - rgb_to_hex: function rgb_to_hex(r, g, b) { - var hex = this.hex_with_component(0, 2, r); - hex = this.hex_with_component(hex, 1, g); - hex = this.hex_with_component(hex, 0, b); - return hex; - }, - component_from_hex: function component_from_hex(hex, componentIndex) { - return hex >> componentIndex * 8 & 0xFF; - }, - hex_with_component: function hex_with_component(hex, componentIndex, value) { - return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent); - } -}; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - - - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - -var get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var Color = function () { - function Color() { - classCallCheck(this, Color); - this.__state = interpret.apply(this, arguments); - if (this.__state === false) { - throw new Error('Failed to interpret color arguments'); - } - this.__state.a = this.__state.a || 1; - } - createClass(Color, [{ - key: 'toString', - value: function toString() { - return colorToString(this); - } - }, { - key: 'toHexString', - value: function toHexString() { - return colorToString(this, true); - } - }, { - key: 'toOriginal', - value: function toOriginal() { - return this.__state.conversion.write(this); - } - }]); - return Color; -}(); -function defineRGBComponent(target, component, componentHexIndex) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'RGB') { - return this.__state[component]; - } - Color.recalculateRGB(this, component, componentHexIndex); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'RGB') { - Color.recalculateRGB(this, component, componentHexIndex); - this.__state.space = 'RGB'; - } - this.__state[component] = v; - } - }); -} -function defineHSVComponent(target, component) { - Object.defineProperty(target, component, { - get: function get$$1() { - if (this.__state.space === 'HSV') { - return this.__state[component]; - } - Color.recalculateHSV(this); - return this.__state[component]; - }, - set: function set$$1(v) { - if (this.__state.space !== 'HSV') { - Color.recalculateHSV(this); - this.__state.space = 'HSV'; - } - this.__state[component] = v; - } - }); -} -Color.recalculateRGB = function (color, component, componentHexIndex) { - if (color.__state.space === 'HEX') { - color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex); - } else if (color.__state.space === 'HSV') { - Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); - } else { - throw new Error('Corrupted color state'); - } -}; -Color.recalculateHSV = function (color) { - var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b); - Common.extend(color.__state, { - s: result.s, - v: result.v - }); - if (!Common.isNaN(result.h)) { - color.__state.h = result.h; - } else if (Common.isUndefined(color.__state.h)) { - color.__state.h = 0; - } -}; -Color.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a']; -defineRGBComponent(Color.prototype, 'r', 2); -defineRGBComponent(Color.prototype, 'g', 1); -defineRGBComponent(Color.prototype, 'b', 0); -defineHSVComponent(Color.prototype, 'h'); -defineHSVComponent(Color.prototype, 's'); -defineHSVComponent(Color.prototype, 'v'); -Object.defineProperty(Color.prototype, 'a', { - get: function get$$1() { - return this.__state.a; - }, - set: function set$$1(v) { - this.__state.a = v; - } -}); -Object.defineProperty(Color.prototype, 'hex', { - get: function get$$1() { - if (this.__state.space !== 'HEX') { - this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b); - this.__state.space = 'HEX'; - } - return this.__state.hex; - }, - set: function set$$1(v) { - this.__state.space = 'HEX'; - this.__state.hex = v; - } -}); - -var Controller = function () { - function Controller(object, property) { - classCallCheck(this, Controller); - this.initialValue = object[property]; - this.domElement = document.createElement('div'); - this.object = object; - this.property = property; - this.__onChange = undefined; - this.__onFinishChange = undefined; - } - createClass(Controller, [{ - key: 'onChange', - value: function onChange(fnc) { - this.__onChange = fnc; - return this; - } - }, { - key: 'onFinishChange', - value: function onFinishChange(fnc) { - this.__onFinishChange = fnc; - return this; - } - }, { - key: 'setValue', - value: function setValue(newValue) { - this.object[this.property] = newValue; - if (this.__onChange) { - this.__onChange.call(this, newValue); - } - this.updateDisplay(); - return this; - } - }, { - key: 'getValue', - value: function getValue() { - return this.object[this.property]; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - return this; - } - }, { - key: 'isModified', - value: function isModified() { - return this.initialValue !== this.getValue(); - } - }]); - return Controller; -}(); - -var EVENT_MAP = { - HTMLEvents: ['change'], - MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'], - KeyboardEvents: ['keydown'] -}; -var EVENT_MAP_INV = {}; -Common.each(EVENT_MAP, function (v, k) { - Common.each(v, function (e) { - EVENT_MAP_INV[e] = k; - }); -}); -var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; -function cssValueToPixels(val) { - if (val === '0' || Common.isUndefined(val)) { - return 0; - } - var match = val.match(CSS_VALUE_PIXELS); - if (!Common.isNull(match)) { - return parseFloat(match[1]); - } - return 0; -} -var dom = { - makeSelectable: function makeSelectable(elem, selectable) { - if (elem === undefined || elem.style === undefined) return; - elem.onselectstart = selectable ? function () { - return false; - } : function () {}; - elem.style.MozUserSelect = selectable ? 'auto' : 'none'; - elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; - elem.unselectable = selectable ? 'on' : 'off'; - }, - makeFullscreen: function makeFullscreen(elem, hor, vert) { - var vertical = vert; - var horizontal = hor; - if (Common.isUndefined(horizontal)) { - horizontal = true; - } - if (Common.isUndefined(vertical)) { - vertical = true; - } - elem.style.position = 'absolute'; - if (horizontal) { - elem.style.left = 0; - elem.style.right = 0; - } - if (vertical) { - elem.style.top = 0; - elem.style.bottom = 0; - } - }, - fakeEvent: function fakeEvent(elem, eventType, pars, aux) { - var params = pars || {}; - var className = EVENT_MAP_INV[eventType]; - if (!className) { - throw new Error('Event type ' + eventType + ' not supported.'); - } - var evt = document.createEvent(className); - switch (className) { - case 'MouseEvents': - { - var clientX = params.x || params.clientX || 0; - var clientY = params.y || params.clientY || 0; - evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0, - 0, - clientX, - clientY, - false, false, false, false, 0, null); - break; - } - case 'KeyboardEvents': - { - var init = evt.initKeyboardEvent || evt.initKeyEvent; - Common.defaults(params, { - cancelable: true, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: undefined, - charCode: undefined - }); - init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode); - break; - } - default: - { - evt.initEvent(eventType, params.bubbles || false, params.cancelable || true); - break; - } - } - Common.defaults(evt, aux); - elem.dispatchEvent(evt); - }, - bind: function bind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.addEventListener) { - elem.addEventListener(event, func, bool); - } else if (elem.attachEvent) { - elem.attachEvent('on' + event, func); - } - return dom; - }, - unbind: function unbind(elem, event, func, newBool) { - var bool = newBool || false; - if (elem.removeEventListener) { - elem.removeEventListener(event, func, bool); - } else if (elem.detachEvent) { - elem.detachEvent('on' + event, func); - } - return dom; - }, - addClass: function addClass(elem, className) { - if (elem.className === undefined) { - elem.className = className; - } else if (elem.className !== className) { - var classes = elem.className.split(/ +/); - if (classes.indexOf(className) === -1) { - classes.push(className); - elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); - } - } - return dom; - }, - removeClass: function removeClass(elem, className) { - if (className) { - if (elem.className === className) { - elem.removeAttribute('class'); - } else { - var classes = elem.className.split(/ +/); - var index = classes.indexOf(className); - if (index !== -1) { - classes.splice(index, 1); - elem.className = classes.join(' '); - } - } - } else { - elem.className = undefined; - } - return dom; - }, - hasClass: function hasClass(elem, className) { - return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; - }, - getWidth: function getWidth(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width); - }, - getHeight: function getHeight(elem) { - var style = getComputedStyle(elem); - return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height); - }, - getOffset: function getOffset(el) { - var elem = el; - var offset = { left: 0, top: 0 }; - if (elem.offsetParent) { - do { - offset.left += elem.offsetLeft; - offset.top += elem.offsetTop; - elem = elem.offsetParent; - } while (elem); - } - return offset; - }, - isActive: function isActive(elem) { - return elem === document.activeElement && (elem.type || elem.href); - } -}; - -var BooleanController = function (_Controller) { - inherits(BooleanController, _Controller); - function BooleanController(object, property) { - classCallCheck(this, BooleanController); - var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property)); - var _this = _this2; - _this2.__prev = _this2.getValue(); - _this2.__checkbox = document.createElement('input'); - _this2.__checkbox.setAttribute('type', 'checkbox'); - function onChange() { - _this.setValue(!_this.__prev); - } - dom.bind(_this2.__checkbox, 'change', onChange, false); - _this2.domElement.appendChild(_this2.__checkbox); - _this2.updateDisplay(); - return _this2; - } - createClass(BooleanController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - this.__prev = this.getValue(); - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (this.getValue() === true) { - this.__checkbox.setAttribute('checked', 'checked'); - this.__checkbox.checked = true; - this.__prev = true; - } else { - this.__checkbox.checked = false; - this.__prev = false; - } - return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this); - } - }]); - return BooleanController; -}(Controller); - -var OptionController = function (_Controller) { - inherits(OptionController, _Controller); - function OptionController(object, property, opts) { - classCallCheck(this, OptionController); - var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property)); - var options = opts; - var _this = _this2; - _this2.__select = document.createElement('select'); - if (Common.isArray(options)) { - var map = {}; - Common.each(options, function (element) { - map[element] = element; - }); - options = map; - } - Common.each(options, function (value, key) { - var opt = document.createElement('option'); - opt.innerHTML = key; - opt.setAttribute('value', value); - _this.__select.appendChild(opt); - }); - _this2.updateDisplay(); - dom.bind(_this2.__select, 'change', function () { - var desiredValue = this.options[this.selectedIndex].value; - _this.setValue(desiredValue); - }); - _this2.domElement.appendChild(_this2.__select); - return _this2; - } - createClass(OptionController, [{ - key: 'setValue', - value: function setValue(v) { - var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - return toReturn; - } - }, { - key: 'updateDisplay', - value: function updateDisplay() { - if (dom.isActive(this.__select)) return this; - this.__select.value = this.getValue(); - return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this); - } - }]); - return OptionController; -}(Controller); - -var StringController = function (_Controller) { - inherits(StringController, _Controller); - function StringController(object, property) { - classCallCheck(this, StringController); - var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property)); - var _this = _this2; - function onChange() { - _this.setValue(_this.__input.value); - } - function onBlur() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'keyup', onChange); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - this.blur(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(StringController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - if (!dom.isActive(this.__input)) { - this.__input.value = this.getValue(); - } - return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this); - } - }]); - return StringController; -}(Controller); - -function numDecimals(x) { - var _x = x.toString(); - if (_x.indexOf('.') > -1) { - return _x.length - _x.indexOf('.') - 1; - } - return 0; -} -var NumberController = function (_Controller) { - inherits(NumberController, _Controller); - function NumberController(object, property, params) { - classCallCheck(this, NumberController); - var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property)); - var _params = params || {}; - _this.__min = _params.min; - _this.__max = _params.max; - _this.__step = _params.step; - if (Common.isUndefined(_this.__step)) { - if (_this.initialValue === 0) { - _this.__impliedStep = 1; - } else { - _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10; - } - } else { - _this.__impliedStep = _this.__step; - } - _this.__precision = numDecimals(_this.__impliedStep); - return _this; - } - createClass(NumberController, [{ - key: 'setValue', - value: function setValue(v) { - var _v = v; - if (this.__min !== undefined && _v < this.__min) { - _v = this.__min; - } else if (this.__max !== undefined && _v > this.__max) { - _v = this.__max; - } - if (this.__step !== undefined && _v % this.__step !== 0) { - _v = Math.round(_v / this.__step) * this.__step; - } - return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v); - } - }, { - key: 'min', - value: function min(minValue) { - this.__min = minValue; - return this; - } - }, { - key: 'max', - value: function max(maxValue) { - this.__max = maxValue; - return this; - } - }, { - key: 'step', - value: function step(stepValue) { - this.__step = stepValue; - this.__impliedStep = stepValue; - this.__precision = numDecimals(stepValue); - return this; - } - }]); - return NumberController; -}(Controller); - -function roundToDecimal(value, decimals) { - var tenTo = Math.pow(10, decimals); - return Math.round(value * tenTo) / tenTo; -} -var NumberControllerBox = function (_NumberController) { - inherits(NumberControllerBox, _NumberController); - function NumberControllerBox(object, property, params) { - classCallCheck(this, NumberControllerBox); - var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params)); - _this2.__truncationSuspended = false; - var _this = _this2; - var prevY = void 0; - function onChange() { - var attempted = parseFloat(_this.__input.value); - if (!Common.isNaN(attempted)) { - _this.setValue(attempted); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onBlur() { - onFinish(); - } - function onMouseDrag(e) { - var diff = prevY - e.clientY; - _this.setValue(_this.getValue() + diff * _this.__impliedStep); - prevY = e.clientY; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - onFinish(); - } - function onMouseDown(e) { - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - prevY = e.clientY; - } - _this2.__input = document.createElement('input'); - _this2.__input.setAttribute('type', 'text'); - dom.bind(_this2.__input, 'change', onChange); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__input, 'mousedown', onMouseDown); - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - _this.__truncationSuspended = true; - this.blur(); - _this.__truncationSuspended = false; - onFinish(); - } - }); - _this2.updateDisplay(); - _this2.domElement.appendChild(_this2.__input); - return _this2; - } - createClass(NumberControllerBox, [{ - key: 'updateDisplay', - value: function updateDisplay() { - this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); - return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerBox; -}(NumberController); - -function map(v, i1, i2, o1, o2) { - return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); -} -var NumberControllerSlider = function (_NumberController) { - inherits(NumberControllerSlider, _NumberController); - function NumberControllerSlider(object, property, min, max, step) { - classCallCheck(this, NumberControllerSlider); - var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step })); - var _this = _this2; - _this2.__background = document.createElement('div'); - _this2.__foreground = document.createElement('div'); - dom.bind(_this2.__background, 'mousedown', onMouseDown); - dom.bind(_this2.__background, 'touchstart', onTouchStart); - dom.addClass(_this2.__background, 'slider'); - dom.addClass(_this2.__foreground, 'slider-fg'); - function onMouseDown(e) { - document.activeElement.blur(); - dom.bind(window, 'mousemove', onMouseDrag); - dom.bind(window, 'mouseup', onMouseUp); - onMouseDrag(e); - } - function onMouseDrag(e) { - e.preventDefault(); - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - return false; - } - function onMouseUp() { - dom.unbind(window, 'mousemove', onMouseDrag); - dom.unbind(window, 'mouseup', onMouseUp); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - function onTouchStart(e) { - if (e.touches.length !== 1) { - return; - } - dom.bind(window, 'touchmove', onTouchMove); - dom.bind(window, 'touchend', onTouchEnd); - onTouchMove(e); - } - function onTouchMove(e) { - var clientX = e.touches[0].clientX; - var bgRect = _this.__background.getBoundingClientRect(); - _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max)); - } - function onTouchEnd() { - dom.unbind(window, 'touchmove', onTouchMove); - dom.unbind(window, 'touchend', onTouchEnd); - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.getValue()); - } - } - _this2.updateDisplay(); - _this2.__background.appendChild(_this2.__foreground); - _this2.domElement.appendChild(_this2.__background); - return _this2; - } - createClass(NumberControllerSlider, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var pct = (this.getValue() - this.__min) / (this.__max - this.__min); - this.__foreground.style.width = pct * 100 + '%'; - return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this); - } - }]); - return NumberControllerSlider; -}(NumberController); - -var FunctionController = function (_Controller) { - inherits(FunctionController, _Controller); - function FunctionController(object, property, text) { - classCallCheck(this, FunctionController); - var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property)); - var _this = _this2; - _this2.__button = document.createElement('div'); - _this2.__button.innerHTML = text === undefined ? 'Fire' : text; - dom.bind(_this2.__button, 'click', function (e) { - e.preventDefault(); - _this.fire(); - return false; - }); - dom.addClass(_this2.__button, 'button'); - _this2.domElement.appendChild(_this2.__button); - return _this2; - } - createClass(FunctionController, [{ - key: 'fire', - value: function fire() { - if (this.__onChange) { - this.__onChange.call(this); - } - this.getValue().call(this.object); - if (this.__onFinishChange) { - this.__onFinishChange.call(this, this.getValue()); - } - } - }]); - return FunctionController; -}(Controller); - -var ColorController = function (_Controller) { - inherits(ColorController, _Controller); - function ColorController(object, property) { - classCallCheck(this, ColorController); - var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property)); - _this2.__color = new Color(_this2.getValue()); - _this2.__temp = new Color(0); - var _this = _this2; - _this2.domElement = document.createElement('div'); - dom.makeSelectable(_this2.domElement, false); - _this2.__selector = document.createElement('div'); - _this2.__selector.className = 'selector'; - _this2.__saturation_field = document.createElement('div'); - _this2.__saturation_field.className = 'saturation-field'; - _this2.__field_knob = document.createElement('div'); - _this2.__field_knob.className = 'field-knob'; - _this2.__field_knob_border = '2px solid '; - _this2.__hue_knob = document.createElement('div'); - _this2.__hue_knob.className = 'hue-knob'; - _this2.__hue_field = document.createElement('div'); - _this2.__hue_field.className = 'hue-field'; - _this2.__input = document.createElement('input'); - _this2.__input.type = 'text'; - _this2.__input_textShadow = '0 1px 1px '; - dom.bind(_this2.__input, 'keydown', function (e) { - if (e.keyCode === 13) { - onBlur.call(this); - } - }); - dom.bind(_this2.__input, 'blur', onBlur); - dom.bind(_this2.__selector, 'mousedown', function () { - dom.addClass(this, 'drag').bind(window, 'mouseup', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - dom.bind(_this2.__selector, 'touchstart', function () { - dom.addClass(this, 'drag').bind(window, 'touchend', function () { - dom.removeClass(_this.__selector, 'drag'); - }); - }); - var valueField = document.createElement('div'); - Common.extend(_this2.__selector.style, { - width: '122px', - height: '102px', - padding: '3px', - backgroundColor: '#222', - boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' - }); - Common.extend(_this2.__field_knob.style, { - position: 'absolute', - width: '12px', - height: '12px', - border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'), - boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', - borderRadius: '12px', - zIndex: 1 - }); - Common.extend(_this2.__hue_knob.style, { - position: 'absolute', - width: '15px', - height: '2px', - borderRight: '4px solid #fff', - zIndex: 1 - }); - Common.extend(_this2.__saturation_field.style, { - width: '100px', - height: '100px', - border: '1px solid #555', - marginRight: '3px', - display: 'inline-block', - cursor: 'pointer' - }); - Common.extend(valueField.style, { - width: '100%', - height: '100%', - background: 'none' - }); - linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000'); - Common.extend(_this2.__hue_field.style, { - width: '15px', - height: '100px', - border: '1px solid #555', - cursor: 'ns-resize', - position: 'absolute', - top: '3px', - right: '3px' - }); - hueGradient(_this2.__hue_field); - Common.extend(_this2.__input.style, { - outline: 'none', - textAlign: 'center', - color: '#fff', - border: 0, - fontWeight: 'bold', - textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)' - }); - dom.bind(_this2.__saturation_field, 'mousedown', fieldDown); - dom.bind(_this2.__saturation_field, 'touchstart', fieldDown); - dom.bind(_this2.__field_knob, 'mousedown', fieldDown); - dom.bind(_this2.__field_knob, 'touchstart', fieldDown); - dom.bind(_this2.__hue_field, 'mousedown', fieldDownH); - dom.bind(_this2.__hue_field, 'touchstart', fieldDownH); - function fieldDown(e) { - setSV(e); - dom.bind(window, 'mousemove', setSV); - dom.bind(window, 'touchmove', setSV); - dom.bind(window, 'mouseup', fieldUpSV); - dom.bind(window, 'touchend', fieldUpSV); - } - function fieldDownH(e) { - setH(e); - dom.bind(window, 'mousemove', setH); - dom.bind(window, 'touchmove', setH); - dom.bind(window, 'mouseup', fieldUpH); - dom.bind(window, 'touchend', fieldUpH); - } - function fieldUpSV() { - dom.unbind(window, 'mousemove', setSV); - dom.unbind(window, 'touchmove', setSV); - dom.unbind(window, 'mouseup', fieldUpSV); - dom.unbind(window, 'touchend', fieldUpSV); - onFinish(); - } - function fieldUpH() { - dom.unbind(window, 'mousemove', setH); - dom.unbind(window, 'touchmove', setH); - dom.unbind(window, 'mouseup', fieldUpH); - dom.unbind(window, 'touchend', fieldUpH); - onFinish(); - } - function onBlur() { - var i = interpret(this.value); - if (i !== false) { - _this.__color.__state = i; - _this.setValue(_this.__color.toOriginal()); - } else { - this.value = _this.__color.toString(); - } - } - function onFinish() { - if (_this.__onFinishChange) { - _this.__onFinishChange.call(_this, _this.__color.toOriginal()); - } - } - _this2.__saturation_field.appendChild(valueField); - _this2.__selector.appendChild(_this2.__field_knob); - _this2.__selector.appendChild(_this2.__saturation_field); - _this2.__selector.appendChild(_this2.__hue_field); - _this2.__hue_field.appendChild(_this2.__hue_knob); - _this2.domElement.appendChild(_this2.__input); - _this2.domElement.appendChild(_this2.__selector); - _this2.updateDisplay(); - function setSV(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__saturation_field.getBoundingClientRect(); - var _ref = e.touches && e.touches[0] || e, - clientX = _ref.clientX, - clientY = _ref.clientY; - var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left); - var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (v > 1) { - v = 1; - } else if (v < 0) { - v = 0; - } - if (s > 1) { - s = 1; - } else if (s < 0) { - s = 0; - } - _this.__color.v = v; - _this.__color.s = s; - _this.setValue(_this.__color.toOriginal()); - return false; - } - function setH(e) { - if (e.type.indexOf('touch') === -1) { - e.preventDefault(); - } - var fieldRect = _this.__hue_field.getBoundingClientRect(); - var _ref2 = e.touches && e.touches[0] || e, - clientY = _ref2.clientY; - var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top); - if (h > 1) { - h = 1; - } else if (h < 0) { - h = 0; - } - _this.__color.h = h * 360; - _this.setValue(_this.__color.toOriginal()); - return false; - } - return _this2; - } - createClass(ColorController, [{ - key: 'updateDisplay', - value: function updateDisplay() { - var i = interpret(this.getValue()); - if (i !== false) { - var mismatch = false; - Common.each(Color.COMPONENTS, function (component) { - if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) { - mismatch = true; - return {}; - } - }, this); - if (mismatch) { - Common.extend(this.__color.__state, i); - } - } - Common.extend(this.__temp.__state, this.__color.__state); - this.__temp.a = 1; - var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0; - var _flip = 255 - flip; - Common.extend(this.__field_knob.style, { - marginLeft: 100 * this.__color.s - 7 + 'px', - marginTop: 100 * (1 - this.__color.v) - 7 + 'px', - backgroundColor: this.__temp.toHexString(), - border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')' - }); - this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'; - this.__temp.s = 1; - this.__temp.v = 1; - linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString()); - this.__input.value = this.__color.toString(); - Common.extend(this.__input.style, { - backgroundColor: this.__color.toHexString(), - color: 'rgb(' + flip + ',' + flip + ',' + flip + ')', - textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)' - }); - } - }]); - return ColorController; -}(Controller); -var vendors = ['-moz-', '-o-', '-webkit-', '-ms-', '']; -function linearGradient(elem, x, a, b) { - elem.style.background = ''; - Common.each(vendors, function (vendor) { - elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); '; - }); -} -function hueGradient(elem) { - elem.style.background = ''; - elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'; - elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; - elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'; -} - -var css = { - load: function load(url, indoc) { - var doc = indoc || document; - var link = doc.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = url; - doc.getElementsByTagName('head')[0].appendChild(link); - }, - inject: function inject(cssContent, indoc) { - var doc = indoc || document; - var injected = document.createElement('style'); - injected.type = 'text/css'; - injected.innerHTML = cssContent; - var head = doc.getElementsByTagName('head')[0]; - try { - head.appendChild(injected); - } catch (e) { - } - } -}; - -var saveDialogContents = "

"; - -var ControllerFactory = function ControllerFactory(object, property) { - var initialValue = object[property]; - if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) { - return new OptionController(object, property, arguments[2]); - } - if (Common.isNumber(initialValue)) { - if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) { - if (Common.isNumber(arguments[4])) { - return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]); - } - return new NumberControllerSlider(object, property, arguments[2], arguments[3]); - } - if (Common.isNumber(arguments[4])) { - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] }); - } - return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); - } - if (Common.isString(initialValue)) { - return new StringController(object, property); - } - if (Common.isFunction(initialValue)) { - return new FunctionController(object, property, ''); - } - if (Common.isBoolean(initialValue)) { - return new BooleanController(object, property); - } - return null; -}; - -function requestAnimationFrame(callback) { - setTimeout(callback, 1000 / 60); -} -var requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame; - -var CenteredDiv = function () { - function CenteredDiv() { - classCallCheck(this, CenteredDiv); - this.backgroundElement = document.createElement('div'); - Common.extend(this.backgroundElement.style, { - backgroundColor: 'rgba(0,0,0,0.8)', - top: 0, - left: 0, - display: 'none', - zIndex: '1000', - opacity: 0, - WebkitTransition: 'opacity 0.2s linear', - transition: 'opacity 0.2s linear' - }); - dom.makeFullscreen(this.backgroundElement); - this.backgroundElement.style.position = 'fixed'; - this.domElement = document.createElement('div'); - Common.extend(this.domElement.style, { - position: 'fixed', - display: 'none', - zIndex: '1001', - opacity: 0, - WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear', - transition: 'transform 0.2s ease-out, opacity 0.2s linear' - }); - document.body.appendChild(this.backgroundElement); - document.body.appendChild(this.domElement); - var _this = this; - dom.bind(this.backgroundElement, 'click', function () { - _this.hide(); - }); - } - createClass(CenteredDiv, [{ - key: 'show', - value: function show() { - var _this = this; - this.backgroundElement.style.display = 'block'; - this.domElement.style.display = 'block'; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - this.layout(); - Common.defer(function () { - _this.backgroundElement.style.opacity = 1; - _this.domElement.style.opacity = 1; - _this.domElement.style.webkitTransform = 'scale(1)'; - }); - } - }, { - key: 'hide', - value: function hide() { - var _this = this; - var hide = function hide() { - _this.domElement.style.display = 'none'; - _this.backgroundElement.style.display = 'none'; - dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); - dom.unbind(_this.domElement, 'transitionend', hide); - dom.unbind(_this.domElement, 'oTransitionEnd', hide); - }; - dom.bind(this.domElement, 'webkitTransitionEnd', hide); - dom.bind(this.domElement, 'transitionend', hide); - dom.bind(this.domElement, 'oTransitionEnd', hide); - this.backgroundElement.style.opacity = 0; - this.domElement.style.opacity = 0; - this.domElement.style.webkitTransform = 'scale(1.1)'; - } - }, { - key: 'layout', - value: function layout() { - this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px'; - this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px'; - } - }]); - return CenteredDiv; -}(); - -var styleSheet = ___$insertStyle(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"); - -css.inject(styleSheet); -var CSS_NAMESPACE = 'dg'; -var HIDE_KEY_CODE = 72; -var CLOSE_BUTTON_HEIGHT = 20; -var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; -var SUPPORTS_LOCAL_STORAGE = function () { - try { - return !!window.localStorage; - } catch (e) { - return false; - } -}(); -var SAVE_DIALOGUE = void 0; -var autoPlaceVirgin = true; -var autoPlaceContainer = void 0; -var hide = false; -var hideableGuis = []; -var GUI = function GUI(pars) { - var _this = this; - var params = pars || {}; - this.domElement = document.createElement('div'); - this.__ul = document.createElement('ul'); - this.domElement.appendChild(this.__ul); - dom.addClass(this.domElement, CSS_NAMESPACE); - this.__folders = {}; - this.__controllers = []; - this.__rememberedObjects = []; - this.__rememberedObjectIndecesToControllers = []; - this.__listening = []; - params = Common.defaults(params, { - closeOnTop: false, - autoPlace: true, - width: GUI.DEFAULT_WIDTH - }); - params = Common.defaults(params, { - resizable: params.autoPlace, - hideable: params.autoPlace - }); - if (!Common.isUndefined(params.load)) { - if (params.preset) { - params.load.preset = params.preset; - } - } else { - params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; - } - if (Common.isUndefined(params.parent) && params.hideable) { - hideableGuis.push(this); - } - params.resizable = Common.isUndefined(params.parent) && params.resizable; - if (params.autoPlace && Common.isUndefined(params.scrollable)) { - params.scrollable = true; - } - var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; - var saveToLocalStorage = void 0; - var titleRow = void 0; - Object.defineProperties(this, - { - parent: { - get: function get$$1() { - return params.parent; - } - }, - scrollable: { - get: function get$$1() { - return params.scrollable; - } - }, - autoPlace: { - get: function get$$1() { - return params.autoPlace; - } - }, - closeOnTop: { - get: function get$$1() { - return params.closeOnTop; - } - }, - preset: { - get: function get$$1() { - if (_this.parent) { - return _this.getRoot().preset; - } - return params.load.preset; - }, - set: function set$$1(v) { - if (_this.parent) { - _this.getRoot().preset = v; - } else { - params.load.preset = v; - } - setPresetSelectIndex(this); - _this.revert(); - } - }, - width: { - get: function get$$1() { - return params.width; - }, - set: function set$$1(v) { - params.width = v; - setWidth(_this, v); - } - }, - name: { - get: function get$$1() { - return params.name; - }, - set: function set$$1(v) { - params.name = v; - if (titleRow) { - titleRow.innerHTML = params.name; - } - } - }, - closed: { - get: function get$$1() { - return params.closed; - }, - set: function set$$1(v) { - params.closed = v; - if (params.closed) { - dom.addClass(_this.__ul, GUI.CLASS_CLOSED); - } else { - dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); - } - this.onResize(); - if (_this.__closeButton) { - _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; - } - } - }, - load: { - get: function get$$1() { - return params.load; - } - }, - useLocalStorage: { - get: function get$$1() { - return useLocalStorage; - }, - set: function set$$1(bool) { - if (SUPPORTS_LOCAL_STORAGE) { - useLocalStorage = bool; - if (bool) { - dom.bind(window, 'unload', saveToLocalStorage); - } else { - dom.unbind(window, 'unload', saveToLocalStorage); - } - localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); - } - } - } - }); - if (Common.isUndefined(params.parent)) { - this.closed = params.closed || false; - dom.addClass(this.domElement, GUI.CLASS_MAIN); - dom.makeSelectable(this.domElement, false); - if (SUPPORTS_LOCAL_STORAGE) { - if (useLocalStorage) { - _this.useLocalStorage = true; - var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui')); - if (savedGui) { - params.load = JSON.parse(savedGui); - } - } - } - this.__closeButton = document.createElement('div'); - this.__closeButton.innerHTML = GUI.TEXT_CLOSED; - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); - if (params.closeOnTop) { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP); - this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]); - } else { - dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM); - this.domElement.appendChild(this.__closeButton); - } - dom.bind(this.__closeButton, 'click', function () { - _this.closed = !_this.closed; - }); - } else { - if (params.closed === undefined) { - params.closed = true; - } - var titleRowName = document.createTextNode(params.name); - dom.addClass(titleRowName, 'controller-name'); - titleRow = addRow(_this, titleRowName); - var onClickTitle = function onClickTitle(e) { - e.preventDefault(); - _this.closed = !_this.closed; - return false; - }; - dom.addClass(this.__ul, GUI.CLASS_CLOSED); - dom.addClass(titleRow, 'title'); - dom.bind(titleRow, 'click', onClickTitle); - if (!params.closed) { - this.closed = false; - } - } - if (params.autoPlace) { - if (Common.isUndefined(params.parent)) { - if (autoPlaceVirgin) { - autoPlaceContainer = document.createElement('div'); - dom.addClass(autoPlaceContainer, CSS_NAMESPACE); - dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER); - document.body.appendChild(autoPlaceContainer); - autoPlaceVirgin = false; - } - autoPlaceContainer.appendChild(this.domElement); - dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); - } - if (!this.parent) { - setWidth(_this, params.width); - } - } - this.__resizeHandler = function () { - _this.onResizeDebounced(); - }; - dom.bind(window, 'resize', this.__resizeHandler); - dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler); - dom.bind(this.__ul, 'transitionend', this.__resizeHandler); - dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler); - this.onResize(); - if (params.resizable) { - addResizeHandle(this); - } - saveToLocalStorage = function saveToLocalStorage() { - if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') { - localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); - } - }; - this.saveToLocalStorageIfPossible = saveToLocalStorage; - function resetWidth() { - var root = _this.getRoot(); - root.width += 1; - Common.defer(function () { - root.width -= 1; - }); - } - if (!params.parent) { - resetWidth(); - } -}; -GUI.toggleHide = function () { - hide = !hide; - Common.each(hideableGuis, function (gui) { - gui.domElement.style.display = hide ? 'none' : ''; - }); -}; -GUI.CLASS_AUTO_PLACE = 'a'; -GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; -GUI.CLASS_MAIN = 'main'; -GUI.CLASS_CONTROLLER_ROW = 'cr'; -GUI.CLASS_TOO_TALL = 'taller-than-window'; -GUI.CLASS_CLOSED = 'closed'; -GUI.CLASS_CLOSE_BUTTON = 'close-button'; -GUI.CLASS_CLOSE_TOP = 'close-top'; -GUI.CLASS_CLOSE_BOTTOM = 'close-bottom'; -GUI.CLASS_DRAG = 'drag'; -GUI.DEFAULT_WIDTH = 245; -GUI.TEXT_CLOSED = 'Close Controls'; -GUI.TEXT_OPEN = 'Open Controls'; -GUI._keydownHandler = function (e) { - if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) { - GUI.toggleHide(); - } -}; -dom.bind(window, 'keydown', GUI._keydownHandler, false); -Common.extend(GUI.prototype, -{ - add: function add(object, property) { - return _add(this, object, property, { - factoryArgs: Array.prototype.slice.call(arguments, 2) - }); - }, - addColor: function addColor(object, property) { - return _add(this, object, property, { - color: true - }); - }, - remove: function remove(controller) { - this.__ul.removeChild(controller.__li); - this.__controllers.splice(this.__controllers.indexOf(controller), 1); - var _this = this; - Common.defer(function () { - _this.onResize(); - }); - }, - destroy: function destroy() { - if (this.parent) { - throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.'); - } - if (this.autoPlace) { - autoPlaceContainer.removeChild(this.domElement); - } - var _this = this; - Common.each(this.__folders, function (subfolder) { - _this.removeFolder(subfolder); - }); - dom.unbind(window, 'keydown', GUI._keydownHandler, false); - removeListeners(this); - }, - addFolder: function addFolder(name) { - if (this.__folders[name] !== undefined) { - throw new Error('You already have a folder in this GUI by the' + ' name "' + name + '"'); - } - var newGuiParams = { name: name, parent: this }; - newGuiParams.autoPlace = this.autoPlace; - if (this.load && - this.load.folders && - this.load.folders[name]) { - newGuiParams.closed = this.load.folders[name].closed; - newGuiParams.load = this.load.folders[name]; - } - var gui = new GUI(newGuiParams); - this.__folders[name] = gui; - var li = addRow(this, gui.domElement); - dom.addClass(li, 'folder'); - return gui; - }, - removeFolder: function removeFolder(folder) { - this.__ul.removeChild(folder.domElement.parentElement); - delete this.__folders[folder.name]; - if (this.load && - this.load.folders && - this.load.folders[folder.name]) { - delete this.load.folders[folder.name]; - } - removeListeners(folder); - var _this = this; - Common.each(folder.__folders, function (subfolder) { - folder.removeFolder(subfolder); - }); - Common.defer(function () { - _this.onResize(); - }); - }, - open: function open() { - this.closed = false; - }, - close: function close() { - this.closed = true; - }, - hide: function hide() { - this.domElement.style.display = 'none'; - }, - show: function show() { - this.domElement.style.display = ''; - }, - onResize: function onResize() { - var root = this.getRoot(); - if (root.scrollable) { - var top = dom.getOffset(root.__ul).top; - var h = 0; - Common.each(root.__ul.childNodes, function (node) { - if (!(root.autoPlace && node === root.__save_row)) { - h += dom.getHeight(node); - } - }); - if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { - dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; - } else { - dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); - root.__ul.style.height = 'auto'; - } - } - if (root.__resize_handle) { - Common.defer(function () { - root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; - }); - } - if (root.__closeButton) { - root.__closeButton.style.width = root.width + 'px'; - } - }, - onResizeDebounced: Common.debounce(function () { - this.onResize(); - }, 50), - remember: function remember() { - if (Common.isUndefined(SAVE_DIALOGUE)) { - SAVE_DIALOGUE = new CenteredDiv(); - SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents; - } - if (this.parent) { - throw new Error('You can only call remember on a top level GUI.'); - } - var _this = this; - Common.each(Array.prototype.slice.call(arguments), function (object) { - if (_this.__rememberedObjects.length === 0) { - addSaveMenu(_this); - } - if (_this.__rememberedObjects.indexOf(object) === -1) { - _this.__rememberedObjects.push(object); - } - }); - if (this.autoPlace) { - setWidth(this, this.width); - } - }, - getRoot: function getRoot() { - var gui = this; - while (gui.parent) { - gui = gui.parent; - } - return gui; - }, - getSaveObject: function getSaveObject() { - var toReturn = this.load; - toReturn.closed = this.closed; - if (this.__rememberedObjects.length > 0) { - toReturn.preset = this.preset; - if (!toReturn.remembered) { - toReturn.remembered = {}; - } - toReturn.remembered[this.preset] = getCurrentPreset(this); - } - toReturn.folders = {}; - Common.each(this.__folders, function (element, key) { - toReturn.folders[key] = element.getSaveObject(); - }); - return toReturn; - }, - save: function save() { - if (!this.load.remembered) { - this.load.remembered = {}; - } - this.load.remembered[this.preset] = getCurrentPreset(this); - markPresetModified(this, false); - this.saveToLocalStorageIfPossible(); - }, - saveAs: function saveAs(presetName) { - if (!this.load.remembered) { - this.load.remembered = {}; - this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); - } - this.load.remembered[presetName] = getCurrentPreset(this); - this.preset = presetName; - addPresetOption(this, presetName, true); - this.saveToLocalStorageIfPossible(); - }, - revert: function revert(gui) { - Common.each(this.__controllers, function (controller) { - if (!this.getRoot().load.remembered) { - controller.setValue(controller.initialValue); - } else { - recallSavedValue(gui || this.getRoot(), controller); - } - if (controller.__onFinishChange) { - controller.__onFinishChange.call(controller, controller.getValue()); - } - }, this); - Common.each(this.__folders, function (folder) { - folder.revert(folder); - }); - if (!gui) { - markPresetModified(this.getRoot(), false); - } - }, - listen: function listen(controller) { - var init = this.__listening.length === 0; - this.__listening.push(controller); - if (init) { - updateDisplays(this.__listening); - } - }, - updateDisplay: function updateDisplay() { - Common.each(this.__controllers, function (controller) { - controller.updateDisplay(); - }); - Common.each(this.__folders, function (folder) { - folder.updateDisplay(); - }); - } -}); -function addRow(gui, newDom, liBefore) { - var li = document.createElement('li'); - if (newDom) { - li.appendChild(newDom); - } - if (liBefore) { - gui.__ul.insertBefore(li, liBefore); - } else { - gui.__ul.appendChild(li); - } - gui.onResize(); - return li; -} -function removeListeners(gui) { - dom.unbind(window, 'resize', gui.__resizeHandler); - if (gui.saveToLocalStorageIfPossible) { - dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible); - } -} -function markPresetModified(gui, modified) { - var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; - if (modified) { - opt.innerHTML = opt.value + '*'; - } else { - opt.innerHTML = opt.value; - } -} -function augmentController(gui, li, controller) { - controller.__li = li; - controller.__gui = gui; - Common.extend(controller, { - options: function options(_options) { - if (arguments.length > 1) { - var nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: nextSibling, - factoryArgs: [Common.toArray(arguments)] - }); - } - if (Common.isArray(_options) || Common.isObject(_options)) { - var _nextSibling = controller.__li.nextElementSibling; - controller.remove(); - return _add(gui, controller.object, controller.property, { - before: _nextSibling, - factoryArgs: [_options] - }); - } - }, - name: function name(_name) { - controller.__li.firstElementChild.firstElementChild.innerHTML = _name; - return controller; - }, - listen: function listen() { - controller.__gui.listen(controller); - return controller; - }, - remove: function remove() { - controller.__gui.remove(controller); - return controller; - } - }); - if (controller instanceof NumberControllerSlider) { - var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step }); - Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) { - var pc = controller[method]; - var pb = box[method]; - controller[method] = box[method] = function () { - var args = Array.prototype.slice.call(arguments); - pb.apply(box, args); - return pc.apply(controller, args); - }; - }); - dom.addClass(li, 'has-slider'); - controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); - } else if (controller instanceof NumberControllerBox) { - var r = function r(returned) { - if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) { - var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML; - var wasListening = controller.__gui.__listening.indexOf(controller) > -1; - controller.remove(); - var newController = _add(gui, controller.object, controller.property, { - before: controller.__li.nextElementSibling, - factoryArgs: [controller.__min, controller.__max, controller.__step] - }); - newController.name(oldName); - if (wasListening) newController.listen(); - return newController; - } - return returned; - }; - controller.min = Common.compose(r, controller.min); - controller.max = Common.compose(r, controller.max); - } else if (controller instanceof BooleanController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__checkbox, 'click'); - }); - dom.bind(controller.__checkbox, 'click', function (e) { - e.stopPropagation(); - }); - } else if (controller instanceof FunctionController) { - dom.bind(li, 'click', function () { - dom.fakeEvent(controller.__button, 'click'); - }); - dom.bind(li, 'mouseover', function () { - dom.addClass(controller.__button, 'hover'); - }); - dom.bind(li, 'mouseout', function () { - dom.removeClass(controller.__button, 'hover'); - }); - } else if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - controller.updateDisplay = Common.compose(function (val) { - li.style.borderLeftColor = controller.__color.toString(); - return val; - }, controller.updateDisplay); - controller.updateDisplay(); - } - controller.setValue = Common.compose(function (val) { - if (gui.getRoot().__preset_select && controller.isModified()) { - markPresetModified(gui.getRoot(), true); - } - return val; - }, controller.setValue); -} -function recallSavedValue(gui, controller) { - var root = gui.getRoot(); - var matchedIndex = root.__rememberedObjects.indexOf(controller.object); - if (matchedIndex !== -1) { - var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex]; - if (controllerMap === undefined) { - controllerMap = {}; - root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap; - } - controllerMap[controller.property] = controller; - if (root.load && root.load.remembered) { - var presetMap = root.load.remembered; - var preset = void 0; - if (presetMap[gui.preset]) { - preset = presetMap[gui.preset]; - } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) { - preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME]; - } else { - return; - } - if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) { - var value = preset[matchedIndex][controller.property]; - controller.initialValue = value; - controller.setValue(value); - } - } - } -} -function _add(gui, object, property, params) { - if (object[property] === undefined) { - throw new Error('Object "' + object + '" has no property "' + property + '"'); - } - var controller = void 0; - if (params.color) { - controller = new ColorController(object, property); - } else { - var factoryArgs = [object, property].concat(params.factoryArgs); - controller = ControllerFactory.apply(gui, factoryArgs); - } - if (params.before instanceof Controller) { - params.before = params.before.__li; - } - recallSavedValue(gui, controller); - dom.addClass(controller.domElement, 'c'); - var name = document.createElement('span'); - dom.addClass(name, 'property-name'); - name.innerHTML = controller.property; - var container = document.createElement('div'); - container.appendChild(name); - container.appendChild(controller.domElement); - var li = addRow(gui, container, params.before); - dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); - if (controller instanceof ColorController) { - dom.addClass(li, 'color'); - } else { - dom.addClass(li, _typeof(controller.getValue())); - } - augmentController(gui, li, controller); - gui.__controllers.push(controller); - return controller; -} -function getLocalStorageHash(gui, key) { - return document.location.href + '.' + key; -} -function addPresetOption(gui, name, setSelected) { - var opt = document.createElement('option'); - opt.innerHTML = name; - opt.value = name; - gui.__preset_select.appendChild(opt); - if (setSelected) { - gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; - } -} -function showHideExplain(gui, explain) { - explain.style.display = gui.useLocalStorage ? 'block' : 'none'; -} -function addSaveMenu(gui) { - var div = gui.__save_row = document.createElement('li'); - dom.addClass(gui.domElement, 'has-save'); - gui.__ul.insertBefore(div, gui.__ul.firstChild); - dom.addClass(div, 'save-row'); - var gears = document.createElement('span'); - gears.innerHTML = ' '; - dom.addClass(gears, 'button gears'); - var button = document.createElement('span'); - button.innerHTML = 'Save'; - dom.addClass(button, 'button'); - dom.addClass(button, 'save'); - var button2 = document.createElement('span'); - button2.innerHTML = 'New'; - dom.addClass(button2, 'button'); - dom.addClass(button2, 'save-as'); - var button3 = document.createElement('span'); - button3.innerHTML = 'Revert'; - dom.addClass(button3, 'button'); - dom.addClass(button3, 'revert'); - var select = gui.__preset_select = document.createElement('select'); - if (gui.load && gui.load.remembered) { - Common.each(gui.load.remembered, function (value, key) { - addPresetOption(gui, key, key === gui.preset); - }); - } else { - addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); - } - dom.bind(select, 'change', function () { - for (var index = 0; index < gui.__preset_select.length; index++) { - gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; - } - gui.preset = this.value; - }); - div.appendChild(select); - div.appendChild(gears); - div.appendChild(button); - div.appendChild(button2); - div.appendChild(button3); - if (SUPPORTS_LOCAL_STORAGE) { - var explain = document.getElementById('dg-local-explain'); - var localStorageCheckBox = document.getElementById('dg-local-storage'); - var saveLocally = document.getElementById('dg-save-locally'); - saveLocally.style.display = 'block'; - if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { - localStorageCheckBox.setAttribute('checked', 'checked'); - } - showHideExplain(gui, explain); - dom.bind(localStorageCheckBox, 'change', function () { - gui.useLocalStorage = !gui.useLocalStorage; - showHideExplain(gui, explain); - }); - } - var newConstructorTextArea = document.getElementById('dg-new-constructor'); - dom.bind(newConstructorTextArea, 'keydown', function (e) { - if (e.metaKey && (e.which === 67 || e.keyCode === 67)) { - SAVE_DIALOGUE.hide(); - } - }); - dom.bind(gears, 'click', function () { - newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); - SAVE_DIALOGUE.show(); - newConstructorTextArea.focus(); - newConstructorTextArea.select(); - }); - dom.bind(button, 'click', function () { - gui.save(); - }); - dom.bind(button2, 'click', function () { - var presetName = prompt('Enter a new preset name.'); - if (presetName) { - gui.saveAs(presetName); - } - }); - dom.bind(button3, 'click', function () { - gui.revert(); - }); -} -function addResizeHandle(gui) { - var pmouseX = void 0; - gui.__resize_handle = document.createElement('div'); - Common.extend(gui.__resize_handle.style, { - width: '6px', - marginLeft: '-3px', - height: '200px', - cursor: 'ew-resize', - position: 'absolute' - }); - function drag(e) { - e.preventDefault(); - gui.width += pmouseX - e.clientX; - gui.onResize(); - pmouseX = e.clientX; - return false; - } - function dragStop() { - dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.unbind(window, 'mousemove', drag); - dom.unbind(window, 'mouseup', dragStop); - } - function dragStart(e) { - e.preventDefault(); - pmouseX = e.clientX; - dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); - dom.bind(window, 'mousemove', drag); - dom.bind(window, 'mouseup', dragStop); - return false; - } - dom.bind(gui.__resize_handle, 'mousedown', dragStart); - dom.bind(gui.__closeButton, 'mousedown', dragStart); - gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); -} -function setWidth(gui, w) { - gui.domElement.style.width = w + 'px'; - if (gui.__save_row && gui.autoPlace) { - gui.__save_row.style.width = w + 'px'; - } - if (gui.__closeButton) { - gui.__closeButton.style.width = w + 'px'; - } -} -function getCurrentPreset(gui, useInitialValues) { - var toReturn = {}; - Common.each(gui.__rememberedObjects, function (val, index) { - var savedValues = {}; - var controllerMap = gui.__rememberedObjectIndecesToControllers[index]; - Common.each(controllerMap, function (controller, property) { - savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue(); - }); - toReturn[index] = savedValues; - }); - return toReturn; -} -function setPresetSelectIndex(gui) { - for (var index = 0; index < gui.__preset_select.length; index++) { - if (gui.__preset_select[index].value === gui.preset) { - gui.__preset_select.selectedIndex = index; - } - } -} -function updateDisplays(controllerArray) { - if (controllerArray.length !== 0) { - requestAnimationFrame$1.call(window, function () { - updateDisplays(controllerArray); - }); - } - Common.each(controllerArray, function (c) { - c.updateDisplay(); - }); -} - -var color = { - Color: Color, - math: ColorMath, - interpret: interpret -}; -var controllers = { - Controller: Controller, - BooleanController: BooleanController, - OptionController: OptionController, - StringController: StringController, - NumberController: NumberController, - NumberControllerBox: NumberControllerBox, - NumberControllerSlider: NumberControllerSlider, - FunctionController: FunctionController, - ColorController: ColorController -}; -var dom$1 = { dom: dom }; -var gui = { GUI: GUI }; -var GUI$1 = GUI; -var index = { - color: color, - controllers: controllers, - dom: dom$1, - gui: gui, - GUI: GUI$1 -}; - - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (index); -//# sourceMappingURL=dat.gui.module.js.map - - -/***/ }), - -/***/ "./node_modules/filtered-vector/fvec.js": -/*!**********************************************!*\ - !*** ./node_modules/filtered-vector/fvec.js ***! - \**********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = createFilteredVector - -var cubicHermite = __webpack_require__(/*! cubic-hermite */ "./node_modules/cubic-hermite/hermite.js") -var bsearch = __webpack_require__(/*! binary-search-bounds */ "./node_modules/binary-search-bounds/search-bounds.js") - -function clamp(lo, hi, x) { - return Math.min(hi, Math.max(lo, x)) -} - -function FilteredVector(state0, velocity0, t0) { - this.dimension = state0.length - this.bounds = [ new Array(this.dimension), new Array(this.dimension) ] - for(var i=0; i= n-1) { - var ptr = state.length-1 - var tf = t - time[n-1] - for(var i=0; i= n-1) { - var ptr = state.length-1 - var tf = t - time[n-1] - for(var i=0; i=0; --i) { - if(velocity[--ptr]) { - return false - } - } - return true -} - -proto.jump = function(t) { - var t0 = this.lastT() - var d = this.dimension - if(t < t0 || arguments.length !== d+1) { - return - } - var state = this._state - var velocity = this._velocity - var ptr = state.length-this.dimension - var bounds = this.bounds - var lo = bounds[0] - var hi = bounds[1] - this._time.push(t0, t) - for(var j=0; j<2; ++j) { - for(var i=0; i0; --i) { - state.push(clamp(lo[i-1], hi[i-1], arguments[i])) - velocity.push(0) - } -} - -proto.push = function(t) { - var t0 = this.lastT() - var d = this.dimension - if(t < t0 || arguments.length !== d+1) { - return - } - var state = this._state - var velocity = this._velocity - var ptr = state.length-this.dimension - var dt = t - t0 - var bounds = this.bounds - var lo = bounds[0] - var hi = bounds[1] - var sf = (dt > 1e-6) ? 1/dt : 0 - this._time.push(t) - for(var i=d; i>0; --i) { - var xc = clamp(lo[i-1], hi[i-1], arguments[i]) - state.push(xc) - velocity.push((xc - state[ptr++]) * sf) - } -} - -proto.set = function(t) { - var d = this.dimension - if(t < this.lastT() || arguments.length !== d+1) { - return - } - var state = this._state - var velocity = this._velocity - var bounds = this.bounds - var lo = bounds[0] - var hi = bounds[1] - this._time.push(t) - for(var i=d; i>0; --i) { - state.push(clamp(lo[i-1], hi[i-1], arguments[i])) - velocity.push(0) - } -} - -proto.move = function(t) { - var t0 = this.lastT() - var d = this.dimension - if(t <= t0 || arguments.length !== d+1) { - return - } - var state = this._state - var velocity = this._velocity - var statePtr = state.length - this.dimension - var bounds = this.bounds - var lo = bounds[0] - var hi = bounds[1] - var dt = t - t0 - var sf = (dt > 1e-6) ? 1/dt : 0.0 - this._time.push(t) - for(var i=d; i>0; --i) { - var dx = arguments[i] - state.push(clamp(lo[i-1], hi[i-1], state[statePtr++] + dx)) - velocity.push(dx * sf) - } -} - -proto.idle = function(t) { - var t0 = this.lastT() - if(t < t0) { - return - } - var d = this.dimension - var state = this._state - var velocity = this._velocity - var statePtr = state.length-d - var bounds = this.bounds - var lo = bounds[0] - var hi = bounds[1] - var dt = t - t0 - this._time.push(t) - for(var i=d-1; i>=0; --i) { - state.push(clamp(lo[i], hi[i], state[statePtr] + dt * velocity[statePtr])) - velocity.push(0) - statePtr += 1 - } -} - -function getZero(d) { - var result = new Array(d) - for(var i=0; i { - -module.exports = clone; - -/** - * Creates a new mat4 initialized with values from an existing matrix - * - * @param {mat4} a matrix to clone - * @returns {mat4} a new 4x4 matrix - */ -function clone(a) { - var out = new Float32Array(16); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/create.js": -/*!****************************************!*\ - !*** ./node_modules/gl-mat4/create.js ***! - \****************************************/ -/***/ ((module) => { - -module.exports = create; - -/** - * Creates a new identity mat4 - * - * @returns {mat4} a new 4x4 matrix - */ -function create() { - var out = new Float32Array(16); - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/determinant.js": -/*!*********************************************!*\ - !*** ./node_modules/gl-mat4/determinant.js ***! - \*********************************************/ -/***/ ((module) => { - -module.exports = determinant; - -/** - * Calculates the determinant of a mat4 - * - * @param {mat4} a the source matrix - * @returns {Number} determinant of a - */ -function determinant(a) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], - - b00 = a00 * a11 - a01 * a10, - b01 = a00 * a12 - a02 * a10, - b02 = a00 * a13 - a03 * a10, - b03 = a01 * a12 - a02 * a11, - b04 = a01 * a13 - a03 * a11, - b05 = a02 * a13 - a03 * a12, - b06 = a20 * a31 - a21 * a30, - b07 = a20 * a32 - a22 * a30, - b08 = a20 * a33 - a23 * a30, - b09 = a21 * a32 - a22 * a31, - b10 = a21 * a33 - a23 * a31, - b11 = a22 * a33 - a23 * a32; - - // Calculate the determinant - return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/fromQuat.js": -/*!******************************************!*\ - !*** ./node_modules/gl-mat4/fromQuat.js ***! - \******************************************/ -/***/ ((module) => { - -module.exports = fromQuat; - -/** - * Creates a matrix from a quaternion rotation. - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @returns {mat4} out - */ -function fromQuat(out, q) { - var x = q[0], y = q[1], z = q[2], w = q[3], - x2 = x + x, - y2 = y + y, - z2 = z + z, - - xx = x * x2, - yx = y * x2, - yy = y * y2, - zx = z * x2, - zy = z * y2, - zz = z * z2, - wx = w * x2, - wy = w * y2, - wz = w * z2; - - out[0] = 1 - yy - zz; - out[1] = yx + wz; - out[2] = zx - wy; - out[3] = 0; - - out[4] = yx - wz; - out[5] = 1 - xx - zz; - out[6] = zy + wx; - out[7] = 0; - - out[8] = zx + wy; - out[9] = zy - wx; - out[10] = 1 - xx - yy; - out[11] = 0; - - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/fromRotationTranslation.js": -/*!*********************************************************!*\ - !*** ./node_modules/gl-mat4/fromRotationTranslation.js ***! - \*********************************************************/ -/***/ ((module) => { - -module.exports = fromRotationTranslation; - -/** - * Creates a matrix from a quaternion rotation and vector translation - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * var quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {vec3} v Translation vector - * @returns {mat4} out - */ -function fromRotationTranslation(out, q, v) { - // Quaternion math - var x = q[0], y = q[1], z = q[2], w = q[3], - x2 = x + x, - y2 = y + y, - z2 = z + z, - - xx = x * x2, - xy = x * y2, - xz = x * z2, - yy = y * y2, - yz = y * z2, - zz = z * z2, - wx = w * x2, - wy = w * y2, - wz = w * z2; - - out[0] = 1 - (yy + zz); - out[1] = xy + wz; - out[2] = xz - wy; - out[3] = 0; - out[4] = xy - wz; - out[5] = 1 - (xx + zz); - out[6] = yz + wx; - out[7] = 0; - out[8] = xz + wy; - out[9] = yz - wx; - out[10] = 1 - (xx + yy); - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/identity.js": -/*!******************************************!*\ - !*** ./node_modules/gl-mat4/identity.js ***! - \******************************************/ -/***/ ((module) => { - -module.exports = identity; - -/** - * Set a mat4 to the identity matrix - * - * @param {mat4} out the receiving matrix - * @returns {mat4} out - */ -function identity(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/invert.js": -/*!****************************************!*\ - !*** ./node_modules/gl-mat4/invert.js ***! - \****************************************/ -/***/ ((module) => { - -module.exports = invert; - -/** - * Inverts a mat4 - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the source matrix - * @returns {mat4} out - */ -function invert(out, a) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], - - b00 = a00 * a11 - a01 * a10, - b01 = a00 * a12 - a02 * a10, - b02 = a00 * a13 - a03 * a10, - b03 = a01 * a12 - a02 * a11, - b04 = a01 * a13 - a03 * a11, - b05 = a02 * a13 - a03 * a12, - b06 = a20 * a31 - a21 * a30, - b07 = a20 * a32 - a22 * a30, - b08 = a20 * a33 - a23 * a30, - b09 = a21 * a32 - a22 * a31, - b10 = a21 * a33 - a23 * a31, - b11 = a22 * a33 - a23 * a32, - - // Calculate the determinant - det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; - - if (!det) { - return null; - } - det = 1.0 / det; - - out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; - out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; - out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; - out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; - out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; - out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; - out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; - out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; - out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; - out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; - out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; - out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; - out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; - out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; - out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; - out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; - - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/lookAt.js": -/*!****************************************!*\ - !*** ./node_modules/gl-mat4/lookAt.js ***! - \****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var identity = __webpack_require__(/*! ./identity */ "./node_modules/gl-mat4/identity.js"); - -module.exports = lookAt; - -/** - * Generates a look-at matrix with the given eye position, focal point, and up axis - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {vec3} eye Position of the viewer - * @param {vec3} center Point the viewer is looking at - * @param {vec3} up vec3 pointing up - * @returns {mat4} out - */ -function lookAt(out, eye, center, up) { - var x0, x1, x2, y0, y1, y2, z0, z1, z2, len, - eyex = eye[0], - eyey = eye[1], - eyez = eye[2], - upx = up[0], - upy = up[1], - upz = up[2], - centerx = center[0], - centery = center[1], - centerz = center[2]; - - if (Math.abs(eyex - centerx) < 0.000001 && - Math.abs(eyey - centery) < 0.000001 && - Math.abs(eyez - centerz) < 0.000001) { - return identity(out); - } - - z0 = eyex - centerx; - z1 = eyey - centery; - z2 = eyez - centerz; - - len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2); - z0 *= len; - z1 *= len; - z2 *= len; - - x0 = upy * z2 - upz * z1; - x1 = upz * z0 - upx * z2; - x2 = upx * z1 - upy * z0; - len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2); - if (!len) { - x0 = 0; - x1 = 0; - x2 = 0; - } else { - len = 1 / len; - x0 *= len; - x1 *= len; - x2 *= len; - } - - y0 = z1 * x2 - z2 * x1; - y1 = z2 * x0 - z0 * x2; - y2 = z0 * x1 - z1 * x0; - - len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2); - if (!len) { - y0 = 0; - y1 = 0; - y2 = 0; - } else { - len = 1 / len; - y0 *= len; - y1 *= len; - y2 *= len; - } - - out[0] = x0; - out[1] = y0; - out[2] = z0; - out[3] = 0; - out[4] = x1; - out[5] = y1; - out[6] = z1; - out[7] = 0; - out[8] = x2; - out[9] = y2; - out[10] = z2; - out[11] = 0; - out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); - out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); - out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); - out[15] = 1; - - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/multiply.js": -/*!******************************************!*\ - !*** ./node_modules/gl-mat4/multiply.js ***! - \******************************************/ -/***/ ((module) => { - -module.exports = multiply; - -/** - * Multiplies two mat4's - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the first operand - * @param {mat4} b the second operand - * @returns {mat4} out - */ -function multiply(out, a, b) { - var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], - a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], - a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], - a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; - - // Cache only the current line of the second matrix - var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; - out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - - b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; - out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - - b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; - out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - - b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; - out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30; - out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31; - out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32; - out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/rotate.js": -/*!****************************************!*\ - !*** ./node_modules/gl-mat4/rotate.js ***! - \****************************************/ -/***/ ((module) => { - -module.exports = rotate; - -/** - * Rotates a mat4 by the given angle - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @param {vec3} axis the axis to rotate around - * @returns {mat4} out - */ -function rotate(out, a, rad, axis) { - var x = axis[0], y = axis[1], z = axis[2], - len = Math.sqrt(x * x + y * y + z * z), - s, c, t, - a00, a01, a02, a03, - a10, a11, a12, a13, - a20, a21, a22, a23, - b00, b01, b02, - b10, b11, b12, - b20, b21, b22; - - if (Math.abs(len) < 0.000001) { return null; } - - len = 1 / len; - x *= len; - y *= len; - z *= len; - - s = Math.sin(rad); - c = Math.cos(rad); - t = 1 - c; - - a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; - a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; - a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; - - // Construct the elements of the rotation matrix - b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; - b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; - b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; - - // Perform rotation-specific matrix multiplication - out[0] = a00 * b00 + a10 * b01 + a20 * b02; - out[1] = a01 * b00 + a11 * b01 + a21 * b02; - out[2] = a02 * b00 + a12 * b01 + a22 * b02; - out[3] = a03 * b00 + a13 * b01 + a23 * b02; - out[4] = a00 * b10 + a10 * b11 + a20 * b12; - out[5] = a01 * b10 + a11 * b11 + a21 * b12; - out[6] = a02 * b10 + a12 * b11 + a22 * b12; - out[7] = a03 * b10 + a13 * b11 + a23 * b12; - out[8] = a00 * b20 + a10 * b21 + a20 * b22; - out[9] = a01 * b20 + a11 * b21 + a21 * b22; - out[10] = a02 * b20 + a12 * b21 + a22 * b22; - out[11] = a03 * b20 + a13 * b21 + a23 * b22; - - if (a !== out) { // If the source and destination differ, copy the unchanged last row - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/rotateX.js": -/*!*****************************************!*\ - !*** ./node_modules/gl-mat4/rotateX.js ***! - \*****************************************/ -/***/ ((module) => { - -module.exports = rotateX; - -/** - * Rotates a matrix by the given angle around the X axis - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function rotateX(out, a, rad) { - var s = Math.sin(rad), - c = Math.cos(rad), - a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7], - a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - - if (a !== out) { // If the source and destination differ, copy the unchanged rows - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - - // Perform axis-specific matrix multiplication - out[4] = a10 * c + a20 * s; - out[5] = a11 * c + a21 * s; - out[6] = a12 * c + a22 * s; - out[7] = a13 * c + a23 * s; - out[8] = a20 * c - a10 * s; - out[9] = a21 * c - a11 * s; - out[10] = a22 * c - a12 * s; - out[11] = a23 * c - a13 * s; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/rotateY.js": -/*!*****************************************!*\ - !*** ./node_modules/gl-mat4/rotateY.js ***! - \*****************************************/ -/***/ ((module) => { - -module.exports = rotateY; - -/** - * Rotates a matrix by the given angle around the Y axis - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function rotateY(out, a, rad) { - var s = Math.sin(rad), - c = Math.cos(rad), - a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3], - a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - - if (a !== out) { // If the source and destination differ, copy the unchanged rows - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - - // Perform axis-specific matrix multiplication - out[0] = a00 * c - a20 * s; - out[1] = a01 * c - a21 * s; - out[2] = a02 * c - a22 * s; - out[3] = a03 * c - a23 * s; - out[8] = a00 * s + a20 * c; - out[9] = a01 * s + a21 * c; - out[10] = a02 * s + a22 * c; - out[11] = a03 * s + a23 * c; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/rotateZ.js": -/*!*****************************************!*\ - !*** ./node_modules/gl-mat4/rotateZ.js ***! - \*****************************************/ -/***/ ((module) => { - -module.exports = rotateZ; - -/** - * Rotates a matrix by the given angle around the Z axis - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function rotateZ(out, a, rad) { - var s = Math.sin(rad), - c = Math.cos(rad), - a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3], - a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - - if (a !== out) { // If the source and destination differ, copy the unchanged last row - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - - // Perform axis-specific matrix multiplication - out[0] = a00 * c + a10 * s; - out[1] = a01 * c + a11 * s; - out[2] = a02 * c + a12 * s; - out[3] = a03 * c + a13 * s; - out[4] = a10 * c - a00 * s; - out[5] = a11 * c - a01 * s; - out[6] = a12 * c - a02 * s; - out[7] = a13 * c - a03 * s; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/scale.js": -/*!***************************************!*\ - !*** ./node_modules/gl-mat4/scale.js ***! - \***************************************/ -/***/ ((module) => { - -module.exports = scale; - -/** - * Scales the mat4 by the dimensions in the given vec3 - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to scale - * @param {vec3} v the vec3 to scale the matrix by - * @returns {mat4} out - **/ -function scale(out, a, v) { - var x = v[0], y = v[1], z = v[2]; - - out[0] = a[0] * x; - out[1] = a[1] * x; - out[2] = a[2] * x; - out[3] = a[3] * x; - out[4] = a[4] * y; - out[5] = a[5] * y; - out[6] = a[6] * y; - out[7] = a[7] * y; - out[8] = a[8] * z; - out[9] = a[9] * z; - out[10] = a[10] * z; - out[11] = a[11] * z; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/translate.js": -/*!*******************************************!*\ - !*** ./node_modules/gl-mat4/translate.js ***! - \*******************************************/ -/***/ ((module) => { - -module.exports = translate; - -/** - * Translate a mat4 by the given vector - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the matrix to translate - * @param {vec3} v vector to translate by - * @returns {mat4} out - */ -function translate(out, a, v) { - var x = v[0], y = v[1], z = v[2], - a00, a01, a02, a03, - a10, a11, a12, a13, - a20, a21, a22, a23; - - if (a === out) { - out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; - out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; - out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; - out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; - } else { - a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; - a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; - a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; - - out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; - out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; - out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; - - out[12] = a00 * x + a10 * y + a20 * z + a[12]; - out[13] = a01 * x + a11 * y + a21 * z + a[13]; - out[14] = a02 * x + a12 * y + a22 * z + a[14]; - out[15] = a03 * x + a13 * y + a23 * z + a[15]; - } - - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-mat4/transpose.js": -/*!*******************************************!*\ - !*** ./node_modules/gl-mat4/transpose.js ***! - \*******************************************/ -/***/ ((module) => { - -module.exports = transpose; - -/** - * Transpose the values of a mat4 - * - * @param {mat4} out the receiving matrix - * @param {mat4} a the source matrix - * @returns {mat4} out - */ -function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], a02 = a[2], a03 = a[3], - a12 = a[6], a13 = a[7], - a23 = a[11]; - - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } - - return out; -}; - -/***/ }), - -/***/ "./node_modules/gl-matrix/esm/common.js": -/*!**********************************************!*\ - !*** ./node_modules/gl-matrix/esm/common.js ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "EPSILON": () => (/* binding */ EPSILON), -/* harmony export */ "ARRAY_TYPE": () => (/* binding */ ARRAY_TYPE), -/* harmony export */ "RANDOM": () => (/* binding */ RANDOM), -/* harmony export */ "setMatrixArrayType": () => (/* binding */ setMatrixArrayType), -/* harmony export */ "toRadian": () => (/* binding */ toRadian), -/* harmony export */ "equals": () => (/* binding */ equals) -/* harmony export */ }); -/** - * Common utilities - * @module glMatrix - */ -// Configuration Constants -var EPSILON = 0.000001; -var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; -var RANDOM = Math.random; -/** - * Sets the type of array used when creating new vectors and matrices - * - * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array - */ - -function setMatrixArrayType(type) { - ARRAY_TYPE = type; -} -var degree = Math.PI / 180; -/** - * Convert Degree To Radian - * - * @param {Number} a Angle in Degrees - */ - -function toRadian(a) { - return a * degree; -} -/** - * Tests whether or not the arguments have approximately the same value, within an absolute - * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less - * than or equal to 1.0, and a relative tolerance is used for larger values) - * - * @param {Number} a The first number to test. - * @param {Number} b The second number to test. - * @returns {Boolean} True if the numbers are approximately equal, false otherwise. - */ - -function equals(a, b) { - return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); -} -if (!Math.hypot) Math.hypot = function () { - var y = 0, - i = arguments.length; - - while (i--) { - y += arguments[i] * arguments[i]; - } - - return Math.sqrt(y); -}; - -/***/ }), - -/***/ "./node_modules/gl-matrix/esm/mat4.js": -/*!********************************************!*\ - !*** ./node_modules/gl-matrix/esm/mat4.js ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "create": () => (/* binding */ create), -/* harmony export */ "clone": () => (/* binding */ clone), -/* harmony export */ "copy": () => (/* binding */ copy), -/* harmony export */ "fromValues": () => (/* binding */ fromValues), -/* harmony export */ "set": () => (/* binding */ set), -/* harmony export */ "identity": () => (/* binding */ identity), -/* harmony export */ "transpose": () => (/* binding */ transpose), -/* harmony export */ "invert": () => (/* binding */ invert), -/* harmony export */ "adjoint": () => (/* binding */ adjoint), -/* harmony export */ "determinant": () => (/* binding */ determinant), -/* harmony export */ "multiply": () => (/* binding */ multiply), -/* harmony export */ "translate": () => (/* binding */ translate), -/* harmony export */ "scale": () => (/* binding */ scale), -/* harmony export */ "rotate": () => (/* binding */ rotate), -/* harmony export */ "rotateX": () => (/* binding */ rotateX), -/* harmony export */ "rotateY": () => (/* binding */ rotateY), -/* harmony export */ "rotateZ": () => (/* binding */ rotateZ), -/* harmony export */ "fromTranslation": () => (/* binding */ fromTranslation), -/* harmony export */ "fromScaling": () => (/* binding */ fromScaling), -/* harmony export */ "fromRotation": () => (/* binding */ fromRotation), -/* harmony export */ "fromXRotation": () => (/* binding */ fromXRotation), -/* harmony export */ "fromYRotation": () => (/* binding */ fromYRotation), -/* harmony export */ "fromZRotation": () => (/* binding */ fromZRotation), -/* harmony export */ "fromRotationTranslation": () => (/* binding */ fromRotationTranslation), -/* harmony export */ "fromQuat2": () => (/* binding */ fromQuat2), -/* harmony export */ "getTranslation": () => (/* binding */ getTranslation), -/* harmony export */ "getScaling": () => (/* binding */ getScaling), -/* harmony export */ "getRotation": () => (/* binding */ getRotation), -/* harmony export */ "fromRotationTranslationScale": () => (/* binding */ fromRotationTranslationScale), -/* harmony export */ "fromRotationTranslationScaleOrigin": () => (/* binding */ fromRotationTranslationScaleOrigin), -/* harmony export */ "fromQuat": () => (/* binding */ fromQuat), -/* harmony export */ "frustum": () => (/* binding */ frustum), -/* harmony export */ "perspective": () => (/* binding */ perspective), -/* harmony export */ "perspectiveFromFieldOfView": () => (/* binding */ perspectiveFromFieldOfView), -/* harmony export */ "ortho": () => (/* binding */ ortho), -/* harmony export */ "lookAt": () => (/* binding */ lookAt), -/* harmony export */ "targetTo": () => (/* binding */ targetTo), -/* harmony export */ "str": () => (/* binding */ str), -/* harmony export */ "frob": () => (/* binding */ frob), -/* harmony export */ "add": () => (/* binding */ add), -/* harmony export */ "subtract": () => (/* binding */ subtract), -/* harmony export */ "multiplyScalar": () => (/* binding */ multiplyScalar), -/* harmony export */ "multiplyScalarAndAdd": () => (/* binding */ multiplyScalarAndAdd), -/* harmony export */ "exactEquals": () => (/* binding */ exactEquals), -/* harmony export */ "equals": () => (/* binding */ equals), -/* harmony export */ "mul": () => (/* binding */ mul), -/* harmony export */ "sub": () => (/* binding */ sub) -/* harmony export */ }); -/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common.js */ "./node_modules/gl-matrix/esm/common.js"); - -/** - * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. - * @module mat4 - */ - -/** - * Creates a new identity mat4 - * - * @returns {mat4} a new 4x4 matrix - */ - -function create() { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(16); - - if (_common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } - - out[0] = 1; - out[5] = 1; - out[10] = 1; - out[15] = 1; - return out; -} -/** - * Creates a new mat4 initialized with values from an existing matrix - * - * @param {ReadonlyMat4} a matrix to clone - * @returns {mat4} a new 4x4 matrix - */ - -function clone(a) { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(16); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -} -/** - * Copy the values from one mat4 to another - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ - -function copy(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -} -/** - * Create a new mat4 with the given values - * - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m02 Component in column 0, row 2 position (index 2) - * @param {Number} m03 Component in column 0, row 3 position (index 3) - * @param {Number} m10 Component in column 1, row 0 position (index 4) - * @param {Number} m11 Component in column 1, row 1 position (index 5) - * @param {Number} m12 Component in column 1, row 2 position (index 6) - * @param {Number} m13 Component in column 1, row 3 position (index 7) - * @param {Number} m20 Component in column 2, row 0 position (index 8) - * @param {Number} m21 Component in column 2, row 1 position (index 9) - * @param {Number} m22 Component in column 2, row 2 position (index 10) - * @param {Number} m23 Component in column 2, row 3 position (index 11) - * @param {Number} m30 Component in column 3, row 0 position (index 12) - * @param {Number} m31 Component in column 3, row 1 position (index 13) - * @param {Number} m32 Component in column 3, row 2 position (index 14) - * @param {Number} m33 Component in column 3, row 3 position (index 15) - * @returns {mat4} A new mat4 - */ - -function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(16); - out[0] = m00; - out[1] = m01; - out[2] = m02; - out[3] = m03; - out[4] = m10; - out[5] = m11; - out[6] = m12; - out[7] = m13; - out[8] = m20; - out[9] = m21; - out[10] = m22; - out[11] = m23; - out[12] = m30; - out[13] = m31; - out[14] = m32; - out[15] = m33; - return out; -} -/** - * Set the components of a mat4 to the given values - * - * @param {mat4} out the receiving matrix - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m02 Component in column 0, row 2 position (index 2) - * @param {Number} m03 Component in column 0, row 3 position (index 3) - * @param {Number} m10 Component in column 1, row 0 position (index 4) - * @param {Number} m11 Component in column 1, row 1 position (index 5) - * @param {Number} m12 Component in column 1, row 2 position (index 6) - * @param {Number} m13 Component in column 1, row 3 position (index 7) - * @param {Number} m20 Component in column 2, row 0 position (index 8) - * @param {Number} m21 Component in column 2, row 1 position (index 9) - * @param {Number} m22 Component in column 2, row 2 position (index 10) - * @param {Number} m23 Component in column 2, row 3 position (index 11) - * @param {Number} m30 Component in column 3, row 0 position (index 12) - * @param {Number} m31 Component in column 3, row 1 position (index 13) - * @param {Number} m32 Component in column 3, row 2 position (index 14) - * @param {Number} m33 Component in column 3, row 3 position (index 15) - * @returns {mat4} out - */ - -function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { - out[0] = m00; - out[1] = m01; - out[2] = m02; - out[3] = m03; - out[4] = m10; - out[5] = m11; - out[6] = m12; - out[7] = m13; - out[8] = m20; - out[9] = m21; - out[10] = m22; - out[11] = m23; - out[12] = m30; - out[13] = m31; - out[14] = m32; - out[15] = m33; - return out; -} -/** - * Set a mat4 to the identity matrix - * - * @param {mat4} out the receiving matrix - * @returns {mat4} out - */ - -function identity(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} -/** - * Transpose the values of a mat4 - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ - -function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a12 = a[6], - a13 = a[7]; - var a23 = a[11]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } - - return out; -} -/** - * Inverts a mat4 - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ - -function invert(out, a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; - var b00 = a00 * a11 - a01 * a10; - var b01 = a00 * a12 - a02 * a10; - var b02 = a00 * a13 - a03 * a10; - var b03 = a01 * a12 - a02 * a11; - var b04 = a01 * a13 - a03 * a11; - var b05 = a02 * a13 - a03 * a12; - var b06 = a20 * a31 - a21 * a30; - var b07 = a20 * a32 - a22 * a30; - var b08 = a20 * a33 - a23 * a30; - var b09 = a21 * a32 - a22 * a31; - var b10 = a21 * a33 - a23 * a31; - var b11 = a22 * a33 - a23 * a32; // Calculate the determinant - - var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; - - if (!det) { - return null; - } - - det = 1.0 / det; - out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; - out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; - out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; - out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; - out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; - out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; - out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; - out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; - out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; - out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; - out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; - out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; - out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; - out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; - out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; - out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; - return out; -} -/** - * Calculates the adjugate of a mat4 - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ - -function adjoint(out, a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; - out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); - out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); - out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); - out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); - out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); - out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); - out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); - out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); - out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); - out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); - out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); - out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); - out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); - out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); - out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); - out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); - return out; -} -/** - * Calculates the determinant of a mat4 - * - * @param {ReadonlyMat4} a the source matrix - * @returns {Number} determinant of a - */ - -function determinant(a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; - var b00 = a00 * a11 - a01 * a10; - var b01 = a00 * a12 - a02 * a10; - var b02 = a00 * a13 - a03 * a10; - var b03 = a01 * a12 - a02 * a11; - var b04 = a01 * a13 - a03 * a11; - var b05 = a02 * a13 - a03 * a12; - var b06 = a20 * a31 - a21 * a30; - var b07 = a20 * a32 - a22 * a30; - var b08 = a20 * a33 - a23 * a30; - var b09 = a21 * a32 - a22 * a31; - var b10 = a21 * a33 - a23 * a31; - var b11 = a22 * a33 - a23 * a32; // Calculate the determinant - - return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; -} -/** - * Multiplies two mat4s - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @returns {mat4} out - */ - -function multiply(out, a, b) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; // Cache only the current line of the second matrix - - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; - out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; - out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; - out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; - b0 = b[4]; - b1 = b[5]; - b2 = b[6]; - b3 = b[7]; - out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; - out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; - out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; - out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; - b0 = b[8]; - b1 = b[9]; - b2 = b[10]; - b3 = b[11]; - out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; - out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; - out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; - out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; - b0 = b[12]; - b1 = b[13]; - b2 = b[14]; - b3 = b[15]; - out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; - out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; - out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; - out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; - return out; -} -/** - * Translate a mat4 by the given vector - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to translate - * @param {ReadonlyVec3} v vector to translate by - * @returns {mat4} out - */ - -function translate(out, a, v) { - var x = v[0], - y = v[1], - z = v[2]; - var a00, a01, a02, a03; - var a10, a11, a12, a13; - var a20, a21, a22, a23; - - if (a === out) { - out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; - out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; - out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; - out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; - } else { - a00 = a[0]; - a01 = a[1]; - a02 = a[2]; - a03 = a[3]; - a10 = a[4]; - a11 = a[5]; - a12 = a[6]; - a13 = a[7]; - a20 = a[8]; - a21 = a[9]; - a22 = a[10]; - a23 = a[11]; - out[0] = a00; - out[1] = a01; - out[2] = a02; - out[3] = a03; - out[4] = a10; - out[5] = a11; - out[6] = a12; - out[7] = a13; - out[8] = a20; - out[9] = a21; - out[10] = a22; - out[11] = a23; - out[12] = a00 * x + a10 * y + a20 * z + a[12]; - out[13] = a01 * x + a11 * y + a21 * z + a[13]; - out[14] = a02 * x + a12 * y + a22 * z + a[14]; - out[15] = a03 * x + a13 * y + a23 * z + a[15]; - } - - return out; -} -/** - * Scales the mat4 by the dimensions in the given vec3 not using vectorization - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to scale - * @param {ReadonlyVec3} v the vec3 to scale the matrix by - * @returns {mat4} out - **/ - -function scale(out, a, v) { - var x = v[0], - y = v[1], - z = v[2]; - out[0] = a[0] * x; - out[1] = a[1] * x; - out[2] = a[2] * x; - out[3] = a[3] * x; - out[4] = a[4] * y; - out[5] = a[5] * y; - out[6] = a[6] * y; - out[7] = a[7] * y; - out[8] = a[8] * z; - out[9] = a[9] * z; - out[10] = a[10] * z; - out[11] = a[11] * z; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - return out; -} -/** - * Rotates a mat4 by the given angle around the given axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @param {ReadonlyVec3} axis the axis to rotate around - * @returns {mat4} out - */ - -function rotate(out, a, rad, axis) { - var x = axis[0], - y = axis[1], - z = axis[2]; - var len = Math.hypot(x, y, z); - var s, c, t; - var a00, a01, a02, a03; - var a10, a11, a12, a13; - var a20, a21, a22, a23; - var b00, b01, b02; - var b10, b11, b12; - var b20, b21, b22; - - if (len < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON) { - return null; - } - - len = 1 / len; - x *= len; - y *= len; - z *= len; - s = Math.sin(rad); - c = Math.cos(rad); - t = 1 - c; - a00 = a[0]; - a01 = a[1]; - a02 = a[2]; - a03 = a[3]; - a10 = a[4]; - a11 = a[5]; - a12 = a[6]; - a13 = a[7]; - a20 = a[8]; - a21 = a[9]; - a22 = a[10]; - a23 = a[11]; // Construct the elements of the rotation matrix - - b00 = x * x * t + c; - b01 = y * x * t + z * s; - b02 = z * x * t - y * s; - b10 = x * y * t - z * s; - b11 = y * y * t + c; - b12 = z * y * t + x * s; - b20 = x * z * t + y * s; - b21 = y * z * t - x * s; - b22 = z * z * t + c; // Perform rotation-specific matrix multiplication - - out[0] = a00 * b00 + a10 * b01 + a20 * b02; - out[1] = a01 * b00 + a11 * b01 + a21 * b02; - out[2] = a02 * b00 + a12 * b01 + a22 * b02; - out[3] = a03 * b00 + a13 * b01 + a23 * b02; - out[4] = a00 * b10 + a10 * b11 + a20 * b12; - out[5] = a01 * b10 + a11 * b11 + a21 * b12; - out[6] = a02 * b10 + a12 * b11 + a22 * b12; - out[7] = a03 * b10 + a13 * b11 + a23 * b12; - out[8] = a00 * b20 + a10 * b21 + a20 * b22; - out[9] = a01 * b20 + a11 * b21 + a21 * b22; - out[10] = a02 * b20 + a12 * b21 + a22 * b22; - out[11] = a03 * b20 + a13 * b21 + a23 * b22; - - if (a !== out) { - // If the source and destination differ, copy the unchanged last row - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } - - return out; -} -/** - * Rotates a matrix by the given angle around the X axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ - -function rotateX(out, a, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); - var a10 = a[4]; - var a11 = a[5]; - var a12 = a[6]; - var a13 = a[7]; - var a20 = a[8]; - var a21 = a[9]; - var a22 = a[10]; - var a23 = a[11]; - - if (a !== out) { - // If the source and destination differ, copy the unchanged rows - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } // Perform axis-specific matrix multiplication - - - out[4] = a10 * c + a20 * s; - out[5] = a11 * c + a21 * s; - out[6] = a12 * c + a22 * s; - out[7] = a13 * c + a23 * s; - out[8] = a20 * c - a10 * s; - out[9] = a21 * c - a11 * s; - out[10] = a22 * c - a12 * s; - out[11] = a23 * c - a13 * s; - return out; -} -/** - * Rotates a matrix by the given angle around the Y axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ - -function rotateY(out, a, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); - var a00 = a[0]; - var a01 = a[1]; - var a02 = a[2]; - var a03 = a[3]; - var a20 = a[8]; - var a21 = a[9]; - var a22 = a[10]; - var a23 = a[11]; - - if (a !== out) { - // If the source and destination differ, copy the unchanged rows - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } // Perform axis-specific matrix multiplication - - - out[0] = a00 * c - a20 * s; - out[1] = a01 * c - a21 * s; - out[2] = a02 * c - a22 * s; - out[3] = a03 * c - a23 * s; - out[8] = a00 * s + a20 * c; - out[9] = a01 * s + a21 * c; - out[10] = a02 * s + a22 * c; - out[11] = a03 * s + a23 * c; - return out; -} -/** - * Rotates a matrix by the given angle around the Z axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ - -function rotateZ(out, a, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); - var a00 = a[0]; - var a01 = a[1]; - var a02 = a[2]; - var a03 = a[3]; - var a10 = a[4]; - var a11 = a[5]; - var a12 = a[6]; - var a13 = a[7]; - - if (a !== out) { - // If the source and destination differ, copy the unchanged last row - out[8] = a[8]; - out[9] = a[9]; - out[10] = a[10]; - out[11] = a[11]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } // Perform axis-specific matrix multiplication - - - out[0] = a00 * c + a10 * s; - out[1] = a01 * c + a11 * s; - out[2] = a02 * c + a12 * s; - out[3] = a03 * c + a13 * s; - out[4] = a10 * c - a00 * s; - out[5] = a11 * c - a01 * s; - out[6] = a12 * c - a02 * s; - out[7] = a13 * c - a03 * s; - return out; -} -/** - * Creates a matrix from a vector translation - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, dest, vec); - * - * @param {mat4} out mat4 receiving operation result - * @param {ReadonlyVec3} v Translation vector - * @returns {mat4} out - */ - -function fromTranslation(out, v) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - return out; -} -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.scale(dest, dest, vec); - * - * @param {mat4} out mat4 receiving operation result - * @param {ReadonlyVec3} v Scaling vector - * @returns {mat4} out - */ - -function fromScaling(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = v[1]; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = v[2]; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} -/** - * Creates a matrix from a given angle around a given axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotate(dest, dest, rad, axis); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @param {ReadonlyVec3} axis the axis to rotate around - * @returns {mat4} out - */ - -function fromRotation(out, rad, axis) { - var x = axis[0], - y = axis[1], - z = axis[2]; - var len = Math.hypot(x, y, z); - var s, c, t; - - if (len < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON) { - return null; - } - - len = 1 / len; - x *= len; - y *= len; - z *= len; - s = Math.sin(rad); - c = Math.cos(rad); - t = 1 - c; // Perform rotation-specific matrix multiplication - - out[0] = x * x * t + c; - out[1] = y * x * t + z * s; - out[2] = z * x * t - y * s; - out[3] = 0; - out[4] = x * y * t - z * s; - out[5] = y * y * t + c; - out[6] = z * y * t + x * s; - out[7] = 0; - out[8] = x * z * t + y * s; - out[9] = y * z * t - x * s; - out[10] = z * z * t + c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} -/** - * Creates a matrix from the given angle around the X axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateX(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ - -function fromXRotation(out, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); // Perform axis-specific matrix multiplication - - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = c; - out[6] = s; - out[7] = 0; - out[8] = 0; - out[9] = -s; - out[10] = c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} -/** - * Creates a matrix from the given angle around the Y axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateY(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ - -function fromYRotation(out, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); // Perform axis-specific matrix multiplication - - out[0] = c; - out[1] = 0; - out[2] = -s; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = s; - out[9] = 0; - out[10] = c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} -/** - * Creates a matrix from the given angle around the Z axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateZ(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ - -function fromZRotation(out, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); // Perform axis-specific matrix multiplication - - out[0] = c; - out[1] = s; - out[2] = 0; - out[3] = 0; - out[4] = -s; - out[5] = c; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 1; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} -/** - * Creates a matrix from a quaternion rotation and vector translation - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * let quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {ReadonlyVec3} v Translation vector - * @returns {mat4} out - */ - -function fromRotationTranslation(out, q, v) { - // Quaternion math - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var xy = x * y2; - var xz = x * z2; - var yy = y * y2; - var yz = y * z2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - out[0] = 1 - (yy + zz); - out[1] = xy + wz; - out[2] = xz - wy; - out[3] = 0; - out[4] = xy - wz; - out[5] = 1 - (xx + zz); - out[6] = yz + wx; - out[7] = 0; - out[8] = xz + wy; - out[9] = yz - wx; - out[10] = 1 - (xx + yy); - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - return out; -} -/** - * Creates a new mat4 from a dual quat. - * - * @param {mat4} out Matrix - * @param {ReadonlyQuat2} a Dual Quaternion - * @returns {mat4} mat4 receiving operation result - */ - -function fromQuat2(out, a) { - var translation = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); - var bx = -a[0], - by = -a[1], - bz = -a[2], - bw = a[3], - ax = a[4], - ay = a[5], - az = a[6], - aw = a[7]; - var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense - - if (magnitude > 0) { - translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; - translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; - translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; - } else { - translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; - translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; - translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; - } - - fromRotationTranslation(out, a, translation); - return out; -} -/** - * Returns the translation vector component of a transformation - * matrix. If a matrix is built with fromRotationTranslation, - * the returned vector will be the same as the translation vector - * originally supplied. - * @param {vec3} out Vector to receive translation component - * @param {ReadonlyMat4} mat Matrix to be decomposed (input) - * @return {vec3} out - */ - -function getTranslation(out, mat) { - out[0] = mat[12]; - out[1] = mat[13]; - out[2] = mat[14]; - return out; -} -/** - * Returns the scaling factor component of a transformation - * matrix. If a matrix is built with fromRotationTranslationScale - * with a normalized Quaternion paramter, the returned vector will be - * the same as the scaling vector - * originally supplied. - * @param {vec3} out Vector to receive scaling factor component - * @param {ReadonlyMat4} mat Matrix to be decomposed (input) - * @return {vec3} out - */ - -function getScaling(out, mat) { - var m11 = mat[0]; - var m12 = mat[1]; - var m13 = mat[2]; - var m21 = mat[4]; - var m22 = mat[5]; - var m23 = mat[6]; - var m31 = mat[8]; - var m32 = mat[9]; - var m33 = mat[10]; - out[0] = Math.hypot(m11, m12, m13); - out[1] = Math.hypot(m21, m22, m23); - out[2] = Math.hypot(m31, m32, m33); - return out; -} -/** - * Returns a quaternion representing the rotational component - * of a transformation matrix. If a matrix is built with - * fromRotationTranslation, the returned quaternion will be the - * same as the quaternion originally supplied. - * @param {quat} out Quaternion to receive the rotation component - * @param {ReadonlyMat4} mat Matrix to be decomposed (input) - * @return {quat} out - */ - -function getRotation(out, mat) { - var scaling = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); - getScaling(scaling, mat); - var is1 = 1 / scaling[0]; - var is2 = 1 / scaling[1]; - var is3 = 1 / scaling[2]; - var sm11 = mat[0] * is1; - var sm12 = mat[1] * is2; - var sm13 = mat[2] * is3; - var sm21 = mat[4] * is1; - var sm22 = mat[5] * is2; - var sm23 = mat[6] * is3; - var sm31 = mat[8] * is1; - var sm32 = mat[9] * is2; - var sm33 = mat[10] * is3; - var trace = sm11 + sm22 + sm33; - var S = 0; - - if (trace > 0) { - S = Math.sqrt(trace + 1.0) * 2; - out[3] = 0.25 * S; - out[0] = (sm23 - sm32) / S; - out[1] = (sm31 - sm13) / S; - out[2] = (sm12 - sm21) / S; - } else if (sm11 > sm22 && sm11 > sm33) { - S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; - out[3] = (sm23 - sm32) / S; - out[0] = 0.25 * S; - out[1] = (sm12 + sm21) / S; - out[2] = (sm31 + sm13) / S; - } else if (sm22 > sm33) { - S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; - out[3] = (sm31 - sm13) / S; - out[0] = (sm12 + sm21) / S; - out[1] = 0.25 * S; - out[2] = (sm23 + sm32) / S; - } else { - S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; - out[3] = (sm12 - sm21) / S; - out[0] = (sm31 + sm13) / S; - out[1] = (sm23 + sm32) / S; - out[2] = 0.25 * S; - } - - return out; -} -/** - * Creates a matrix from a quaternion rotation, vector translation and vector scale - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * let quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * mat4.scale(dest, scale) - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {ReadonlyVec3} v Translation vector - * @param {ReadonlyVec3} s Scaling vector - * @returns {mat4} out - */ - -function fromRotationTranslationScale(out, q, v, s) { - // Quaternion math - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var xy = x * y2; - var xz = x * z2; - var yy = y * y2; - var yz = y * z2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - var sx = s[0]; - var sy = s[1]; - var sz = s[2]; - out[0] = (1 - (yy + zz)) * sx; - out[1] = (xy + wz) * sx; - out[2] = (xz - wy) * sx; - out[3] = 0; - out[4] = (xy - wz) * sy; - out[5] = (1 - (xx + zz)) * sy; - out[6] = (yz + wx) * sy; - out[7] = 0; - out[8] = (xz + wy) * sz; - out[9] = (yz - wx) * sz; - out[10] = (1 - (xx + yy)) * sz; - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - return out; -} -/** - * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * mat4.translate(dest, origin); - * let quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * mat4.scale(dest, scale) - * mat4.translate(dest, negativeOrigin); - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {ReadonlyVec3} v Translation vector - * @param {ReadonlyVec3} s Scaling vector - * @param {ReadonlyVec3} o The origin vector around which to scale and rotate - * @returns {mat4} out - */ - -function fromRotationTranslationScaleOrigin(out, q, v, s, o) { - // Quaternion math - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var xy = x * y2; - var xz = x * z2; - var yy = y * y2; - var yz = y * z2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - var sx = s[0]; - var sy = s[1]; - var sz = s[2]; - var ox = o[0]; - var oy = o[1]; - var oz = o[2]; - var out0 = (1 - (yy + zz)) * sx; - var out1 = (xy + wz) * sx; - var out2 = (xz - wy) * sx; - var out4 = (xy - wz) * sy; - var out5 = (1 - (xx + zz)) * sy; - var out6 = (yz + wx) * sy; - var out8 = (xz + wy) * sz; - var out9 = (yz - wx) * sz; - var out10 = (1 - (xx + yy)) * sz; - out[0] = out0; - out[1] = out1; - out[2] = out2; - out[3] = 0; - out[4] = out4; - out[5] = out5; - out[6] = out6; - out[7] = 0; - out[8] = out8; - out[9] = out9; - out[10] = out10; - out[11] = 0; - out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); - out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); - out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); - out[15] = 1; - return out; -} -/** - * Calculates a 4x4 matrix from the given quaternion - * - * @param {mat4} out mat4 receiving operation result - * @param {ReadonlyQuat} q Quaternion to create matrix from - * - * @returns {mat4} out - */ - -function fromQuat(out, q) { - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var yx = y * x2; - var yy = y * y2; - var zx = z * x2; - var zy = z * y2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - out[0] = 1 - yy - zz; - out[1] = yx + wz; - out[2] = zx - wy; - out[3] = 0; - out[4] = yx - wz; - out[5] = 1 - xx - zz; - out[6] = zy + wx; - out[7] = 0; - out[8] = zx + wy; - out[9] = zy - wx; - out[10] = 1 - xx - yy; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; -} -/** - * Generates a frustum matrix with the given bounds - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {Number} left Left bound of the frustum - * @param {Number} right Right bound of the frustum - * @param {Number} bottom Bottom bound of the frustum - * @param {Number} top Top bound of the frustum - * @param {Number} near Near bound of the frustum - * @param {Number} far Far bound of the frustum - * @returns {mat4} out - */ - -function frustum(out, left, right, bottom, top, near, far) { - var rl = 1 / (right - left); - var tb = 1 / (top - bottom); - var nf = 1 / (near - far); - out[0] = near * 2 * rl; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = near * 2 * tb; - out[6] = 0; - out[7] = 0; - out[8] = (right + left) * rl; - out[9] = (top + bottom) * tb; - out[10] = (far + near) * nf; - out[11] = -1; - out[12] = 0; - out[13] = 0; - out[14] = far * near * 2 * nf; - out[15] = 0; - return out; -} -/** - * Generates a perspective projection matrix with the given bounds. - * Passing null/undefined/no value for far will generate infinite projection matrix. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {number} fovy Vertical field of view in radians - * @param {number} aspect Aspect ratio. typically viewport width/height - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum, can be null or Infinity - * @returns {mat4} out - */ - -function perspective(out, fovy, aspect, near, far) { - var f = 1.0 / Math.tan(fovy / 2), - nf; - out[0] = f / aspect; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = f; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = -1; - out[12] = 0; - out[13] = 0; - out[15] = 0; - - if (far != null && far !== Infinity) { - nf = 1 / (near - far); - out[10] = (far + near) * nf; - out[14] = 2 * far * near * nf; - } else { - out[10] = -1; - out[14] = -2 * near; - } - - return out; -} -/** - * Generates a perspective projection matrix with the given field of view. - * This is primarily useful for generating projection matrices to be used - * with the still experiemental WebVR API. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum - * @returns {mat4} out - */ - -function perspectiveFromFieldOfView(out, fov, near, far) { - var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); - var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); - var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); - var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); - var xScale = 2.0 / (leftTan + rightTan); - var yScale = 2.0 / (upTan + downTan); - out[0] = xScale; - out[1] = 0.0; - out[2] = 0.0; - out[3] = 0.0; - out[4] = 0.0; - out[5] = yScale; - out[6] = 0.0; - out[7] = 0.0; - out[8] = -((leftTan - rightTan) * xScale * 0.5); - out[9] = (upTan - downTan) * yScale * 0.5; - out[10] = far / (near - far); - out[11] = -1.0; - out[12] = 0.0; - out[13] = 0.0; - out[14] = far * near / (near - far); - out[15] = 0.0; - return out; -} -/** - * Generates a orthogonal projection matrix with the given bounds - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {number} left Left bound of the frustum - * @param {number} right Right bound of the frustum - * @param {number} bottom Bottom bound of the frustum - * @param {number} top Top bound of the frustum - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum - * @returns {mat4} out - */ - -function ortho(out, left, right, bottom, top, near, far) { - var lr = 1 / (left - right); - var bt = 1 / (bottom - top); - var nf = 1 / (near - far); - out[0] = -2 * lr; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = -2 * bt; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = 2 * nf; - out[11] = 0; - out[12] = (left + right) * lr; - out[13] = (top + bottom) * bt; - out[14] = (far + near) * nf; - out[15] = 1; - return out; -} -/** - * Generates a look-at matrix with the given eye position, focal point, and up axis. - * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {ReadonlyVec3} eye Position of the viewer - * @param {ReadonlyVec3} center Point the viewer is looking at - * @param {ReadonlyVec3} up vec3 pointing up - * @returns {mat4} out - */ - -function lookAt(out, eye, center, up) { - var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; - var eyex = eye[0]; - var eyey = eye[1]; - var eyez = eye[2]; - var upx = up[0]; - var upy = up[1]; - var upz = up[2]; - var centerx = center[0]; - var centery = center[1]; - var centerz = center[2]; - - if (Math.abs(eyex - centerx) < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON && Math.abs(eyey - centery) < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON && Math.abs(eyez - centerz) < _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON) { - return identity(out); - } - - z0 = eyex - centerx; - z1 = eyey - centery; - z2 = eyez - centerz; - len = 1 / Math.hypot(z0, z1, z2); - z0 *= len; - z1 *= len; - z2 *= len; - x0 = upy * z2 - upz * z1; - x1 = upz * z0 - upx * z2; - x2 = upx * z1 - upy * z0; - len = Math.hypot(x0, x1, x2); - - if (!len) { - x0 = 0; - x1 = 0; - x2 = 0; - } else { - len = 1 / len; - x0 *= len; - x1 *= len; - x2 *= len; - } - - y0 = z1 * x2 - z2 * x1; - y1 = z2 * x0 - z0 * x2; - y2 = z0 * x1 - z1 * x0; - len = Math.hypot(y0, y1, y2); - - if (!len) { - y0 = 0; - y1 = 0; - y2 = 0; - } else { - len = 1 / len; - y0 *= len; - y1 *= len; - y2 *= len; - } - - out[0] = x0; - out[1] = y0; - out[2] = z0; - out[3] = 0; - out[4] = x1; - out[5] = y1; - out[6] = z1; - out[7] = 0; - out[8] = x2; - out[9] = y2; - out[10] = z2; - out[11] = 0; - out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); - out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); - out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); - out[15] = 1; - return out; -} -/** - * Generates a matrix that makes something look at something else. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {ReadonlyVec3} eye Position of the viewer - * @param {ReadonlyVec3} center Point the viewer is looking at - * @param {ReadonlyVec3} up vec3 pointing up - * @returns {mat4} out - */ - -function targetTo(out, eye, target, up) { - var eyex = eye[0], - eyey = eye[1], - eyez = eye[2], - upx = up[0], - upy = up[1], - upz = up[2]; - var z0 = eyex - target[0], - z1 = eyey - target[1], - z2 = eyez - target[2]; - var len = z0 * z0 + z1 * z1 + z2 * z2; - - if (len > 0) { - len = 1 / Math.sqrt(len); - z0 *= len; - z1 *= len; - z2 *= len; - } - - var x0 = upy * z2 - upz * z1, - x1 = upz * z0 - upx * z2, - x2 = upx * z1 - upy * z0; - len = x0 * x0 + x1 * x1 + x2 * x2; - - if (len > 0) { - len = 1 / Math.sqrt(len); - x0 *= len; - x1 *= len; - x2 *= len; - } - - out[0] = x0; - out[1] = x1; - out[2] = x2; - out[3] = 0; - out[4] = z1 * x2 - z2 * x1; - out[5] = z2 * x0 - z0 * x2; - out[6] = z0 * x1 - z1 * x0; - out[7] = 0; - out[8] = z0; - out[9] = z1; - out[10] = z2; - out[11] = 0; - out[12] = eyex; - out[13] = eyey; - out[14] = eyez; - out[15] = 1; - return out; -} -/** - * Returns a string representation of a mat4 - * - * @param {ReadonlyMat4} a matrix to represent as a string - * @returns {String} string representation of the matrix - */ - -function str(a) { - return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"; -} -/** - * Returns Frobenius norm of a mat4 - * - * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ - -function frob(a) { - return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); -} -/** - * Adds two mat4's - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @returns {mat4} out - */ - -function add(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; - out[5] = a[5] + b[5]; - out[6] = a[6] + b[6]; - out[7] = a[7] + b[7]; - out[8] = a[8] + b[8]; - out[9] = a[9] + b[9]; - out[10] = a[10] + b[10]; - out[11] = a[11] + b[11]; - out[12] = a[12] + b[12]; - out[13] = a[13] + b[13]; - out[14] = a[14] + b[14]; - out[15] = a[15] + b[15]; - return out; -} -/** - * Subtracts matrix b from matrix a - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @returns {mat4} out - */ - -function subtract(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - out[4] = a[4] - b[4]; - out[5] = a[5] - b[5]; - out[6] = a[6] - b[6]; - out[7] = a[7] - b[7]; - out[8] = a[8] - b[8]; - out[9] = a[9] - b[9]; - out[10] = a[10] - b[10]; - out[11] = a[11] - b[11]; - out[12] = a[12] - b[12]; - out[13] = a[13] - b[13]; - out[14] = a[14] - b[14]; - out[15] = a[15] - b[15]; - return out; -} -/** - * Multiply each element of the matrix by a scalar. - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to scale - * @param {Number} b amount to scale the matrix's elements by - * @returns {mat4} out - */ - -function multiplyScalar(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - out[3] = a[3] * b; - out[4] = a[4] * b; - out[5] = a[5] * b; - out[6] = a[6] * b; - out[7] = a[7] * b; - out[8] = a[8] * b; - out[9] = a[9] * b; - out[10] = a[10] * b; - out[11] = a[11] * b; - out[12] = a[12] * b; - out[13] = a[13] * b; - out[14] = a[14] * b; - out[15] = a[15] * b; - return out; -} -/** - * Adds two mat4's after multiplying each element of the second operand by a scalar value. - * - * @param {mat4} out the receiving vector - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @param {Number} scale the amount to scale b's elements by before adding - * @returns {mat4} out - */ - -function multiplyScalarAndAdd(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - out[3] = a[3] + b[3] * scale; - out[4] = a[4] + b[4] * scale; - out[5] = a[5] + b[5] * scale; - out[6] = a[6] + b[6] * scale; - out[7] = a[7] + b[7] * scale; - out[8] = a[8] + b[8] * scale; - out[9] = a[9] + b[9] * scale; - out[10] = a[10] + b[10] * scale; - out[11] = a[11] + b[11] * scale; - out[12] = a[12] + b[12] * scale; - out[13] = a[13] + b[13] * scale; - out[14] = a[14] + b[14] * scale; - out[15] = a[15] + b[15] * scale; - return out; -} -/** - * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyMat4} a The first matrix. - * @param {ReadonlyMat4} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ - -function exactEquals(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; -} -/** - * Returns whether or not the matrices have approximately the same elements in the same position. - * - * @param {ReadonlyMat4} a The first matrix. - * @param {ReadonlyMat4} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ - -function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - var a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - var a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - var b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - var b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - var b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); -} -/** - * Alias for {@link mat4.multiply} - * @function - */ - -var mul = multiply; -/** - * Alias for {@link mat4.subtract} - * @function - */ - -var sub = subtract; - -/***/ }), - -/***/ "./node_modules/gl-matrix/esm/vec3.js": -/*!********************************************!*\ - !*** ./node_modules/gl-matrix/esm/vec3.js ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "create": () => (/* binding */ create), -/* harmony export */ "clone": () => (/* binding */ clone), -/* harmony export */ "length": () => (/* binding */ length), -/* harmony export */ "fromValues": () => (/* binding */ fromValues), -/* harmony export */ "copy": () => (/* binding */ copy), -/* harmony export */ "set": () => (/* binding */ set), -/* harmony export */ "add": () => (/* binding */ add), -/* harmony export */ "subtract": () => (/* binding */ subtract), -/* harmony export */ "multiply": () => (/* binding */ multiply), -/* harmony export */ "divide": () => (/* binding */ divide), -/* harmony export */ "ceil": () => (/* binding */ ceil), -/* harmony export */ "floor": () => (/* binding */ floor), -/* harmony export */ "min": () => (/* binding */ min), -/* harmony export */ "max": () => (/* binding */ max), -/* harmony export */ "round": () => (/* binding */ round), -/* harmony export */ "scale": () => (/* binding */ scale), -/* harmony export */ "scaleAndAdd": () => (/* binding */ scaleAndAdd), -/* harmony export */ "distance": () => (/* binding */ distance), -/* harmony export */ "squaredDistance": () => (/* binding */ squaredDistance), -/* harmony export */ "squaredLength": () => (/* binding */ squaredLength), -/* harmony export */ "negate": () => (/* binding */ negate), -/* harmony export */ "inverse": () => (/* binding */ inverse), -/* harmony export */ "normalize": () => (/* binding */ normalize), -/* harmony export */ "dot": () => (/* binding */ dot), -/* harmony export */ "cross": () => (/* binding */ cross), -/* harmony export */ "lerp": () => (/* binding */ lerp), -/* harmony export */ "hermite": () => (/* binding */ hermite), -/* harmony export */ "bezier": () => (/* binding */ bezier), -/* harmony export */ "random": () => (/* binding */ random), -/* harmony export */ "transformMat4": () => (/* binding */ transformMat4), -/* harmony export */ "transformMat3": () => (/* binding */ transformMat3), -/* harmony export */ "transformQuat": () => (/* binding */ transformQuat), -/* harmony export */ "rotateX": () => (/* binding */ rotateX), -/* harmony export */ "rotateY": () => (/* binding */ rotateY), -/* harmony export */ "rotateZ": () => (/* binding */ rotateZ), -/* harmony export */ "angle": () => (/* binding */ angle), -/* harmony export */ "zero": () => (/* binding */ zero), -/* harmony export */ "str": () => (/* binding */ str), -/* harmony export */ "exactEquals": () => (/* binding */ exactEquals), -/* harmony export */ "equals": () => (/* binding */ equals), -/* harmony export */ "sub": () => (/* binding */ sub), -/* harmony export */ "mul": () => (/* binding */ mul), -/* harmony export */ "div": () => (/* binding */ div), -/* harmony export */ "dist": () => (/* binding */ dist), -/* harmony export */ "sqrDist": () => (/* binding */ sqrDist), -/* harmony export */ "len": () => (/* binding */ len), -/* harmony export */ "sqrLen": () => (/* binding */ sqrLen), -/* harmony export */ "forEach": () => (/* binding */ forEach) -/* harmony export */ }); -/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common.js */ "./node_modules/gl-matrix/esm/common.js"); - -/** - * 3 Dimensional Vector - * @module vec3 - */ - -/** - * Creates a new, empty vec3 - * - * @returns {vec3} a new 3D vector - */ - -function create() { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); - - if (_common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } - - return out; -} -/** - * Creates a new vec3 initialized with values from an existing vector - * - * @param {ReadonlyVec3} a vector to clone - * @returns {vec3} a new 3D vector - */ - -function clone(a) { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - return out; -} -/** - * Calculates the length of a vec3 - * - * @param {ReadonlyVec3} a vector to calculate length of - * @returns {Number} length of a - */ - -function length(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return Math.hypot(x, y, z); -} -/** - * Creates a new vec3 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @returns {vec3} a new 3D vector - */ - -function fromValues(x, y, z) { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(3); - out[0] = x; - out[1] = y; - out[2] = z; - return out; -} -/** - * Copy the values from one vec3 to another - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the source vector - * @returns {vec3} out - */ - -function copy(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - return out; -} -/** - * Set the components of a vec3 to the given values - * - * @param {vec3} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @returns {vec3} out - */ - -function set(out, x, y, z) { - out[0] = x; - out[1] = y; - out[2] = z; - return out; -} -/** - * Adds two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ - -function add(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - return out; -} -/** - * Subtracts vector b from vector a - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ - -function subtract(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - return out; -} -/** - * Multiplies two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ - -function multiply(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - out[2] = a[2] * b[2]; - return out; -} -/** - * Divides two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ - -function divide(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - out[2] = a[2] / b[2]; - return out; -} -/** - * Math.ceil the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to ceil - * @returns {vec3} out - */ - -function ceil(out, a) { - out[0] = Math.ceil(a[0]); - out[1] = Math.ceil(a[1]); - out[2] = Math.ceil(a[2]); - return out; -} -/** - * Math.floor the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to floor - * @returns {vec3} out - */ - -function floor(out, a) { - out[0] = Math.floor(a[0]); - out[1] = Math.floor(a[1]); - out[2] = Math.floor(a[2]); - return out; -} -/** - * Returns the minimum of two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ - -function min(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - out[2] = Math.min(a[2], b[2]); - return out; -} -/** - * Returns the maximum of two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ - -function max(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - out[2] = Math.max(a[2], b[2]); - return out; -} -/** - * Math.round the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to round - * @returns {vec3} out - */ - -function round(out, a) { - out[0] = Math.round(a[0]); - out[1] = Math.round(a[1]); - out[2] = Math.round(a[2]); - return out; -} -/** - * Scales a vec3 by a scalar number - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec3} out - */ - -function scale(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - return out; -} -/** - * Adds two vec3's after scaling the second operand by a scalar value - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec3} out - */ - -function scaleAndAdd(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - return out; -} -/** - * Calculates the euclidian distance between two vec3's - * - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {Number} distance between a and b - */ - -function distance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return Math.hypot(x, y, z); -} -/** - * Calculates the squared euclidian distance between two vec3's - * - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {Number} squared distance between a and b - */ - -function squaredDistance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return x * x + y * y + z * z; -} -/** - * Calculates the squared length of a vec3 - * - * @param {ReadonlyVec3} a vector to calculate squared length of - * @returns {Number} squared length of a - */ - -function squaredLength(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return x * x + y * y + z * z; -} -/** - * Negates the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to negate - * @returns {vec3} out - */ - -function negate(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - return out; -} -/** - * Returns the inverse of the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to invert - * @returns {vec3} out - */ - -function inverse(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - out[2] = 1.0 / a[2]; - return out; -} -/** - * Normalize a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to normalize - * @returns {vec3} out - */ - -function normalize(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var len = x * x + y * y + z * z; - - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } - - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; - return out; -} -/** - * Calculates the dot product of two vec3's - * - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {Number} dot product of a and b - */ - -function dot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -} -/** - * Computes the cross product of two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ - -function cross(out, a, b) { - var ax = a[0], - ay = a[1], - az = a[2]; - var bx = b[0], - by = b[1], - bz = b[2]; - out[0] = ay * bz - az * by; - out[1] = az * bx - ax * bz; - out[2] = ax * by - ay * bx; - return out; -} -/** - * Performs a linear interpolation between two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec3} out - */ - -function lerp(out, a, b, t) { - var ax = a[0]; - var ay = a[1]; - var az = a[2]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - out[2] = az + t * (b[2] - az); - return out; -} -/** - * Performs a hermite interpolation with two control points - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {ReadonlyVec3} c the third operand - * @param {ReadonlyVec3} d the fourth operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec3} out - */ - -function hermite(out, a, b, c, d, t) { - var factorTimes2 = t * t; - var factor1 = factorTimes2 * (2 * t - 3) + 1; - var factor2 = factorTimes2 * (t - 2) + t; - var factor3 = factorTimes2 * (t - 1); - var factor4 = factorTimes2 * (3 - 2 * t); - out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; - out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; - out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; - return out; -} -/** - * Performs a bezier interpolation with two control points - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {ReadonlyVec3} c the third operand - * @param {ReadonlyVec3} d the fourth operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec3} out - */ - -function bezier(out, a, b, c, d, t) { - var inverseFactor = 1 - t; - var inverseFactorTimesTwo = inverseFactor * inverseFactor; - var factorTimes2 = t * t; - var factor1 = inverseFactorTimesTwo * inverseFactor; - var factor2 = 3 * t * inverseFactorTimesTwo; - var factor3 = 3 * factorTimes2 * inverseFactor; - var factor4 = factorTimes2 * t; - out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; - out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; - out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; - return out; -} -/** - * Generates a random vector with the given scale - * - * @param {vec3} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec3} out - */ - -function random(out, scale) { - scale = scale || 1.0; - var r = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2.0 * Math.PI; - var z = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2.0 - 1.0; - var zScale = Math.sqrt(1.0 - z * z) * scale; - out[0] = Math.cos(r) * zScale; - out[1] = Math.sin(r) * zScale; - out[2] = z * scale; - return out; -} -/** - * Transforms the vec3 with a mat4. - * 4th vector component is implicitly '1' - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to transform - * @param {ReadonlyMat4} m matrix to transform with - * @returns {vec3} out - */ - -function transformMat4(out, a, m) { - var x = a[0], - y = a[1], - z = a[2]; - var w = m[3] * x + m[7] * y + m[11] * z + m[15]; - w = w || 1.0; - out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; - out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; - out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; - return out; -} -/** - * Transforms the vec3 with a mat3. - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to transform - * @param {ReadonlyMat3} m the 3x3 matrix to transform with - * @returns {vec3} out - */ - -function transformMat3(out, a, m) { - var x = a[0], - y = a[1], - z = a[2]; - out[0] = x * m[0] + y * m[3] + z * m[6]; - out[1] = x * m[1] + y * m[4] + z * m[7]; - out[2] = x * m[2] + y * m[5] + z * m[8]; - return out; -} -/** - * Transforms the vec3 with a quat - * Can also be used for dual quaternions. (Multiply it with the real part) - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to transform - * @param {ReadonlyQuat} q quaternion to transform with - * @returns {vec3} out - */ - -function transformQuat(out, a, q) { - // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed - var qx = q[0], - qy = q[1], - qz = q[2], - qw = q[3]; - var x = a[0], - y = a[1], - z = a[2]; // var qvec = [qx, qy, qz]; - // var uv = vec3.cross([], qvec, a); - - var uvx = qy * z - qz * y, - uvy = qz * x - qx * z, - uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); - - var uuvx = qy * uvz - qz * uvy, - uuvy = qz * uvx - qx * uvz, - uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); - - var w2 = qw * 2; - uvx *= w2; - uvy *= w2; - uvz *= w2; // vec3.scale(uuv, uuv, 2); - - uuvx *= 2; - uuvy *= 2; - uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); - - out[0] = x + uvx + uuvx; - out[1] = y + uvy + uuvy; - out[2] = z + uvz + uuvz; - return out; -} -/** - * Rotate a 3D vector around the x-axis - * @param {vec3} out The receiving vec3 - * @param {ReadonlyVec3} a The vec3 point to rotate - * @param {ReadonlyVec3} b The origin of the rotation - * @param {Number} rad The angle of rotation in radians - * @returns {vec3} out - */ - -function rotateX(out, a, b, rad) { - var p = [], - r = []; //Translate point to the origin - - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; //perform rotation - - r[0] = p[0]; - r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); - r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position - - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - return out; -} -/** - * Rotate a 3D vector around the y-axis - * @param {vec3} out The receiving vec3 - * @param {ReadonlyVec3} a The vec3 point to rotate - * @param {ReadonlyVec3} b The origin of the rotation - * @param {Number} rad The angle of rotation in radians - * @returns {vec3} out - */ - -function rotateY(out, a, b, rad) { - var p = [], - r = []; //Translate point to the origin - - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; //perform rotation - - r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); - r[1] = p[1]; - r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position - - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - return out; -} -/** - * Rotate a 3D vector around the z-axis - * @param {vec3} out The receiving vec3 - * @param {ReadonlyVec3} a The vec3 point to rotate - * @param {ReadonlyVec3} b The origin of the rotation - * @param {Number} rad The angle of rotation in radians - * @returns {vec3} out - */ - -function rotateZ(out, a, b, rad) { - var p = [], - r = []; //Translate point to the origin - - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; //perform rotation - - r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); - r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); - r[2] = p[2]; //translate to correct position - - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - return out; -} -/** - * Get the angle between two 3D vectors - * @param {ReadonlyVec3} a The first operand - * @param {ReadonlyVec3} b The second operand - * @returns {Number} The angle in radians - */ - -function angle(a, b) { - var ax = a[0], - ay = a[1], - az = a[2], - bx = b[0], - by = b[1], - bz = b[2], - mag1 = Math.sqrt(ax * ax + ay * ay + az * az), - mag2 = Math.sqrt(bx * bx + by * by + bz * bz), - mag = mag1 * mag2, - cosine = mag && dot(a, b) / mag; - return Math.acos(Math.min(Math.max(cosine, -1), 1)); -} -/** - * Set the components of a vec3 to zero - * - * @param {vec3} out the receiving vector - * @returns {vec3} out - */ - -function zero(out) { - out[0] = 0.0; - out[1] = 0.0; - out[2] = 0.0; - return out; -} -/** - * Returns a string representation of a vector - * - * @param {ReadonlyVec3} a vector to represent as a string - * @returns {String} string representation of the vector - */ - -function str(a) { - return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; -} -/** - * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyVec3} a The first vector. - * @param {ReadonlyVec3} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ - -function exactEquals(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; -} -/** - * Returns whether or not the vectors have approximately the same elements in the same position. - * - * @param {ReadonlyVec3} a The first vector. - * @param {ReadonlyVec3} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ - -function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2]; - var b0 = b[0], - b1 = b[1], - b2 = b[2]; - return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); -} -/** - * Alias for {@link vec3.subtract} - * @function - */ - -var sub = subtract; -/** - * Alias for {@link vec3.multiply} - * @function - */ - -var mul = multiply; -/** - * Alias for {@link vec3.divide} - * @function - */ - -var div = divide; -/** - * Alias for {@link vec3.distance} - * @function - */ - -var dist = distance; -/** - * Alias for {@link vec3.squaredDistance} - * @function - */ - -var sqrDist = squaredDistance; -/** - * Alias for {@link vec3.length} - * @function - */ - -var len = length; -/** - * Alias for {@link vec3.squaredLength} - * @function - */ - -var sqrLen = squaredLength; -/** - * Perform some operation over an array of vec3s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ - -var forEach = function () { - var vec = create(); - return function (a, stride, offset, count, fn, arg) { - var i, l; - - if (!stride) { - stride = 3; - } - - if (!offset) { - offset = 0; - } - - if (count) { - l = Math.min(count * stride + offset, a.length); - } else { - l = a.length; - } - - for (i = offset; i < l; i += stride) { - vec[0] = a[i]; - vec[1] = a[i + 1]; - vec[2] = a[i + 2]; - fn(vec, vec, arg); - a[i] = vec[0]; - a[i + 1] = vec[1]; - a[i + 2] = vec[2]; - } - - return a; - }; -}(); - -/***/ }), - -/***/ "./node_modules/gl-matrix/esm/vec4.js": -/*!********************************************!*\ - !*** ./node_modules/gl-matrix/esm/vec4.js ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "create": () => (/* binding */ create), -/* harmony export */ "clone": () => (/* binding */ clone), -/* harmony export */ "fromValues": () => (/* binding */ fromValues), -/* harmony export */ "copy": () => (/* binding */ copy), -/* harmony export */ "set": () => (/* binding */ set), -/* harmony export */ "add": () => (/* binding */ add), -/* harmony export */ "subtract": () => (/* binding */ subtract), -/* harmony export */ "multiply": () => (/* binding */ multiply), -/* harmony export */ "divide": () => (/* binding */ divide), -/* harmony export */ "ceil": () => (/* binding */ ceil), -/* harmony export */ "floor": () => (/* binding */ floor), -/* harmony export */ "min": () => (/* binding */ min), -/* harmony export */ "max": () => (/* binding */ max), -/* harmony export */ "round": () => (/* binding */ round), -/* harmony export */ "scale": () => (/* binding */ scale), -/* harmony export */ "scaleAndAdd": () => (/* binding */ scaleAndAdd), -/* harmony export */ "distance": () => (/* binding */ distance), -/* harmony export */ "squaredDistance": () => (/* binding */ squaredDistance), -/* harmony export */ "length": () => (/* binding */ length), -/* harmony export */ "squaredLength": () => (/* binding */ squaredLength), -/* harmony export */ "negate": () => (/* binding */ negate), -/* harmony export */ "inverse": () => (/* binding */ inverse), -/* harmony export */ "normalize": () => (/* binding */ normalize), -/* harmony export */ "dot": () => (/* binding */ dot), -/* harmony export */ "cross": () => (/* binding */ cross), -/* harmony export */ "lerp": () => (/* binding */ lerp), -/* harmony export */ "random": () => (/* binding */ random), -/* harmony export */ "transformMat4": () => (/* binding */ transformMat4), -/* harmony export */ "transformQuat": () => (/* binding */ transformQuat), -/* harmony export */ "zero": () => (/* binding */ zero), -/* harmony export */ "str": () => (/* binding */ str), -/* harmony export */ "exactEquals": () => (/* binding */ exactEquals), -/* harmony export */ "equals": () => (/* binding */ equals), -/* harmony export */ "sub": () => (/* binding */ sub), -/* harmony export */ "mul": () => (/* binding */ mul), -/* harmony export */ "div": () => (/* binding */ div), -/* harmony export */ "dist": () => (/* binding */ dist), -/* harmony export */ "sqrDist": () => (/* binding */ sqrDist), -/* harmony export */ "len": () => (/* binding */ len), -/* harmony export */ "sqrLen": () => (/* binding */ sqrLen), -/* harmony export */ "forEach": () => (/* binding */ forEach) -/* harmony export */ }); -/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common.js */ "./node_modules/gl-matrix/esm/common.js"); - -/** - * 4 Dimensional Vector - * @module vec4 - */ - -/** - * Creates a new, empty vec4 - * - * @returns {vec4} a new 4D vector - */ - -function create() { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(4); - - if (_common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - - return out; -} -/** - * Creates a new vec4 initialized with values from an existing vector - * - * @param {ReadonlyVec4} a vector to clone - * @returns {vec4} a new 4D vector - */ - -function clone(a) { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(4); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; -} -/** - * Creates a new vec4 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {vec4} a new 4D vector - */ - -function fromValues(x, y, z, w) { - var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__.ARRAY_TYPE(4); - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = w; - return out; -} -/** - * Copy the values from one vec4 to another - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the source vector - * @returns {vec4} out - */ - -function copy(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; -} -/** - * Set the components of a vec4 to the given values - * - * @param {vec4} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {vec4} out - */ - -function set(out, x, y, z, w) { - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = w; - return out; -} -/** - * Adds two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ - -function add(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - return out; -} -/** - * Subtracts vector b from vector a - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ - -function subtract(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - return out; -} -/** - * Multiplies two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ - -function multiply(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - out[2] = a[2] * b[2]; - out[3] = a[3] * b[3]; - return out; -} -/** - * Divides two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ - -function divide(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - out[2] = a[2] / b[2]; - out[3] = a[3] / b[3]; - return out; -} -/** - * Math.ceil the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to ceil - * @returns {vec4} out - */ - -function ceil(out, a) { - out[0] = Math.ceil(a[0]); - out[1] = Math.ceil(a[1]); - out[2] = Math.ceil(a[2]); - out[3] = Math.ceil(a[3]); - return out; -} -/** - * Math.floor the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to floor - * @returns {vec4} out - */ - -function floor(out, a) { - out[0] = Math.floor(a[0]); - out[1] = Math.floor(a[1]); - out[2] = Math.floor(a[2]); - out[3] = Math.floor(a[3]); - return out; -} -/** - * Returns the minimum of two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ - -function min(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - out[2] = Math.min(a[2], b[2]); - out[3] = Math.min(a[3], b[3]); - return out; -} -/** - * Returns the maximum of two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ - -function max(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - out[2] = Math.max(a[2], b[2]); - out[3] = Math.max(a[3], b[3]); - return out; -} -/** - * Math.round the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to round - * @returns {vec4} out - */ - -function round(out, a) { - out[0] = Math.round(a[0]); - out[1] = Math.round(a[1]); - out[2] = Math.round(a[2]); - out[3] = Math.round(a[3]); - return out; -} -/** - * Scales a vec4 by a scalar number - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec4} out - */ - -function scale(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - out[3] = a[3] * b; - return out; -} -/** - * Adds two vec4's after scaling the second operand by a scalar value - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec4} out - */ - -function scaleAndAdd(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - out[3] = a[3] + b[3] * scale; - return out; -} -/** - * Calculates the euclidian distance between two vec4's - * - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {Number} distance between a and b - */ - -function distance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return Math.hypot(x, y, z, w); -} -/** - * Calculates the squared euclidian distance between two vec4's - * - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {Number} squared distance between a and b - */ - -function squaredDistance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; -} -/** - * Calculates the length of a vec4 - * - * @param {ReadonlyVec4} a vector to calculate length of - * @returns {Number} length of a - */ - -function length(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return Math.hypot(x, y, z, w); -} -/** - * Calculates the squared length of a vec4 - * - * @param {ReadonlyVec4} a vector to calculate squared length of - * @returns {Number} squared length of a - */ - -function squaredLength(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return x * x + y * y + z * z + w * w; -} -/** - * Negates the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to negate - * @returns {vec4} out - */ - -function negate(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = -a[3]; - return out; -} -/** - * Returns the inverse of the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to invert - * @returns {vec4} out - */ - -function inverse(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - out[2] = 1.0 / a[2]; - out[3] = 1.0 / a[3]; - return out; -} -/** - * Normalize a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to normalize - * @returns {vec4} out - */ - -function normalize(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - var len = x * x + y * y + z * z + w * w; - - if (len > 0) { - len = 1 / Math.sqrt(len); - } - - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; - return out; -} -/** - * Calculates the dot product of two vec4's - * - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {Number} dot product of a and b - */ - -function dot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} -/** - * Returns the cross-product of three vectors in a 4-dimensional space - * - * @param {ReadonlyVec4} result the receiving vector - * @param {ReadonlyVec4} U the first vector - * @param {ReadonlyVec4} V the second vector - * @param {ReadonlyVec4} W the third vector - * @returns {vec4} result - */ - -function cross(out, u, v, w) { - var A = v[0] * w[1] - v[1] * w[0], - B = v[0] * w[2] - v[2] * w[0], - C = v[0] * w[3] - v[3] * w[0], - D = v[1] * w[2] - v[2] * w[1], - E = v[1] * w[3] - v[3] * w[1], - F = v[2] * w[3] - v[3] * w[2]; - var G = u[0]; - var H = u[1]; - var I = u[2]; - var J = u[3]; - out[0] = H * F - I * E + J * D; - out[1] = -(G * F) + I * C - J * B; - out[2] = G * E - H * C + J * A; - out[3] = -(G * D) + H * B - I * A; - return out; -} -/** - * Performs a linear interpolation between two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec4} out - */ - -function lerp(out, a, b, t) { - var ax = a[0]; - var ay = a[1]; - var az = a[2]; - var aw = a[3]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - out[2] = az + t * (b[2] - az); - out[3] = aw + t * (b[3] - aw); - return out; -} -/** - * Generates a random vector with the given scale - * - * @param {vec4} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec4} out - */ - -function random(out, scale) { - scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a - // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646. - // http://projecteuclid.org/euclid.aoms/1177692644; - - var v1, v2, v3, v4; - var s1, s2; - - do { - v1 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; - v2 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; - s1 = v1 * v1 + v2 * v2; - } while (s1 >= 1); - - do { - v3 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; - v4 = _common_js__WEBPACK_IMPORTED_MODULE_0__.RANDOM() * 2 - 1; - s2 = v3 * v3 + v4 * v4; - } while (s2 >= 1); - - var d = Math.sqrt((1 - s1) / s2); - out[0] = scale * v1; - out[1] = scale * v2; - out[2] = scale * v3 * d; - out[3] = scale * v4 * d; - return out; -} -/** - * Transforms the vec4 with a mat4. - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the vector to transform - * @param {ReadonlyMat4} m matrix to transform with - * @returns {vec4} out - */ - -function transformMat4(out, a, m) { - var x = a[0], - y = a[1], - z = a[2], - w = a[3]; - out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; - out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; - out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; - out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; - return out; -} -/** - * Transforms the vec4 with a quat - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the vector to transform - * @param {ReadonlyQuat} q quaternion to transform with - * @returns {vec4} out - */ - -function transformQuat(out, a, q) { - var x = a[0], - y = a[1], - z = a[2]; - var qx = q[0], - qy = q[1], - qz = q[2], - qw = q[3]; // calculate quat * vec - - var ix = qw * x + qy * z - qz * y; - var iy = qw * y + qz * x - qx * z; - var iz = qw * z + qx * y - qy * x; - var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat - - out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; - out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; - out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; - out[3] = a[3]; - return out; -} -/** - * Set the components of a vec4 to zero - * - * @param {vec4} out the receiving vector - * @returns {vec4} out - */ - -function zero(out) { - out[0] = 0.0; - out[1] = 0.0; - out[2] = 0.0; - out[3] = 0.0; - return out; -} -/** - * Returns a string representation of a vector - * - * @param {ReadonlyVec4} a vector to represent as a string - * @returns {String} string representation of the vector - */ - -function str(a) { - return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; -} -/** - * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyVec4} a The first vector. - * @param {ReadonlyVec4} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ - -function exactEquals(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; -} -/** - * Returns whether or not the vectors have approximately the same elements in the same position. - * - * @param {ReadonlyVec4} a The first vector. - * @param {ReadonlyVec4} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ - -function equals(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _common_js__WEBPACK_IMPORTED_MODULE_0__.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); -} -/** - * Alias for {@link vec4.subtract} - * @function - */ - -var sub = subtract; -/** - * Alias for {@link vec4.multiply} - * @function - */ - -var mul = multiply; -/** - * Alias for {@link vec4.divide} - * @function - */ - -var div = divide; -/** - * Alias for {@link vec4.distance} - * @function - */ - -var dist = distance; -/** - * Alias for {@link vec4.squaredDistance} - * @function - */ - -var sqrDist = squaredDistance; -/** - * Alias for {@link vec4.length} - * @function - */ - -var len = length; -/** - * Alias for {@link vec4.squaredLength} - * @function - */ - -var sqrLen = squaredLength; -/** - * Perform some operation over an array of vec4s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ - -var forEach = function () { - var vec = create(); - return function (a, stride, offset, count, fn, arg) { - var i, l; - - if (!stride) { - stride = 4; - } - - if (!offset) { - offset = 0; - } - - if (count) { - l = Math.min(count * stride + offset, a.length); - } else { - l = a.length; - } - - for (i = offset; i < l; i += stride) { - vec[0] = a[i]; - vec[1] = a[i + 1]; - vec[2] = a[i + 2]; - vec[3] = a[i + 3]; - fn(vec, vec, arg); - a[i] = vec[0]; - a[i + 1] = vec[1]; - a[i + 2] = vec[2]; - a[i + 3] = vec[3]; - } - - return a; - }; -}(); - -/***/ }), - -/***/ "./node_modules/gl-quat/slerp.js": -/*!***************************************!*\ - !*** ./node_modules/gl-quat/slerp.js ***! - \***************************************/ -/***/ ((module) => { - -module.exports = slerp - -/** - * Performs a spherical linear interpolation between two quat - * - * @param {quat} out the receiving quaternion - * @param {quat} a the first operand - * @param {quat} b the second operand - * @param {Number} t interpolation amount between the two inputs - * @returns {quat} out - */ -function slerp (out, a, b, t) { - // benchmarks: - // http://jsperf.com/quaternion-slerp-implementations - - var ax = a[0], ay = a[1], az = a[2], aw = a[3], - bx = b[0], by = b[1], bz = b[2], bw = b[3] - - var omega, cosom, sinom, scale0, scale1 - - // calc cosine - cosom = ax * bx + ay * by + az * bz + aw * bw - // adjust signs (if necessary) - if (cosom < 0.0) { - cosom = -cosom - bx = -bx - by = -by - bz = -bz - bw = -bw - } - // calculate coefficients - if ((1.0 - cosom) > 0.000001) { - // standard case (slerp) - omega = Math.acos(cosom) - sinom = Math.sin(omega) - scale0 = Math.sin((1.0 - t) * omega) / sinom - scale1 = Math.sin(t * omega) / sinom - } else { - // "from" and "to" quaternions are very close - // ... so we can do a linear interpolation - scale0 = 1.0 - t - scale1 = t - } - // calculate final values - out[0] = scale0 * ax + scale1 * bx - out[1] = scale0 * ay + scale1 * by - out[2] = scale0 * az + scale1 * bz - out[3] = scale0 * aw + scale1 * bw - - return out -} - - -/***/ }), - -/***/ "./node_modules/gl-vec3/cross.js": -/*!***************************************!*\ - !*** ./node_modules/gl-vec3/cross.js ***! - \***************************************/ -/***/ ((module) => { - -module.exports = cross; - -/** - * Computes the cross product of two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {vec3} out - */ -function cross(out, a, b) { - var ax = a[0], ay = a[1], az = a[2], - bx = b[0], by = b[1], bz = b[2] - - out[0] = ay * bz - az * by - out[1] = az * bx - ax * bz - out[2] = ax * by - ay * bx - return out -} - -/***/ }), - -/***/ "./node_modules/gl-vec3/dot.js": -/*!*************************************!*\ - !*** ./node_modules/gl-vec3/dot.js ***! - \*************************************/ -/***/ ((module) => { - -module.exports = dot; - -/** - * Calculates the dot product of two vec3's - * - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @returns {Number} dot product of a and b - */ -function dot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] -} - -/***/ }), - -/***/ "./node_modules/gl-vec3/length.js": -/*!****************************************!*\ - !*** ./node_modules/gl-vec3/length.js ***! - \****************************************/ -/***/ ((module) => { - -module.exports = length; - -/** - * Calculates the length of a vec3 - * - * @param {vec3} a vector to calculate length of - * @returns {Number} length of a - */ -function length(a) { - var x = a[0], - y = a[1], - z = a[2] - return Math.sqrt(x*x + y*y + z*z) -} - -/***/ }), - -/***/ "./node_modules/gl-vec3/lerp.js": -/*!**************************************!*\ - !*** ./node_modules/gl-vec3/lerp.js ***! - \**************************************/ -/***/ ((module) => { - -module.exports = lerp; - -/** - * Performs a linear interpolation between two vec3's - * - * @param {vec3} out the receiving vector - * @param {vec3} a the first operand - * @param {vec3} b the second operand - * @param {Number} t interpolation amount between the two inputs - * @returns {vec3} out - */ -function lerp(out, a, b, t) { - var ax = a[0], - ay = a[1], - az = a[2] - out[0] = ax + t * (b[0] - ax) - out[1] = ay + t * (b[1] - ay) - out[2] = az + t * (b[2] - az) - return out -} - -/***/ }), - -/***/ "./node_modules/gl-vec3/normalize.js": -/*!*******************************************!*\ - !*** ./node_modules/gl-vec3/normalize.js ***! - \*******************************************/ -/***/ ((module) => { - -module.exports = normalize; - -/** - * Normalize a vec3 - * - * @param {vec3} out the receiving vector - * @param {vec3} a vector to normalize - * @returns {vec3} out - */ -function normalize(out, a) { - var x = a[0], - y = a[1], - z = a[2] - var len = x*x + y*y + z*z - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len) - out[0] = a[0] * len - out[1] = a[1] * len - out[2] = a[2] * len - } - return out -} - -/***/ }), - -/***/ "./node_modules/has-passive-events/index.js": -/*!**************************************************!*\ - !*** ./node_modules/has-passive-events/index.js ***! - \**************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isBrowser = __webpack_require__(/*! is-browser */ "./node_modules/is-browser/client.js") - -function detect() { - var supported = false - - try { - var opts = Object.defineProperty({}, 'passive', { - get: function() { - supported = true - } - }) - - window.addEventListener('test', null, opts) - window.removeEventListener('test', null, opts) - } catch(e) { - supported = false - } - - return supported -} - -module.exports = isBrowser && detect() - - -/***/ }), - -/***/ "./node_modules/is-browser/client.js": -/*!*******************************************!*\ - !*** ./node_modules/is-browser/client.js ***! - \*******************************************/ -/***/ ((module) => { - -module.exports = true; - -/***/ }), - -/***/ "./node_modules/mat4-decompose/index.js": -/*!**********************************************!*\ - !*** ./node_modules/mat4-decompose/index.js ***! - \**********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/*jshint unused:true*/ -/* -Input: matrix ; a 4x4 matrix -Output: translation ; a 3 component vector - scale ; a 3 component vector - skew ; skew factors XY,XZ,YZ represented as a 3 component vector - perspective ; a 4 component vector - quaternion ; a 4 component vector -Returns false if the matrix cannot be decomposed, true if it can - - -References: -https://github.com/kamicane/matrix3d/blob/master/lib/Matrix3d.js -https://github.com/ChromiumWebApps/chromium/blob/master/ui/gfx/transform_util.cc -http://www.w3.org/TR/css3-transforms/#decomposing-a-3d-matrix -*/ - -var normalize = __webpack_require__(/*! ./normalize */ "./node_modules/mat4-decompose/normalize.js") - -var create = __webpack_require__(/*! gl-mat4/create */ "./node_modules/gl-mat4/create.js") -var clone = __webpack_require__(/*! gl-mat4/clone */ "./node_modules/gl-mat4/clone.js") -var determinant = __webpack_require__(/*! gl-mat4/determinant */ "./node_modules/gl-mat4/determinant.js") -var invert = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") -var transpose = __webpack_require__(/*! gl-mat4/transpose */ "./node_modules/gl-mat4/transpose.js") -var vec3 = { - length: __webpack_require__(/*! gl-vec3/length */ "./node_modules/gl-vec3/length.js"), - normalize: __webpack_require__(/*! gl-vec3/normalize */ "./node_modules/gl-vec3/normalize.js"), - dot: __webpack_require__(/*! gl-vec3/dot */ "./node_modules/gl-vec3/dot.js"), - cross: __webpack_require__(/*! gl-vec3/cross */ "./node_modules/gl-vec3/cross.js") -} - -var tmp = create() -var perspectiveMatrix = create() -var tmpVec4 = [0, 0, 0, 0] -var row = [ [0,0,0], [0,0,0], [0,0,0] ] -var pdum3 = [0,0,0] - -module.exports = function decomposeMat4(matrix, translation, scale, skew, perspective, quaternion) { - if (!translation) translation = [0,0,0] - if (!scale) scale = [0,0,0] - if (!skew) skew = [0,0,0] - if (!perspective) perspective = [0,0,0,1] - if (!quaternion) quaternion = [0,0,0,1] - - //normalize, if not possible then bail out early - if (!normalize(tmp, matrix)) - return false - - // perspectiveMatrix is used to solve for perspective, but it also provides - // an easy way to test for singularity of the upper 3x3 component. - clone(perspectiveMatrix, tmp) - - perspectiveMatrix[3] = 0 - perspectiveMatrix[7] = 0 - perspectiveMatrix[11] = 0 - perspectiveMatrix[15] = 1 - - // If the perspectiveMatrix is not invertible, we are also unable to - // decompose, so we'll bail early. Constant taken from SkMatrix44::invert. - if (Math.abs(determinant(perspectiveMatrix) < 1e-8)) - return false - - var a03 = tmp[3], a13 = tmp[7], a23 = tmp[11], - a30 = tmp[12], a31 = tmp[13], a32 = tmp[14], a33 = tmp[15] - - // First, isolate perspective. - if (a03 !== 0 || a13 !== 0 || a23 !== 0) { - tmpVec4[0] = a03 - tmpVec4[1] = a13 - tmpVec4[2] = a23 - tmpVec4[3] = a33 - - // Solve the equation by inverting perspectiveMatrix and multiplying - // rightHandSide by the inverse. - // resuing the perspectiveMatrix here since it's no longer needed - var ret = invert(perspectiveMatrix, perspectiveMatrix) - if (!ret) return false - transpose(perspectiveMatrix, perspectiveMatrix) - - //multiply by transposed inverse perspective matrix, into perspective vec4 - vec4multMat4(perspective, tmpVec4, perspectiveMatrix) - } else { - //no perspective - perspective[0] = perspective[1] = perspective[2] = 0 - perspective[3] = 1 - } - - // Next take care of translation - translation[0] = a30 - translation[1] = a31 - translation[2] = a32 - - // Now get scale and shear. 'row' is a 3 element array of 3 component vectors - mat3from4(row, tmp) - - // Compute X scale factor and normalize first row. - scale[0] = vec3.length(row[0]) - vec3.normalize(row[0], row[0]) - - // Compute XY shear factor and make 2nd row orthogonal to 1st. - skew[0] = vec3.dot(row[0], row[1]) - combine(row[1], row[1], row[0], 1.0, -skew[0]) - - // Now, compute Y scale and normalize 2nd row. - scale[1] = vec3.length(row[1]) - vec3.normalize(row[1], row[1]) - skew[0] /= scale[1] - - // Compute XZ and YZ shears, orthogonalize 3rd row - skew[1] = vec3.dot(row[0], row[2]) - combine(row[2], row[2], row[0], 1.0, -skew[1]) - skew[2] = vec3.dot(row[1], row[2]) - combine(row[2], row[2], row[1], 1.0, -skew[2]) - - // Next, get Z scale and normalize 3rd row. - scale[2] = vec3.length(row[2]) - vec3.normalize(row[2], row[2]) - skew[1] /= scale[2] - skew[2] /= scale[2] - - - // At this point, the matrix (in rows) is orthonormal. - // Check for a coordinate system flip. If the determinant - // is -1, then negate the matrix and the scaling factors. - vec3.cross(pdum3, row[1], row[2]) - if (vec3.dot(row[0], pdum3) < 0) { - for (var i = 0; i < 3; i++) { - scale[i] *= -1; - row[i][0] *= -1 - row[i][1] *= -1 - row[i][2] *= -1 - } - } - - // Now, get the rotations out - quaternion[0] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] - row[1][1] - row[2][2], 0)) - quaternion[1] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] + row[1][1] - row[2][2], 0)) - quaternion[2] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] - row[1][1] + row[2][2], 0)) - quaternion[3] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] + row[1][1] + row[2][2], 0)) - - if (row[2][1] > row[1][2]) - quaternion[0] = -quaternion[0] - if (row[0][2] > row[2][0]) - quaternion[1] = -quaternion[1] - if (row[1][0] > row[0][1]) - quaternion[2] = -quaternion[2] - return true -} - -//will be replaced by gl-vec4 eventually -function vec4multMat4(out, a, m) { - var x = a[0], y = a[1], z = a[2], w = a[3]; - out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; - out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; - out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; - out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; - return out; -} - -//gets upper-left of a 4x4 matrix into a 3x3 of vectors -function mat3from4(out, mat4x4) { - out[0][0] = mat4x4[0] - out[0][1] = mat4x4[1] - out[0][2] = mat4x4[2] - - out[1][0] = mat4x4[4] - out[1][1] = mat4x4[5] - out[1][2] = mat4x4[6] - - out[2][0] = mat4x4[8] - out[2][1] = mat4x4[9] - out[2][2] = mat4x4[10] -} - -function combine(out, a, b, scale1, scale2) { - out[0] = a[0] * scale1 + b[0] * scale2 - out[1] = a[1] * scale1 + b[1] * scale2 - out[2] = a[2] * scale1 + b[2] * scale2 -} - -/***/ }), - -/***/ "./node_modules/mat4-decompose/normalize.js": -/*!**************************************************!*\ - !*** ./node_modules/mat4-decompose/normalize.js ***! - \**************************************************/ -/***/ ((module) => { - -module.exports = function normalize(out, mat) { - var m44 = mat[15] - // Cannot normalize. - if (m44 === 0) - return false - var scale = 1 / m44 - for (var i=0; i<16; i++) - out[i] = mat[i] * scale - return true -} - -/***/ }), - -/***/ "./node_modules/mat4-interpolate/index.js": -/*!************************************************!*\ - !*** ./node_modules/mat4-interpolate/index.js ***! - \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var lerp = __webpack_require__(/*! gl-vec3/lerp */ "./node_modules/gl-vec3/lerp.js") - -var recompose = __webpack_require__(/*! mat4-recompose */ "./node_modules/mat4-recompose/index.js") -var decompose = __webpack_require__(/*! mat4-decompose */ "./node_modules/mat4-decompose/index.js") -var determinant = __webpack_require__(/*! gl-mat4/determinant */ "./node_modules/gl-mat4/determinant.js") -var slerp = __webpack_require__(/*! quat-slerp */ "./node_modules/quat-slerp/index.js") - -var state0 = state() -var state1 = state() -var tmp = state() - -module.exports = interpolate -function interpolate(out, start, end, alpha) { - if (determinant(start) === 0 || determinant(end) === 0) - return false - - //decompose the start and end matrices into individual components - var r0 = decompose(start, state0.translate, state0.scale, state0.skew, state0.perspective, state0.quaternion) - var r1 = decompose(end, state1.translate, state1.scale, state1.skew, state1.perspective, state1.quaternion) - if (!r0 || !r1) - return false - - - //now lerp/slerp the start and end components into a temporary lerp(tmptranslate, state0.translate, state1.translate, alpha) - lerp(tmp.translate, state0.translate, state1.translate, alpha) - lerp(tmp.skew, state0.skew, state1.skew, alpha) - lerp(tmp.scale, state0.scale, state1.scale, alpha) - lerp(tmp.perspective, state0.perspective, state1.perspective, alpha) - slerp(tmp.quaternion, state0.quaternion, state1.quaternion, alpha) - - //and recompose into our 'out' matrix - recompose(out, tmp.translate, tmp.scale, tmp.skew, tmp.perspective, tmp.quaternion) - return true -} - -function state() { - return { - translate: vec3(), - scale: vec3(1), - skew: vec3(), - perspective: vec4(), - quaternion: vec4() - } -} - -function vec3(n) { - return [n||0,n||0,n||0] -} - -function vec4() { - return [0,0,0,1] -} - -/***/ }), - -/***/ "./node_modules/mat4-recompose/index.js": -/*!**********************************************!*\ - !*** ./node_modules/mat4-recompose/index.js ***! - \**********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -/* -Input: translation ; a 3 component vector - scale ; a 3 component vector - skew ; skew factors XY,XZ,YZ represented as a 3 component vector - perspective ; a 4 component vector - quaternion ; a 4 component vector -Output: matrix ; a 4x4 matrix - -From: http://www.w3.org/TR/css3-transforms/#recomposing-to-a-3d-matrix -*/ - -var mat4 = { - identity: __webpack_require__(/*! gl-mat4/identity */ "./node_modules/gl-mat4/identity.js"), - translate: __webpack_require__(/*! gl-mat4/translate */ "./node_modules/gl-mat4/translate.js"), - multiply: __webpack_require__(/*! gl-mat4/multiply */ "./node_modules/gl-mat4/multiply.js"), - create: __webpack_require__(/*! gl-mat4/create */ "./node_modules/gl-mat4/create.js"), - scale: __webpack_require__(/*! gl-mat4/scale */ "./node_modules/gl-mat4/scale.js"), - fromRotationTranslation: __webpack_require__(/*! gl-mat4/fromRotationTranslation */ "./node_modules/gl-mat4/fromRotationTranslation.js") -} - -var rotationMatrix = mat4.create() -var temp = mat4.create() - -module.exports = function recomposeMat4(matrix, translation, scale, skew, perspective, quaternion) { - mat4.identity(matrix) - - //apply translation & rotation - mat4.fromRotationTranslation(matrix, quaternion, translation) - - //apply perspective - matrix[3] = perspective[0] - matrix[7] = perspective[1] - matrix[11] = perspective[2] - matrix[15] = perspective[3] - - // apply skew - // temp is a identity 4x4 matrix initially - mat4.identity(temp) - - if (skew[2] !== 0) { - temp[9] = skew[2] - mat4.multiply(matrix, matrix, temp) - } - - if (skew[1] !== 0) { - temp[9] = 0 - temp[8] = skew[1] - mat4.multiply(matrix, matrix, temp) - } - - if (skew[0] !== 0) { - temp[8] = 0 - temp[4] = skew[0] - mat4.multiply(matrix, matrix, temp) - } - - //apply scale - mat4.scale(matrix, matrix, scale) - return matrix -} - -/***/ }), - -/***/ "./node_modules/matrix-camera-controller/matrix.js": -/*!*********************************************************!*\ - !*** ./node_modules/matrix-camera-controller/matrix.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var bsearch = __webpack_require__(/*! binary-search-bounds */ "./node_modules/binary-search-bounds/search-bounds.js") -var m4interp = __webpack_require__(/*! mat4-interpolate */ "./node_modules/mat4-interpolate/index.js") -var invert44 = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") -var rotateX = __webpack_require__(/*! gl-mat4/rotateX */ "./node_modules/gl-mat4/rotateX.js") -var rotateY = __webpack_require__(/*! gl-mat4/rotateY */ "./node_modules/gl-mat4/rotateY.js") -var rotateZ = __webpack_require__(/*! gl-mat4/rotateZ */ "./node_modules/gl-mat4/rotateZ.js") -var lookAt = __webpack_require__(/*! gl-mat4/lookAt */ "./node_modules/gl-mat4/lookAt.js") -var translate = __webpack_require__(/*! gl-mat4/translate */ "./node_modules/gl-mat4/translate.js") -var scale = __webpack_require__(/*! gl-mat4/scale */ "./node_modules/gl-mat4/scale.js") -var normalize = __webpack_require__(/*! gl-vec3/normalize */ "./node_modules/gl-vec3/normalize.js") - -var DEFAULT_CENTER = [0,0,0] - -module.exports = createMatrixCameraController - -function MatrixCameraController(initialMatrix) { - this._components = initialMatrix.slice() - this._time = [0] - this.prevMatrix = initialMatrix.slice() - this.nextMatrix = initialMatrix.slice() - this.computedMatrix = initialMatrix.slice() - this.computedInverse = initialMatrix.slice() - this.computedEye = [0,0,0] - this.computedUp = [0,0,0] - this.computedCenter = [0,0,0] - this.computedRadius = [0] - this._limits = [-Infinity, Infinity] -} - -var proto = MatrixCameraController.prototype - -proto.recalcMatrix = function(t) { - var time = this._time - var tidx = bsearch.le(time, t) - var mat = this.computedMatrix - if(tidx < 0) { - return - } - var comps = this._components - if(tidx === time.length-1) { - var ptr = 16*tidx - for(var i=0; i<16; ++i) { - mat[i] = comps[ptr++] - } - } else { - var dt = (time[tidx+1] - time[tidx]) - var ptr = 16*tidx - var prev = this.prevMatrix - var allEqual = true - for(var i=0; i<16; ++i) { - prev[i] = comps[ptr++] - } - var next = this.nextMatrix - for(var i=0; i<16; ++i) { - next[i] = comps[ptr++] - allEqual = allEqual && (prev[i] === next[i]) - } - if(dt < 1e-6 || allEqual) { - for(var i=0; i<16; ++i) { - mat[i] = prev[i] - } - } else { - m4interp(mat, prev, next, (t - time[tidx])/dt) - } - } - - var up = this.computedUp - up[0] = mat[1] - up[1] = mat[5] - up[2] = mat[9] - normalize(up, up) - - var imat = this.computedInverse - invert44(imat, mat) - var eye = this.computedEye - var w = imat[15] - eye[0] = imat[12]/w - eye[1] = imat[13]/w - eye[2] = imat[14]/w - - var center = this.computedCenter - var radius = Math.exp(this.computedRadius[0]) - for(var i=0; i<3; ++i) { - center[i] = eye[i] - mat[2+4*i] * radius - } -} - -proto.idle = function(t) { - if(t < this.lastT()) { - return - } - var mc = this._components - var ptr = mc.length-16 - for(var i=0; i<16; ++i) { - mc.push(mc[ptr++]) - } - this._time.push(t) -} - -proto.flush = function(t) { - var idx = bsearch.gt(this._time, t) - 2 - if(idx < 0) { - return - } - this._time.splice(0, idx) - this._components.splice(0, 16*idx) -} - -proto.lastT = function() { - return this._time[this._time.length-1] -} - -proto.lookAt = function(t, eye, center, up) { - this.recalcMatrix(t) - eye = eye || this.computedEye - center = center || DEFAULT_CENTER - up = up || this.computedUp - this.setMatrix(t, lookAt(this.computedMatrix, eye, center, up)) - var d2 = 0.0 - for(var i=0; i<3; ++i) { - d2 += Math.pow(center[i] - eye[i], 2) - } - d2 = Math.log(Math.sqrt(d2)) - this.computedRadius[0] = d2 -} - -proto.rotate = function(t, yaw, pitch, roll) { - this.recalcMatrix(t) - var mat = this.computedInverse - if(yaw) rotateY(mat, mat, yaw) - if(pitch) rotateX(mat, mat, pitch) - if(roll) rotateZ(mat, mat, roll) - this.setMatrix(t, invert44(this.computedMatrix, mat)) -} - -var tvec = [0,0,0] - -proto.pan = function(t, dx, dy, dz) { - tvec[0] = -(dx || 0.0) - tvec[1] = -(dy || 0.0) - tvec[2] = -(dz || 0.0) - this.recalcMatrix(t) - var mat = this.computedInverse - translate(mat, mat, tvec) - this.setMatrix(t, invert44(mat, mat)) -} - -proto.translate = function(t, dx, dy, dz) { - tvec[0] = dx || 0.0 - tvec[1] = dy || 0.0 - tvec[2] = dz || 0.0 - this.recalcMatrix(t) - var mat = this.computedMatrix - translate(mat, mat, tvec) - this.setMatrix(t, mat) -} - -proto.setMatrix = function(t, mat) { - if(t < this.lastT()) { - return - } - this._time.push(t) - for(var i=0; i<16; ++i) { - this._components.push(mat[i]) - } -} - -proto.setDistance = function(t, d) { - this.computedRadius[0] = d -} - -proto.setDistanceLimits = function(a,b) { - var lim = this._limits - lim[0] = a - lim[1] = b -} - -proto.getDistanceLimits = function(out) { - var lim = this._limits - if(out) { - out[0] = lim[0] - out[1] = lim[1] - return out - } - return lim -} - -function createMatrixCameraController(options) { - options = options || {} - var matrix = options.matrix || - [1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1] - return new MatrixCameraController(matrix) -} - - -/***/ }), - -/***/ "./node_modules/mouse-change/mouse-listen.js": -/*!***************************************************!*\ - !*** ./node_modules/mouse-change/mouse-listen.js ***! - \***************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = mouseListen - -var mouse = __webpack_require__(/*! mouse-event */ "./node_modules/mouse-event/mouse.js") - -function mouseListen (element, callback) { - if (!callback) { - callback = element - element = window - } - - var buttonState = 0 - var x = 0 - var y = 0 - var mods = { - shift: false, - alt: false, - control: false, - meta: false - } - var attached = false - - function updateMods (ev) { - var changed = false - if ('altKey' in ev) { - changed = changed || ev.altKey !== mods.alt - mods.alt = !!ev.altKey - } - if ('shiftKey' in ev) { - changed = changed || ev.shiftKey !== mods.shift - mods.shift = !!ev.shiftKey - } - if ('ctrlKey' in ev) { - changed = changed || ev.ctrlKey !== mods.control - mods.control = !!ev.ctrlKey - } - if ('metaKey' in ev) { - changed = changed || ev.metaKey !== mods.meta - mods.meta = !!ev.metaKey - } - return changed - } - - function handleEvent (nextButtons, ev) { - var nextX = mouse.x(ev) - var nextY = mouse.y(ev) - if ('buttons' in ev) { - nextButtons = ev.buttons | 0 - } - if (nextButtons !== buttonState || - nextX !== x || - nextY !== y || - updateMods(ev)) { - buttonState = nextButtons | 0 - x = nextX || 0 - y = nextY || 0 - callback && callback(buttonState, x, y, mods) - } - } - - function clearState (ev) { - handleEvent(0, ev) - } - - function handleBlur () { - if (buttonState || - x || - y || - mods.shift || - mods.alt || - mods.meta || - mods.control) { - x = y = 0 - buttonState = 0 - mods.shift = mods.alt = mods.control = mods.meta = false - callback && callback(0, 0, 0, mods) - } - } - - function handleMods (ev) { - if (updateMods(ev)) { - callback && callback(buttonState, x, y, mods) - } - } - - function handleMouseMove (ev) { - if (mouse.buttons(ev) === 0) { - handleEvent(0, ev) - } else { - handleEvent(buttonState, ev) - } - } - - function handleMouseDown (ev) { - handleEvent(buttonState | mouse.buttons(ev), ev) - } - - function handleMouseUp (ev) { - handleEvent(buttonState & ~mouse.buttons(ev), ev) - } - - function attachListeners () { - if (attached) { - return - } - attached = true - - element.addEventListener('mousemove', handleMouseMove) - - element.addEventListener('mousedown', handleMouseDown) - - element.addEventListener('mouseup', handleMouseUp) - - element.addEventListener('mouseleave', clearState) - element.addEventListener('mouseenter', clearState) - element.addEventListener('mouseout', clearState) - element.addEventListener('mouseover', clearState) - - element.addEventListener('blur', handleBlur) - - element.addEventListener('keyup', handleMods) - element.addEventListener('keydown', handleMods) - element.addEventListener('keypress', handleMods) - - if (element !== window) { - window.addEventListener('blur', handleBlur) - - window.addEventListener('keyup', handleMods) - window.addEventListener('keydown', handleMods) - window.addEventListener('keypress', handleMods) - } - } - - function detachListeners () { - if (!attached) { - return - } - attached = false - - element.removeEventListener('mousemove', handleMouseMove) - - element.removeEventListener('mousedown', handleMouseDown) - - element.removeEventListener('mouseup', handleMouseUp) - - element.removeEventListener('mouseleave', clearState) - element.removeEventListener('mouseenter', clearState) - element.removeEventListener('mouseout', clearState) - element.removeEventListener('mouseover', clearState) - - element.removeEventListener('blur', handleBlur) - - element.removeEventListener('keyup', handleMods) - element.removeEventListener('keydown', handleMods) - element.removeEventListener('keypress', handleMods) - - if (element !== window) { - window.removeEventListener('blur', handleBlur) - - window.removeEventListener('keyup', handleMods) - window.removeEventListener('keydown', handleMods) - window.removeEventListener('keypress', handleMods) - } - } - - // Attach listeners - attachListeners() - - var result = { - element: element - } - - Object.defineProperties(result, { - enabled: { - get: function () { return attached }, - set: function (f) { - if (f) { - attachListeners() - } else { - detachListeners() - } - }, - enumerable: true - }, - buttons: { - get: function () { return buttonState }, - enumerable: true - }, - x: { - get: function () { return x }, - enumerable: true - }, - y: { - get: function () { return y }, - enumerable: true - }, - mods: { - get: function () { return mods }, - enumerable: true - } - }) - - return result -} - - -/***/ }), - -/***/ "./node_modules/mouse-event-offset/index.js": -/*!**************************************************!*\ - !*** ./node_modules/mouse-event-offset/index.js ***! - \**************************************************/ -/***/ ((module) => { - -var rootPosition = { left: 0, top: 0 } - -module.exports = mouseEventOffset -function mouseEventOffset (ev, target, out) { - target = target || ev.currentTarget || ev.srcElement - if (!Array.isArray(out)) { - out = [ 0, 0 ] - } - var cx = ev.clientX || 0 - var cy = ev.clientY || 0 - var rect = getBoundingClientOffset(target) - out[0] = cx - rect.left - out[1] = cy - rect.top - return out -} - -function getBoundingClientOffset (element) { - if (element === window || - element === document || - element === document.body) { - return rootPosition - } else { - return element.getBoundingClientRect() - } -} - - -/***/ }), - -/***/ "./node_modules/mouse-event/mouse.js": -/*!*******************************************!*\ - !*** ./node_modules/mouse-event/mouse.js ***! - \*******************************************/ -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -function mouseButtons(ev) { - if(typeof ev === 'object') { - if('buttons' in ev) { - return ev.buttons - } else if('which' in ev) { - var b = ev.which - if(b === 2) { - return 4 - } else if(b === 3) { - return 2 - } else if(b > 0) { - return 1<<(b-1) - } - } else if('button' in ev) { - var b = ev.button - if(b === 1) { - return 4 - } else if(b === 2) { - return 2 - } else if(b >= 0) { - return 1< { - -"use strict"; - - -var toPX = __webpack_require__(/*! to-px */ "./node_modules/to-px/browser.js") - -module.exports = mouseWheelListen - -function mouseWheelListen(element, callback, noScroll) { - if(typeof element === 'function') { - noScroll = !!callback - callback = element - element = window - } - var lineHeight = toPX('ex', element) - var listener = function(ev) { - if(noScroll) { - ev.preventDefault() - } - var dx = ev.deltaX || 0 - var dy = ev.deltaY || 0 - var dz = ev.deltaZ || 0 - var mode = ev.deltaMode - var scale = 1 - switch(mode) { - case 1: - scale = lineHeight - break - case 2: - scale = window.innerHeight - break - } - dx *= scale - dy *= scale - dz *= scale - if(dx || dy || dz) { - return callback(dx, dy, dz, ev) - } - } - element.addEventListener('wheel', listener) - return listener -} - - -/***/ }), - -/***/ "./node_modules/orbit-camera-controller/lib/quatFromFrame.js": -/*!*******************************************************************!*\ - !*** ./node_modules/orbit-camera-controller/lib/quatFromFrame.js ***! - \*******************************************************************/ -/***/ ((module) => { - -"use strict"; - - -module.exports = quatFromFrame - -function quatFromFrame( - out, - rx, ry, rz, - ux, uy, uz, - fx, fy, fz) { - var tr = rx + uy + fz - if(l > 0) { - var l = Math.sqrt(tr + 1.0) - out[0] = 0.5 * (uz - fy) / l - out[1] = 0.5 * (fx - rz) / l - out[2] = 0.5 * (ry - uy) / l - out[3] = 0.5 * l - } else { - var tf = Math.max(rx, uy, fz) - var l = Math.sqrt(2 * tf - tr + 1.0) - if(rx >= tf) { - //x y z order - out[0] = 0.5 * l - out[1] = 0.5 * (ux + ry) / l - out[2] = 0.5 * (fx + rz) / l - out[3] = 0.5 * (uz - fy) / l - } else if(uy >= tf) { - //y z x order - out[0] = 0.5 * (ry + ux) / l - out[1] = 0.5 * l - out[2] = 0.5 * (fy + uz) / l - out[3] = 0.5 * (fx - rz) / l - } else { - //z x y order - out[0] = 0.5 * (rz + fx) / l - out[1] = 0.5 * (uz + fy) / l - out[2] = 0.5 * l - out[3] = 0.5 * (ry - ux) / l - } - } - return out -} - -/***/ }), - -/***/ "./node_modules/orbit-camera-controller/orbit.js": -/*!*******************************************************!*\ - !*** ./node_modules/orbit-camera-controller/orbit.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = createOrbitController - -var filterVector = __webpack_require__(/*! filtered-vector */ "./node_modules/filtered-vector/fvec.js") -var lookAt = __webpack_require__(/*! gl-mat4/lookAt */ "./node_modules/gl-mat4/lookAt.js") -var mat4FromQuat = __webpack_require__(/*! gl-mat4/fromQuat */ "./node_modules/gl-mat4/fromQuat.js") -var invert44 = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") -var quatFromFrame = __webpack_require__(/*! ./lib/quatFromFrame */ "./node_modules/orbit-camera-controller/lib/quatFromFrame.js") - -function len3(x,y,z) { - return Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2)) -} - -function len4(w,x,y,z) { - return Math.sqrt(Math.pow(w,2) + Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2)) -} - -function normalize4(out, a) { - var ax = a[0] - var ay = a[1] - var az = a[2] - var aw = a[3] - var al = len4(ax, ay, az, aw) - if(al > 1e-6) { - out[0] = ax/al - out[1] = ay/al - out[2] = az/al - out[3] = aw/al - } else { - out[0] = out[1] = out[2] = 0.0 - out[3] = 1.0 - } -} - -function OrbitCameraController(initQuat, initCenter, initRadius) { - this.radius = filterVector([initRadius]) - this.center = filterVector(initCenter) - this.rotation = filterVector(initQuat) - - this.computedRadius = this.radius.curve(0) - this.computedCenter = this.center.curve(0) - this.computedRotation = this.rotation.curve(0) - this.computedUp = [0.1,0,0] - this.computedEye = [0.1,0,0] - this.computedMatrix = [0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - - this.recalcMatrix(0) -} - -var proto = OrbitCameraController.prototype - -proto.lastT = function() { - return Math.max( - this.radius.lastT(), - this.center.lastT(), - this.rotation.lastT()) -} - -proto.recalcMatrix = function(t) { - this.radius.curve(t) - this.center.curve(t) - this.rotation.curve(t) - - var quat = this.computedRotation - normalize4(quat, quat) - - var mat = this.computedMatrix - mat4FromQuat(mat, quat) - - var center = this.computedCenter - var eye = this.computedEye - var up = this.computedUp - var radius = Math.exp(this.computedRadius[0]) - - eye[0] = center[0] + radius * mat[2] - eye[1] = center[1] + radius * mat[6] - eye[2] = center[2] + radius * mat[10] - up[0] = mat[1] - up[1] = mat[5] - up[2] = mat[9] - - for(var i=0; i<3; ++i) { - var rr = 0.0 - for(var j=0; j<3; ++j) { - rr += mat[i+4*j] * eye[j] - } - mat[12+i] = -rr - } -} - -proto.getMatrix = function(t, result) { - this.recalcMatrix(t) - var m = this.computedMatrix - if(result) { - for(var i=0; i<16; ++i) { - result[i] = m[i] - } - return result - } - return m -} - -proto.idle = function(t) { - this.center.idle(t) - this.radius.idle(t) - this.rotation.idle(t) -} - -proto.flush = function(t) { - this.center.flush(t) - this.radius.flush(t) - this.rotation.flush(t) -} - -proto.pan = function(t, dx, dy, dz) { - dx = dx || 0.0 - dy = dy || 0.0 - dz = dz || 0.0 - - this.recalcMatrix(t) - var mat = this.computedMatrix - - var ux = mat[1] - var uy = mat[5] - var uz = mat[9] - var ul = len3(ux, uy, uz) - ux /= ul - uy /= ul - uz /= ul - - var rx = mat[0] - var ry = mat[4] - var rz = mat[8] - var ru = rx * ux + ry * uy + rz * uz - rx -= ux * ru - ry -= uy * ru - rz -= uz * ru - var rl = len3(rx, ry, rz) - rx /= rl - ry /= rl - rz /= rl - - var fx = mat[2] - var fy = mat[6] - var fz = mat[10] - var fu = fx * ux + fy * uy + fz * uz - var fr = fx * rx + fy * ry + fz * rz - fx -= fu * ux + fr * rx - fy -= fu * uy + fr * ry - fz -= fu * uz + fr * rz - var fl = len3(fx, fy, fz) - fx /= fl - fy /= fl - fz /= fl - - var vx = rx * dx + ux * dy - var vy = ry * dx + uy * dy - var vz = rz * dx + uz * dy - - this.center.move(t, vx, vy, vz) - - //Update z-component of radius - var radius = Math.exp(this.computedRadius[0]) - radius = Math.max(1e-4, radius + dz) - this.radius.set(t, Math.log(radius)) -} - -proto.rotate = function(t, dx, dy, dz) { - this.recalcMatrix(t) - - dx = dx||0.0 - dy = dy||0.0 - - var mat = this.computedMatrix - - var rx = mat[0] - var ry = mat[4] - var rz = mat[8] - - var ux = mat[1] - var uy = mat[5] - var uz = mat[9] - - var fx = mat[2] - var fy = mat[6] - var fz = mat[10] - - var qx = dx * rx + dy * ux - var qy = dx * ry + dy * uy - var qz = dx * rz + dy * uz - - var bx = -(fy * qz - fz * qy) - var by = -(fz * qx - fx * qz) - var bz = -(fx * qy - fy * qx) - var bw = Math.sqrt(Math.max(0.0, 1.0 - Math.pow(bx,2) - Math.pow(by,2) - Math.pow(bz,2))) - var bl = len4(bx, by, bz, bw) - if(bl > 1e-6) { - bx /= bl - by /= bl - bz /= bl - bw /= bl - } else { - bx = by = bz = 0.0 - bw = 1.0 - } - - var rotation = this.computedRotation - var ax = rotation[0] - var ay = rotation[1] - var az = rotation[2] - var aw = rotation[3] - - var cx = ax*bw + aw*bx + ay*bz - az*by - var cy = ay*bw + aw*by + az*bx - ax*bz - var cz = az*bw + aw*bz + ax*by - ay*bx - var cw = aw*bw - ax*bx - ay*by - az*bz - - //Apply roll - if(dz) { - bx = fx - by = fy - bz = fz - var s = Math.sin(dz) / len3(bx, by, bz) - bx *= s - by *= s - bz *= s - bw = Math.cos(dx) - cx = cx*bw + cw*bx + cy*bz - cz*by - cy = cy*bw + cw*by + cz*bx - cx*bz - cz = cz*bw + cw*bz + cx*by - cy*bx - cw = cw*bw - cx*bx - cy*by - cz*bz - } - - var cl = len4(cx, cy, cz, cw) - if(cl > 1e-6) { - cx /= cl - cy /= cl - cz /= cl - cw /= cl - } else { - cx = cy = cz = 0.0 - cw = 1.0 - } - - this.rotation.set(t, cx, cy, cz, cw) -} - -proto.lookAt = function(t, eye, center, up) { - this.recalcMatrix(t) - - center = center || this.computedCenter - eye = eye || this.computedEye - up = up || this.computedUp - - var mat = this.computedMatrix - lookAt(mat, eye, center, up) - - var rotation = this.computedRotation - quatFromFrame(rotation, - mat[0], mat[1], mat[2], - mat[4], mat[5], mat[6], - mat[8], mat[9], mat[10]) - normalize4(rotation, rotation) - this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3]) - - var fl = 0.0 - for(var i=0; i<3; ++i) { - fl += Math.pow(center[i] - eye[i], 2) - } - this.radius.set(t, 0.5 * Math.log(Math.max(fl, 1e-6))) - - this.center.set(t, center[0], center[1], center[2]) -} - -proto.translate = function(t, dx, dy, dz) { - this.center.move(t, - dx||0.0, - dy||0.0, - dz||0.0) -} - -proto.setMatrix = function(t, matrix) { - - var rotation = this.computedRotation - quatFromFrame(rotation, - matrix[0], matrix[1], matrix[2], - matrix[4], matrix[5], matrix[6], - matrix[8], matrix[9], matrix[10]) - normalize4(rotation, rotation) - this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3]) - - var mat = this.computedMatrix - invert44(mat, matrix) - var w = mat[15] - if(Math.abs(w) > 1e-6) { - var cx = mat[12]/w - var cy = mat[13]/w - var cz = mat[14]/w - - this.recalcMatrix(t) - var r = Math.exp(this.computedRadius[0]) - this.center.set(t, cx-mat[2]*r, cy-mat[6]*r, cz-mat[10]*r) - this.radius.idle(t) - } else { - this.center.idle(t) - this.radius.idle(t) - } -} - -proto.setDistance = function(t, d) { - if(d > 0) { - this.radius.set(t, Math.log(d)) - } -} - -proto.setDistanceLimits = function(lo, hi) { - if(lo > 0) { - lo = Math.log(lo) - } else { - lo = -Infinity - } - if(hi > 0) { - hi = Math.log(hi) - } else { - hi = Infinity - } - hi = Math.max(hi, lo) - this.radius.bounds[0][0] = lo - this.radius.bounds[1][0] = hi -} - -proto.getDistanceLimits = function(out) { - var bounds = this.radius.bounds - if(out) { - out[0] = Math.exp(bounds[0][0]) - out[1] = Math.exp(bounds[1][0]) - return out - } - return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ] -} - -proto.toJSON = function() { - this.recalcMatrix(this.lastT()) - return { - center: this.computedCenter.slice(), - rotation: this.computedRotation.slice(), - distance: Math.log(this.computedRadius[0]), - zoomMin: this.radius.bounds[0][0], - zoomMax: this.radius.bounds[1][0] - } -} - -proto.fromJSON = function(options) { - var t = this.lastT() - var c = options.center - if(c) { - this.center.set(t, c[0], c[1], c[2]) - } - var r = options.rotation - if(r) { - this.rotation.set(t, r[0], r[1], r[2], r[3]) - } - var d = options.distance - if(d && d > 0) { - this.radius.set(t, Math.log(d)) - } - this.setDistanceLimits(options.zoomMin, options.zoomMax) -} - -function createOrbitController(options) { - options = options || {} - var center = options.center || [0,0,0] - var rotation = options.rotation || [0,0,0,1] - var radius = options.radius || 1.0 - - center = [].slice.call(center, 0, 3) - rotation = [].slice.call(rotation, 0, 4) - normalize4(rotation, rotation) - - var result = new OrbitCameraController( - rotation, - center, - Math.log(radius)) - - result.setDistanceLimits(options.zoomMin, options.zoomMax) - - if('eye' in options || 'up' in options) { - result.lookAt(0, options.eye, options.center, options.up) - } - - return result -} - -/***/ }), - -/***/ "./node_modules/parse-unit/index.js": -/*!******************************************!*\ - !*** ./node_modules/parse-unit/index.js ***! - \******************************************/ -/***/ ((module) => { - -module.exports = function parseUnit(str, out) { - if (!out) - out = [ 0, '' ] - - str = String(str) - var num = parseFloat(str, 10) - out[0] = num - out[1] = str.match(/[\d.\-\+]*\s*(.*)/)[1] || '' - return out -} - -/***/ }), - -/***/ "./node_modules/quat-slerp/index.js": -/*!******************************************!*\ - !*** ./node_modules/quat-slerp/index.js ***! - \******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = __webpack_require__(/*! gl-quat/slerp */ "./node_modules/gl-quat/slerp.js") - -/***/ }), - -/***/ "./node_modules/right-now/browser.js": -/*!*******************************************!*\ - !*** ./node_modules/right-now/browser.js ***! - \*******************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = - __webpack_require__.g.performance && - __webpack_require__.g.performance.now ? function now() { - return performance.now() - } : Date.now || function now() { - return +new Date - } - - -/***/ }), - -/***/ "./node_modules/stats-js/build/stats.min.js": -/*!**************************************************!*\ - !*** ./node_modules/stats-js/build/stats.min.js ***! - \**************************************************/ -/***/ (function(module) { - -!function(e,t){ true?module.exports=t():0}(this,function(){"use strict";var c=function(){var n=0,l=document.createElement("div");function e(e){return l.appendChild(e.dom),e}function t(e){for(var t=0;t { - -"use strict"; - - -var parseUnit = __webpack_require__(/*! parse-unit */ "./node_modules/parse-unit/index.js") - -module.exports = toPX - -var PIXELS_PER_INCH = getSizeBrutal('in', document.body) // 96 - - -function getPropertyInPX(element, prop) { - var parts = parseUnit(getComputedStyle(element).getPropertyValue(prop)) - return parts[0] * toPX(parts[1], element) -} - -//This brutal hack is needed -function getSizeBrutal(unit, element) { - var testDIV = document.createElement('div') - testDIV.style['height'] = '128' + unit - element.appendChild(testDIV) - var size = getPropertyInPX(testDIV, 'height') / 128 - element.removeChild(testDIV) - return size -} - -function toPX(str, element) { - if (!str) return null - - element = element || document.body - str = (str + '' || 'px').trim().toLowerCase() - if(element === window || element === document) { - element = document.body - } - - switch(str) { - case '%': //Ambiguous, not sure if we should use width or height - return element.clientHeight / 100.0 - case 'ch': - case 'ex': - return getSizeBrutal(str, element) - case 'em': - return getPropertyInPX(element, 'font-size') - case 'rem': - return getPropertyInPX(document.body, 'font-size') - case 'vw': - return window.innerWidth/100 - case 'vh': - return window.innerHeight/100 - case 'vmin': - return Math.min(window.innerWidth, window.innerHeight) / 100 - case 'vmax': - return Math.max(window.innerWidth, window.innerHeight) / 100 - case 'in': - return PIXELS_PER_INCH - case 'cm': - return PIXELS_PER_INCH / 2.54 - case 'mm': - return PIXELS_PER_INCH / 25.4 - case 'pt': - return PIXELS_PER_INCH / 72 - case 'pc': - return PIXELS_PER_INCH / 6 - case 'px': - return 1 - } - - // detect number of units - var parts = parseUnit(str) - if (!isNaN(parts[0]) && parts[1]) { - var px = toPX(parts[1], element) - return typeof px === 'number' ? parts[0] * px : null - } - - return null -} - - -/***/ }), - -/***/ "./src/Camera.ts": -/*!***********************!*\ - !*** ./src/Camera.ts ***! - \***********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/mat4.js"); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec3.js"); -var CameraControls = __webpack_require__(/*! 3d-view-controls */ "./node_modules/3d-view-controls/camera.js"); - -class Camera { - constructor(position, target) { - this.projectionMatrix = gl_matrix__WEBPACK_IMPORTED_MODULE_0__.create(); - this.viewMatrix = gl_matrix__WEBPACK_IMPORTED_MODULE_0__.create(); - this.fovy = 45; - this.aspectRatio = 1; - this.near = 0.1; - this.far = 1000; - this.position = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); - this.direction = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); - this.target = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); - this.up = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); - this.controls = CameraControls(document.getElementById('canvas'), { - eye: position, - center: target, - }); - gl_matrix__WEBPACK_IMPORTED_MODULE_1__.add(this.target, this.position, this.direction); - gl_matrix__WEBPACK_IMPORTED_MODULE_0__.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); - } - setAspectRatio(aspectRatio) { - this.aspectRatio = aspectRatio; - } - updateProjectionMatrix() { - gl_matrix__WEBPACK_IMPORTED_MODULE_0__.perspective(this.projectionMatrix, this.fovy, this.aspectRatio, this.near, this.far); - } - update() { - this.controls.tick(); - gl_matrix__WEBPACK_IMPORTED_MODULE_1__.add(this.target, this.position, this.direction); - gl_matrix__WEBPACK_IMPORTED_MODULE_0__.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); - } -} -; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Camera); - - -/***/ }), - -/***/ "./src/geometry/Icosphere.ts": -/*!***********************************!*\ - !*** ./src/geometry/Icosphere.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec4.js"); -/* harmony import */ var _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../rendering/gl/Drawable */ "./src/rendering/gl/Drawable.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "./src/globals.ts"); - - - -class Icosphere extends _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor(center, radius, subdivisions) { - super(); // Call the constructor of the super class. This is required. - this.radius = radius; - this.subdivisions = subdivisions; - this.center = gl_matrix__WEBPACK_IMPORTED_MODULE_2__.fromValues(center[0], center[1], center[2], 1); - } - create() { - const X = 0.525731112119133606; - const Z = 0.850650808352039932; - const N = 0; - let maxIndexCount = 20 * Math.pow(4, this.subdivisions); - let maxVertexCount = 10 * Math.pow(4, this.subdivisions) + 2; - // Create buffers to back geometry data - // Index data will ping pong back and forth between buffer0 and buffer1 during creation - // All data will be in buffer0 at the end - const buffer0 = new ArrayBuffer(maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + - maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + - maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT); - const buffer1 = new ArrayBuffer(maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT); - const buffers = [buffer0, buffer1]; - let b = 0; - const indexByteOffset = 0; - const vertexByteOffset = maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT; - const normalByteOffset = vertexByteOffset; - const positionByteOffset = vertexByteOffset + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT; - // Create 3-uint buffer views into the backing buffer to represent triangles - // The C++ analogy to this would be something like: - // triangles[i] = reinterpret_cast*>(&buffer[offset]); - let triangles = new Array(20); - let nextTriangles = new Array(); - for (let i = 0; i < 20; ++i) { - triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); - } - // Create 3-float buffer views into the backing buffer to represent positions - let vertices = new Array(12); - for (let i = 0; i < 12; ++i) { - vertices[i] = new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); - } - // Initialize normals for a 20-sided icosahedron - vertices[0].set([-X, N, Z, 0]); - vertices[1].set([X, N, Z, 0]); - vertices[2].set([-X, N, -Z, 0]); - vertices[3].set([X, N, -Z, 0]); - vertices[4].set([N, Z, X, 0]); - vertices[5].set([N, Z, -X, 0]); - vertices[6].set([N, -Z, X, 0]); - vertices[7].set([N, -Z, -X, 0]); - vertices[8].set([Z, X, N, 0]); - vertices[9].set([-Z, X, N, 0]); - vertices[10].set([Z, -X, N, 0]); - vertices[11].set([-Z, -X, N, 0]); - // Initialize indices for a 20-sided icosahedron - triangles[0].set([0, 4, 1]); - triangles[1].set([0, 9, 4]); - triangles[2].set([9, 5, 4]); - triangles[3].set([4, 5, 8]); - triangles[4].set([4, 8, 1]); - triangles[5].set([8, 10, 1]); - triangles[6].set([8, 3, 10]); - triangles[7].set([5, 3, 8]); - triangles[8].set([5, 2, 3]); - triangles[9].set([2, 7, 3]); - triangles[10].set([7, 10, 3]); - triangles[11].set([7, 6, 10]); - triangles[12].set([7, 11, 6]); - triangles[13].set([11, 0, 6]); - triangles[14].set([0, 1, 6]); - triangles[15].set([6, 1, 10]); - triangles[16].set([9, 0, 11]); - triangles[17].set([9, 11, 2]); - triangles[18].set([9, 2, 5]); - triangles[19].set([7, 2, 11]); - // This loop subdivides the icosahedron - for (let s = 0; s < this.subdivisions; ++s) { - b = 1 - b; - nextTriangles.length = triangles.length * 4; - let triangleIdx = 0; - // edgeMap maps a pair of vertex indices to a vertex index at their midpoint - // The function `mid` will get that midpoint vertex if it has already been created - // or it will create the vertex and add it to the map - let edgeMap = new Map(); - function mid(v0, v1) { - let key = [v0, v1].sort().join('_'); - if (!edgeMap.has(key)) { - let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4); - gl_matrix__WEBPACK_IMPORTED_MODULE_2__.add(midpoint, vertices[v0], vertices[v1]); - gl_matrix__WEBPACK_IMPORTED_MODULE_2__.normalize(midpoint, midpoint); - edgeMap.set(key, vertices.length); - vertices.push(midpoint); - } - return edgeMap.get(key); - } - for (let t = 0; t < triangles.length; ++t) { - let v0 = triangles[t][0]; - let v1 = triangles[t][1]; - let v2 = triangles[t][2]; - let v3 = mid(v0, v1); // Get or create a vertex between these two vertices - let v4 = mid(v1, v2); - let v5 = mid(v2, v0); - let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); - let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); - let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); - let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); - let triangleOffset = nextTriangles.length; - t0.set([v0, v3, v5]); - t1.set([v3, v4, v5]); - t2.set([v3, v1, v4]); - t3.set([v5, v4, v2]); - } - // swap buffers - let temp = triangles; - triangles = nextTriangles; - nextTriangles = temp; - } - if (b === 1) { - // if indices did not end up in buffer0, copy them there now - let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length); - let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length); - temp0.set(temp1); - } - // Populate one position for each normal - for (let i = 0; i < vertices.length; ++i) { - let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); - gl_matrix__WEBPACK_IMPORTED_MODULE_2__.scaleAndAdd(pos, this.center, vertices[i], this.radius); - } - this.buffer = buffer0; - this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3); - this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4); - this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4); - this.generateIdx(); - this.generatePos(); - this.generateNor(); - this.count = this.indices.length; - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.indices, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufNor); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.normals, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufPos); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.positions, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); - console.log(`Created icosphere with ${vertices.length} vertices`); - } -} -; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Icosphere); - - -/***/ }), - -/***/ "./src/geometry/Square.ts": -/*!********************************!*\ - !*** ./src/geometry/Square.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec4.js"); -/* harmony import */ var _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../rendering/gl/Drawable */ "./src/rendering/gl/Drawable.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "./src/globals.ts"); - - - -class Square extends _rendering_gl_Drawable__WEBPACK_IMPORTED_MODULE_0__["default"] { - constructor(center) { - super(); // Call the constructor of the super class. This is required. - this.center = gl_matrix__WEBPACK_IMPORTED_MODULE_2__.fromValues(center[0], center[1], center[2], 1); - } - create() { - this.indices = new Uint32Array([0, 1, 2, - 0, 2, 3]); - this.normals = new Float32Array([0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0, - 0, 0, 1, 0]); - this.positions = new Float32Array([-1, -1, 0, 1, - 1, -1, 0, 1, - 1, 1, 0, 1, - -1, 1, 0, 1]); - this.generateIdx(); - this.generatePos(); - this.generateNor(); - this.count = this.indices.length; - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ELEMENT_ARRAY_BUFFER, this.indices, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufNor); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.normals, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.bufPos); - _globals__WEBPACK_IMPORTED_MODULE_1__.gl.bufferData(_globals__WEBPACK_IMPORTED_MODULE_1__.gl.ARRAY_BUFFER, this.positions, _globals__WEBPACK_IMPORTED_MODULE_1__.gl.STATIC_DRAW); - console.log(`Created square`); - } -} -; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Square); - - -/***/ }), - -/***/ "./src/globals.ts": -/*!************************!*\ - !*** ./src/globals.ts ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "gl": () => (/* binding */ gl), -/* harmony export */ "setGL": () => (/* binding */ setGL) -/* harmony export */ }); -var gl; -function setGL(_gl) { - gl = _gl; -} - - -/***/ }), - -/***/ "./src/rendering/gl/Drawable.ts": -/*!**************************************!*\ - !*** ./src/rendering/gl/Drawable.ts ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../globals */ "./src/globals.ts"); - -class Drawable { - constructor() { - this.count = 0; - this.idxBound = false; - this.posBound = false; - this.norBound = false; - } - destory() { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.deleteBuffer(this.bufIdx); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.deleteBuffer(this.bufPos); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.deleteBuffer(this.bufNor); - } - generateIdx() { - this.idxBound = true; - this.bufIdx = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createBuffer(); - } - generatePos() { - this.posBound = true; - this.bufPos = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createBuffer(); - } - generateNor() { - this.norBound = true; - this.bufNor = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createBuffer(); - } - bindIdx() { - if (this.idxBound) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); - } - return this.idxBound; - } - bindPos() { - if (this.posBound) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.ARRAY_BUFFER, this.bufPos); - } - return this.posBound; - } - bindNor() { - if (this.norBound) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.bindBuffer(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.ARRAY_BUFFER, this.bufNor); - } - return this.norBound; - } - elemCount() { - return this.count; - } - drawMode() { - return _globals__WEBPACK_IMPORTED_MODULE_0__.gl.TRIANGLES; - } -} -; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Drawable); - - -/***/ }), - -/***/ "./src/rendering/gl/OpenGLRenderer.ts": -/*!********************************************!*\ - !*** ./src/rendering/gl/OpenGLRenderer.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/mat4.js"); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec4.js"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../globals */ "./src/globals.ts"); - - -// In this file, `gl` is accessible because it is imported above -class OpenGLRenderer { - constructor(canvas) { - this.canvas = canvas; - } - setClearColor(r, g, b, a) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.clearColor(r, g, b, a); - } - setSize(width, height) { - this.canvas.width = width; - this.canvas.height = height; - } - clear() { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.clear(_globals__WEBPACK_IMPORTED_MODULE_0__.gl.COLOR_BUFFER_BIT | _globals__WEBPACK_IMPORTED_MODULE_0__.gl.DEPTH_BUFFER_BIT); - } - render(camera, prog, drawables) { - let model = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); - let viewProj = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); - let color = gl_matrix__WEBPACK_IMPORTED_MODULE_2__.fromValues(1, 0, 0, 1); - gl_matrix__WEBPACK_IMPORTED_MODULE_1__.identity(model); - gl_matrix__WEBPACK_IMPORTED_MODULE_1__.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); - prog.setModelMatrix(model); - prog.setViewProjMatrix(viewProj); - prog.setGeometryColor(color); - for (let drawable of drawables) { - prog.draw(drawable); - } - } -} -; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OpenGLRenderer); - - -/***/ }), - -/***/ "./src/rendering/gl/ShaderProgram.ts": -/*!*******************************************!*\ - !*** ./src/rendering/gl/ShaderProgram.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Shader": () => (/* binding */ Shader), -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/mat4.js"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../globals */ "./src/globals.ts"); - - -var activeProgram = null; -class Shader { - constructor(type, source) { - this.shader = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createShader(type); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.shaderSource(this.shader, source); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.compileShader(this.shader); - if (!_globals__WEBPACK_IMPORTED_MODULE_0__.gl.getShaderParameter(this.shader, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.COMPILE_STATUS)) { - throw _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getShaderInfoLog(this.shader); - } - } -} -; -class ShaderProgram { - constructor(shaders) { - this.prog = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.createProgram(); - for (let shader of shaders) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.attachShader(this.prog, shader.shader); - } - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.linkProgram(this.prog); - if (!_globals__WEBPACK_IMPORTED_MODULE_0__.gl.getProgramParameter(this.prog, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.LINK_STATUS)) { - throw _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getProgramInfoLog(this.prog); - } - this.attrPos = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getAttribLocation(this.prog, "vs_Pos"); - this.attrNor = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getAttribLocation(this.prog, "vs_Nor"); - this.attrCol = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getAttribLocation(this.prog, "vs_Col"); - this.unifModel = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_Model"); - this.unifModelInvTr = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_ModelInvTr"); - this.unifViewProj = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_ViewProj"); - this.unifColor = _globals__WEBPACK_IMPORTED_MODULE_0__.gl.getUniformLocation(this.prog, "u_Color"); - } - use() { - if (activeProgram !== this.prog) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.useProgram(this.prog); - activeProgram = this.prog; - } - } - setModelMatrix(model) { - this.use(); - if (this.unifModel !== -1) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniformMatrix4fv(this.unifModel, false, model); - } - if (this.unifModelInvTr !== -1) { - let modelinvtr = gl_matrix__WEBPACK_IMPORTED_MODULE_1__.create(); - gl_matrix__WEBPACK_IMPORTED_MODULE_1__.transpose(modelinvtr, model); - gl_matrix__WEBPACK_IMPORTED_MODULE_1__.invert(modelinvtr, modelinvtr); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); - } - } - setViewProjMatrix(vp) { - this.use(); - if (this.unifViewProj !== -1) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniformMatrix4fv(this.unifViewProj, false, vp); - } - } - setGeometryColor(color) { - this.use(); - if (this.unifColor !== -1) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.uniform4fv(this.unifColor, color); - } - } - draw(d) { - this.use(); - if (this.attrPos != -1 && d.bindPos()) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.enableVertexAttribArray(this.attrPos); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.vertexAttribPointer(this.attrPos, 4, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.FLOAT, false, 0, 0); - } - if (this.attrNor != -1 && d.bindNor()) { - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.enableVertexAttribArray(this.attrNor); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.vertexAttribPointer(this.attrNor, 4, _globals__WEBPACK_IMPORTED_MODULE_0__.gl.FLOAT, false, 0, 0); - } - d.bindIdx(); - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.drawElements(d.drawMode(), d.elemCount(), _globals__WEBPACK_IMPORTED_MODULE_0__.gl.UNSIGNED_INT, 0); - if (this.attrPos != -1) - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.disableVertexAttribArray(this.attrPos); - if (this.attrNor != -1) - _globals__WEBPACK_IMPORTED_MODULE_0__.gl.disableVertexAttribArray(this.attrNor); - } -} -; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShaderProgram); - - -/***/ }), - -/***/ "./node_modules/turntable-camera-controller/turntable.js": -/*!***************************************************************!*\ - !*** ./node_modules/turntable-camera-controller/turntable.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -module.exports = createTurntableController - -var filterVector = __webpack_require__(/*! filtered-vector */ "./node_modules/filtered-vector/fvec.js") -var invert44 = __webpack_require__(/*! gl-mat4/invert */ "./node_modules/gl-mat4/invert.js") -var rotateM = __webpack_require__(/*! gl-mat4/rotate */ "./node_modules/gl-mat4/rotate.js") -var cross = __webpack_require__(/*! gl-vec3/cross */ "./node_modules/gl-vec3/cross.js") -var normalize3 = __webpack_require__(/*! gl-vec3/normalize */ "./node_modules/gl-vec3/normalize.js") -var dot3 = __webpack_require__(/*! gl-vec3/dot */ "./node_modules/gl-vec3/dot.js") - -function len3(x, y, z) { - return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)) -} - -function clamp1(x) { - return Math.min(1.0, Math.max(-1.0, x)) -} - -function findOrthoPair(v) { - var vx = Math.abs(v[0]) - var vy = Math.abs(v[1]) - var vz = Math.abs(v[2]) - - var u = [0,0,0] - if(vx > Math.max(vy, vz)) { - u[2] = 1 - } else if(vy > Math.max(vx, vz)) { - u[0] = 1 - } else { - u[1] = 1 - } - - var vv = 0 - var uv = 0 - for(var i=0; i<3; ++i ) { - vv += v[i] * v[i] - uv += u[i] * v[i] - } - for(var i=0; i<3; ++i) { - u[i] -= (uv / vv) * v[i] - } - normalize3(u, u) - return u -} - -function TurntableController(zoomMin, zoomMax, center, up, right, radius, theta, phi) { - this.center = filterVector(center) - this.up = filterVector(up) - this.right = filterVector(right) - this.radius = filterVector([radius]) - this.angle = filterVector([theta, phi]) - this.angle.bounds = [[-Infinity,-Math.PI/2], [Infinity,Math.PI/2]] - this.setDistanceLimits(zoomMin, zoomMax) - - this.computedCenter = this.center.curve(0) - this.computedUp = this.up.curve(0) - this.computedRight = this.right.curve(0) - this.computedRadius = this.radius.curve(0) - this.computedAngle = this.angle.curve(0) - this.computedToward = [0,0,0] - this.computedEye = [0,0,0] - this.computedMatrix = new Array(16) - for(var i=0; i<16; ++i) { - this.computedMatrix[i] = 0.5 - } - - this.recalcMatrix(0) -} - -var proto = TurntableController.prototype - -proto.setDistanceLimits = function(minDist, maxDist) { - if(minDist > 0) { - minDist = Math.log(minDist) - } else { - minDist = -Infinity - } - if(maxDist > 0) { - maxDist = Math.log(maxDist) - } else { - maxDist = Infinity - } - maxDist = Math.max(maxDist, minDist) - this.radius.bounds[0][0] = minDist - this.radius.bounds[1][0] = maxDist -} - -proto.getDistanceLimits = function(out) { - var bounds = this.radius.bounds[0] - if(out) { - out[0] = Math.exp(bounds[0][0]) - out[1] = Math.exp(bounds[1][0]) - return out - } - return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ] -} - -proto.recalcMatrix = function(t) { - //Recompute curves - this.center.curve(t) - this.up.curve(t) - this.right.curve(t) - this.radius.curve(t) - this.angle.curve(t) - - //Compute frame for camera matrix - var up = this.computedUp - var right = this.computedRight - var uu = 0.0 - var ur = 0.0 - for(var i=0; i<3; ++i) { - ur += up[i] * right[i] - uu += up[i] * up[i] - } - var ul = Math.sqrt(uu) - var rr = 0.0 - for(var i=0; i<3; ++i) { - right[i] -= up[i] * ur / uu - rr += right[i] * right[i] - up[i] /= ul - } - var rl = Math.sqrt(rr) - for(var i=0; i<3; ++i) { - right[i] /= rl - } - - //Compute toward vector - var toward = this.computedToward - cross(toward, up, right) - normalize3(toward, toward) - - //Compute angular parameters - var radius = Math.exp(this.computedRadius[0]) - var theta = this.computedAngle[0] - var phi = this.computedAngle[1] - - var ctheta = Math.cos(theta) - var stheta = Math.sin(theta) - var cphi = Math.cos(phi) - var sphi = Math.sin(phi) - - var center = this.computedCenter - - var wx = ctheta * cphi - var wy = stheta * cphi - var wz = sphi - - var sx = -ctheta * sphi - var sy = -stheta * sphi - var sz = cphi - - var eye = this.computedEye - var mat = this.computedMatrix - for(var i=0; i<3; ++i) { - var x = wx * right[i] + wy * toward[i] + wz * up[i] - mat[4*i+1] = sx * right[i] + sy * toward[i] + sz * up[i] - mat[4*i+2] = x - mat[4*i+3] = 0.0 - } - - var ax = mat[1] - var ay = mat[5] - var az = mat[9] - var bx = mat[2] - var by = mat[6] - var bz = mat[10] - var cx = ay * bz - az * by - var cy = az * bx - ax * bz - var cz = ax * by - ay * bx - var cl = len3(cx, cy, cz) - cx /= cl - cy /= cl - cz /= cl - mat[0] = cx - mat[4] = cy - mat[8] = cz - - for(var i=0; i<3; ++i) { - eye[i] = center[i] + mat[2+4*i]*radius - } - - for(var i=0; i<3; ++i) { - var rr = 0.0 - for(var j=0; j<3; ++j) { - rr += mat[i+4*j] * eye[j] - } - mat[12+i] = -rr - } - mat[15] = 1.0 -} - -proto.getMatrix = function(t, result) { - this.recalcMatrix(t) - var mat = this.computedMatrix - if(result) { - for(var i=0; i<16; ++i) { - result[i] = mat[i] - } - return result - } - return mat -} - -var zAxis = [0,0,0] -proto.rotate = function(t, dtheta, dphi, droll) { - this.angle.move(t, dtheta, dphi) - if(droll) { - this.recalcMatrix(t) - - var mat = this.computedMatrix - zAxis[0] = mat[2] - zAxis[1] = mat[6] - zAxis[2] = mat[10] - - var up = this.computedUp - var right = this.computedRight - var toward = this.computedToward - - for(var i=0; i<3; ++i) { - mat[4*i] = up[i] - mat[4*i+1] = right[i] - mat[4*i+2] = toward[i] - } - rotateM(mat, mat, droll, zAxis) - for(var i=0; i<3; ++i) { - up[i] = mat[4*i] - right[i] = mat[4*i+1] - } - - this.up.set(t, up[0], up[1], up[2]) - this.right.set(t, right[0], right[1], right[2]) - } -} - -proto.pan = function(t, dx, dy, dz) { - dx = dx || 0.0 - dy = dy || 0.0 - dz = dz || 0.0 - - this.recalcMatrix(t) - var mat = this.computedMatrix - - var dist = Math.exp(this.computedRadius[0]) - - var ux = mat[1] - var uy = mat[5] - var uz = mat[9] - var ul = len3(ux, uy, uz) - ux /= ul - uy /= ul - uz /= ul - - var rx = mat[0] - var ry = mat[4] - var rz = mat[8] - var ru = rx * ux + ry * uy + rz * uz - rx -= ux * ru - ry -= uy * ru - rz -= uz * ru - var rl = len3(rx, ry, rz) - rx /= rl - ry /= rl - rz /= rl - - var vx = rx * dx + ux * dy - var vy = ry * dx + uy * dy - var vz = rz * dx + uz * dy - this.center.move(t, vx, vy, vz) - - //Update z-component of radius - var radius = Math.exp(this.computedRadius[0]) - radius = Math.max(1e-4, radius + dz) - this.radius.set(t, Math.log(radius)) -} - -proto.translate = function(t, dx, dy, dz) { - this.center.move(t, - dx||0.0, - dy||0.0, - dz||0.0) -} - -//Recenters the coordinate axes -proto.setMatrix = function(t, mat, axes, noSnap) { - - //Get the axes for tare - var ushift = 1 - if(typeof axes === 'number') { - ushift = (axes)|0 - } - if(ushift < 0 || ushift > 3) { - ushift = 1 - } - var vshift = (ushift + 2) % 3 - var fshift = (ushift + 1) % 3 - - //Recompute state for new t value - if(!mat) { - this.recalcMatrix(t) - mat = this.computedMatrix - } - - //Get right and up vectors - var ux = mat[ushift] - var uy = mat[ushift+4] - var uz = mat[ushift+8] - if(!noSnap) { - var ul = len3(ux, uy, uz) - ux /= ul - uy /= ul - uz /= ul - } else { - var ax = Math.abs(ux) - var ay = Math.abs(uy) - var az = Math.abs(uz) - var am = Math.max(ax,ay,az) - if(ax === am) { - ux = (ux < 0) ? -1 : 1 - uy = uz = 0 - } else if(az === am) { - uz = (uz < 0) ? -1 : 1 - ux = uy = 0 - } else { - uy = (uy < 0) ? -1 : 1 - ux = uz = 0 - } - } - - var rx = mat[vshift] - var ry = mat[vshift+4] - var rz = mat[vshift+8] - var ru = rx * ux + ry * uy + rz * uz - rx -= ux * ru - ry -= uy * ru - rz -= uz * ru - var rl = len3(rx, ry, rz) - rx /= rl - ry /= rl - rz /= rl - - var fx = uy * rz - uz * ry - var fy = uz * rx - ux * rz - var fz = ux * ry - uy * rx - var fl = len3(fx, fy, fz) - fx /= fl - fy /= fl - fz /= fl - - this.center.jump(t, ex, ey, ez) - this.radius.idle(t) - this.up.jump(t, ux, uy, uz) - this.right.jump(t, rx, ry, rz) - - var phi, theta - if(ushift === 2) { - var cx = mat[1] - var cy = mat[5] - var cz = mat[9] - var cr = cx * rx + cy * ry + cz * rz - var cf = cx * fx + cy * fy + cz * fz - if(tu < 0) { - phi = -Math.PI/2 - } else { - phi = Math.PI/2 - } - theta = Math.atan2(cf, cr) - } else { - var tx = mat[2] - var ty = mat[6] - var tz = mat[10] - var tu = tx * ux + ty * uy + tz * uz - var tr = tx * rx + ty * ry + tz * rz - var tf = tx * fx + ty * fy + tz * fz - - phi = Math.asin(clamp1(tu)) - theta = Math.atan2(tf, tr) - } - - this.angle.jump(t, theta, phi) - - this.recalcMatrix(t) - var dx = mat[2] - var dy = mat[6] - var dz = mat[10] - - var imat = this.computedMatrix - invert44(imat, mat) - var w = imat[15] - var ex = imat[12] / w - var ey = imat[13] / w - var ez = imat[14] / w - - var gs = Math.exp(this.computedRadius[0]) - this.center.jump(t, ex-dx*gs, ey-dy*gs, ez-dz*gs) -} - -proto.lastT = function() { - return Math.max( - this.center.lastT(), - this.up.lastT(), - this.right.lastT(), - this.radius.lastT(), - this.angle.lastT()) -} - -proto.idle = function(t) { - this.center.idle(t) - this.up.idle(t) - this.right.idle(t) - this.radius.idle(t) - this.angle.idle(t) -} - -proto.flush = function(t) { - this.center.flush(t) - this.up.flush(t) - this.right.flush(t) - this.radius.flush(t) - this.angle.flush(t) -} - -proto.setDistance = function(t, d) { - if(d > 0) { - this.radius.set(t, Math.log(d)) - } -} - -proto.lookAt = function(t, eye, center, up) { - this.recalcMatrix(t) - - eye = eye || this.computedEye - center = center || this.computedCenter - up = up || this.computedUp - - var ux = up[0] - var uy = up[1] - var uz = up[2] - var ul = len3(ux, uy, uz) - if(ul < 1e-6) { - return - } - ux /= ul - uy /= ul - uz /= ul - - var tx = eye[0] - center[0] - var ty = eye[1] - center[1] - var tz = eye[2] - center[2] - var tl = len3(tx, ty, tz) - if(tl < 1e-6) { - return - } - tx /= tl - ty /= tl - tz /= tl - - var right = this.computedRight - var rx = right[0] - var ry = right[1] - var rz = right[2] - var ru = ux*rx + uy*ry + uz*rz - rx -= ru * ux - ry -= ru * uy - rz -= ru * uz - var rl = len3(rx, ry, rz) - - if(rl < 0.01) { - rx = uy * tz - uz * ty - ry = uz * tx - ux * tz - rz = ux * ty - uy * tx - rl = len3(rx, ry, rz) - if(rl < 1e-6) { - return - } - } - rx /= rl - ry /= rl - rz /= rl - - this.up.set(t, ux, uy, uz) - this.right.set(t, rx, ry, rz) - this.center.set(t, center[0], center[1], center[2]) - this.radius.set(t, Math.log(tl)) - - var fx = uy * rz - uz * ry - var fy = uz * rx - ux * rz - var fz = ux * ry - uy * rx - var fl = len3(fx, fy, fz) - fx /= fl - fy /= fl - fz /= fl - - var tu = ux*tx + uy*ty + uz*tz - var tr = rx*tx + ry*ty + rz*tz - var tf = fx*tx + fy*ty + fz*tz - - var phi = Math.asin(clamp1(tu)) - var theta = Math.atan2(tf, tr) - - var angleState = this.angle._state - var lastTheta = angleState[angleState.length-1] - var lastPhi = angleState[angleState.length-2] - lastTheta = lastTheta % (2.0 * Math.PI) - var dp = Math.abs(lastTheta + 2.0 * Math.PI - theta) - var d0 = Math.abs(lastTheta - theta) - var dn = Math.abs(lastTheta - 2.0 * Math.PI - theta) - if(dp < d0) { - lastTheta += 2.0 * Math.PI - } - if(dn < d0) { - lastTheta -= 2.0 * Math.PI - } - - this.angle.jump(this.angle.lastT(), lastTheta, lastPhi) - this.angle.set(t, theta, phi) -} - -function createTurntableController(options) { - options = options || {} - - var center = options.center || [0,0,0] - var up = options.up || [0,1,0] - var right = options.right || findOrthoPair(up) - var radius = options.radius || 1.0 - var theta = options.theta || 0.0 - var phi = options.phi || 0.0 - - center = [].slice.call(center, 0, 3) - - up = [].slice.call(up, 0, 3) - normalize3(up, up) - - right = [].slice.call(right, 0, 3) - normalize3(right, right) - - if('eye' in options) { - var eye = options.eye - var toward = [ - eye[0]-center[0], - eye[1]-center[1], - eye[2]-center[2] - ] - cross(right, toward, up) - if(len3(right[0], right[1], right[2]) < 1e-6) { - right = findOrthoPair(up) - } else { - normalize3(right, right) - } - - radius = len3(toward[0], toward[1], toward[2]) - - var ut = dot3(up, toward) / radius - var rt = dot3(right, toward) / radius - phi = Math.acos(ut) - theta = Math.acos(rt) - } - - //Use logarithmic coordinates for radius - radius = Math.log(radius) - - //Return the controller - return new TurntableController( - options.zoomMin, - options.zoomMax, - center, - up, - right, - radius, - theta, - phi) -} - -/***/ }), - -/***/ "./src/shaders/lambert-frag.glsl": -/*!***************************************!*\ - !*** ./src/shaders/lambert-frag.glsl ***! - \***************************************/ -/***/ ((module) => { - -module.exports = "#version 300 es\n\n// This is a fragment shader. If you've opened this file first, please\n// open and read lambert.vert.glsl before reading on.\n// Unlike the vertex shader, the fragment shader actually does compute\n// the shading of geometry. For every pixel in your program's output\n// screen, the fragment shader is run for every bit of geometry that\n// particular pixel overlaps. By implicitly interpolating the position\n// data passed into the fragment shader by the vertex shader, the fragment shader\n// can compute what color to apply to its pixel based on things like vertex\n// position, light position, and vertex color.\nprecision highp float;\n\nuniform vec4 u_Color; // The color with which to render this instance of geometry.\n\n// These are the interpolated values out of the rasterizer, so you can't know\n// their specific values without knowing the vertices that contributed to them\nin vec4 fs_Nor;\nin vec4 fs_LightVec;\nin vec4 fs_Col;\n\nout vec4 out_Col; // This is the final output color that you will see on your\n // screen for the pixel that is currently being processed.\n\nvoid main()\n{\n // Material base color (before shading)\n vec4 diffuseColor = u_Color;\n\n // Calculate the diffuse term for Lambert shading\n float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec));\n // Avoid negative lighting values\n // diffuseTerm = clamp(diffuseTerm, 0, 1);\n\n float ambientTerm = 0.2;\n\n float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier\n //to simulate ambient lighting. This ensures that faces that are not\n //lit by our point light are not completely black.\n\n // Compute final shaded color\n out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a);\n}\n" - -/***/ }), - -/***/ "./src/shaders/lambert-vert.glsl": -/*!***************************************!*\ - !*** ./src/shaders/lambert-vert.glsl ***! - \***************************************/ -/***/ ((module) => { - -module.exports = "#version 300 es\n\n//This is a vertex shader. While it is called a \"shader\" due to outdated conventions, this file\n//is used to apply matrix transformations to the arrays of vertex data passed to it.\n//Since this code is run on your GPU, each vertex is transformed simultaneously.\n//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time.\n//This simultaneous transformation allows your program to run much faster, especially when rendering\n//geometry with millions of vertices.\n\nuniform mat4 u_Model; // The matrix that defines the transformation of the\n // object we're rendering. In this assignment,\n // this will be the result of traversing your scene graph.\n\nuniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix.\n // This allows us to transform the object's normals properly\n // if the object has been non-uniformly scaled.\n\nuniform mat4 u_ViewProj; // The matrix that defines the camera's transformation.\n // We've written a static matrix for you to use for HW2,\n // but in HW3 you'll have to generate one yourself\n\nin vec4 vs_Pos; // The array of vertex positions passed to the shader\n\nin vec4 vs_Nor; // The array of vertex normals passed to the shader\n\nin vec4 vs_Col; // The array of vertex colors passed to the shader.\n\nout vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader.\nout vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader.\nout vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader.\n\nconst vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of\n //the geometry in the fragment shader.\n\nvoid main()\n{\n fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation\n\n mat3 invTranspose = mat3(u_ModelInvTr);\n fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation.\n // Transform the geometry's normals by the inverse transpose of the\n // model matrix. This is necessary to ensure the normals remain\n // perpendicular to the surface after the surface is transformed by\n // the model matrix.\n\n\n vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below\n\n fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies\n\n gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is\n // used to render the final positions of the geometry's vertices\n}\n" - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. -(() => { -"use strict"; -/*!*********************!*\ - !*** ./src/main.ts ***! - \*********************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! gl-matrix */ "./node_modules/gl-matrix/esm/vec3.js"); -/* harmony import */ var dat_gui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dat.gui */ "./node_modules/dat.gui/build/dat.gui.module.js"); -/* harmony import */ var _geometry_Icosphere__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./geometry/Icosphere */ "./src/geometry/Icosphere.ts"); -/* harmony import */ var _geometry_Square__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./geometry/Square */ "./src/geometry/Square.ts"); -/* harmony import */ var _rendering_gl_OpenGLRenderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rendering/gl/OpenGLRenderer */ "./src/rendering/gl/OpenGLRenderer.ts"); -/* harmony import */ var _Camera__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Camera */ "./src/Camera.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./globals */ "./src/globals.ts"); -/* harmony import */ var _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./rendering/gl/ShaderProgram */ "./src/rendering/gl/ShaderProgram.ts"); - -const Stats = __webpack_require__(/*! stats-js */ "./node_modules/stats-js/build/stats.min.js"); - - - - - - - -// Define an object with application parameters and button callbacks -// This will be referred to by dat.GUI's functions that add GUI elements. -const controls = { - tesselations: 5, - 'Load Scene': loadScene, // A function pointer, essentially -}; -let icosphere; -let square; -let prevTesselations = 5; -function loadScene() { - icosphere = new _geometry_Icosphere__WEBPACK_IMPORTED_MODULE_1__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0), 1, controls.tesselations); - icosphere.create(); - square = new _geometry_Square__WEBPACK_IMPORTED_MODULE_2__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0)); - square.create(); -} -function main() { - // Initial display for framerate - const stats = Stats(); - stats.setMode(0); - stats.domElement.style.position = 'absolute'; - stats.domElement.style.left = '0px'; - stats.domElement.style.top = '0px'; - document.body.appendChild(stats.domElement); - // Add controls to the gui - const gui = new dat_gui__WEBPACK_IMPORTED_MODULE_0__.GUI(); - gui.add(controls, 'tesselations', 0, 8).step(1); - gui.add(controls, 'Load Scene'); - // get canvas and webgl context - const canvas = document.getElementById('canvas'); - const gl = canvas.getContext('webgl2'); - if (!gl) { - alert('WebGL 2 not supported!'); - } - // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module. - // Later, we can import `gl` from `globals.ts` to access it - (0,_globals__WEBPACK_IMPORTED_MODULE_5__.setGL)(gl); - // Initial call to load scene - loadScene(); - const camera = new _Camera__WEBPACK_IMPORTED_MODULE_4__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 5), gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0)); - const renderer = new _rendering_gl_OpenGLRenderer__WEBPACK_IMPORTED_MODULE_3__["default"](canvas); - renderer.setClearColor(0.2, 0.2, 0.2, 1); - gl.enable(gl.DEPTH_TEST); - const lambert = new _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__["default"]([ - new _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__.Shader(gl.VERTEX_SHADER, __webpack_require__(/*! ./shaders/lambert-vert.glsl */ "./src/shaders/lambert-vert.glsl")), - new _rendering_gl_ShaderProgram__WEBPACK_IMPORTED_MODULE_6__.Shader(gl.FRAGMENT_SHADER, __webpack_require__(/*! ./shaders/lambert-frag.glsl */ "./src/shaders/lambert-frag.glsl")), - ]); - // This function will be called every frame - function tick() { - camera.update(); - stats.begin(); - gl.viewport(0, 0, window.innerWidth, window.innerHeight); - renderer.clear(); - if (controls.tesselations != prevTesselations) { - prevTesselations = controls.tesselations; - icosphere = new _geometry_Icosphere__WEBPACK_IMPORTED_MODULE_1__["default"](gl_matrix__WEBPACK_IMPORTED_MODULE_7__.fromValues(0, 0, 0), 1, prevTesselations); - icosphere.create(); - } - renderer.render(camera, lambert, [ - icosphere, - // square, - ]); - stats.end(); - // Tell the browser to call `tick` again whenever it renders a new frame - requestAnimationFrame(tick); - } - window.addEventListener('resize', function () { - renderer.setSize(window.innerWidth, window.innerHeight); - camera.setAspectRatio(window.innerWidth / window.innerHeight); - camera.updateProjectionMatrix(); - }, false); - renderer.setSize(window.innerWidth, window.innerHeight); - camera.setAspectRatio(window.innerWidth / window.innerHeight); - camera.updateProjectionMatrix(); - // Start the render loop - tick(); -} -main(); - -})(); - -/******/ })() -; -//# sourceMappingURL=bundle.js.map \ No newline at end of file diff --git a/dist/bundle.js.map b/dist/bundle.js.map deleted file mode 100644 index b4dab2f5..00000000 --- a/dist/bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bundle.js","mappings":";;;;;;;;;;AAAY;AACZ;AACA;AACA;AACA,kBAAkB,mBAAO,CAAC,sDAAW;AACrC,kBAAkB,mBAAO,CAAC,+CAAS;AACnC,kBAAkB,mBAAO,CAAC,iEAAc;AACxC,kBAAkB,mBAAO,CAAC,wDAAa;AACvC,kBAAkB,mBAAO,CAAC,sEAAoB;AAC9C,kBAAkB,mBAAO,CAAC,sEAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,gBAAgB,gBAAgB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;;;;;;;;;;;AC3OY;;AAEZ;;AAEA,sBAAsB,mBAAO,CAAC,4FAA6B;AAC3D,sBAAsB,mBAAO,CAAC,gFAAyB;AACvD,sBAAsB,mBAAO,CAAC,mFAA0B;;AAExD;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;;;;;;;;;;AC1JY;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO,YAAY,OAAO;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO,YAAY,OAAO;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAiB,OAAO,YAAY,OAAO;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB,OAAO,YAAY,OAAO;AAC5C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,kBAAkB,YAAY,OAAO;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gCAAgC,+BAA+B;AAC/D,gCAAgC,+BAA+B;AAC/D,gCAAgC,+BAA+B;AAC/D,gCAAgC,+BAA+B;AAC/D,gCAAgC;AAChC;;;;;;;;;;;;ACnEY;;AAEZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,MAAM;AACjC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAyB;;;;;;;;;;;;;;;;;;;;ACtCzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ,aAAa,oCAAoC;AACjD,IAAI;AACJ,aAAa,gDAAgD;AAC7D,IAAI;AACJ,aAAa,oCAAoC;AACjD,IAAI;AACJ,aAAa,gDAAgD;AAC7D;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,oCAAoC,SAAS;AAC7C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA,+CAA+C,EAAE;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;;;;;;;;;;;AAYA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,kBAAkB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,CAAC;;;;;;;;AAQD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;;;;;;;;;;;AAYA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oKAAoK,gCAAgC;AACpM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA,CAAC;AACD;AACA;AACA;AACA;AACA,+GAA+G;AAC/G,GAAG;AACH;AACA;AACA;AACA,2JAA2J;AAC3J,wJAAwJ;AACxJ,mJAAmJ;AACnJ,oJAAoJ;AACpJ,gJAAgJ;AAChJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,0DAA0D;AACnH;AACA,uDAAuD,sCAAsC;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;;AAED,yCAAyC,gBAAgB,SAAS,UAAU,WAAW,WAAW,OAAO,eAAe,MAAM,OAAO,QAAQ,SAAS,UAAU,mBAAmB,gBAAgB,SAAS,sCAAsC,iCAAiC,mCAAmC,8BAA8B,4BAA4B,gBAAgB,0CAA0C,UAAU,gBAAgB,6BAA6B,iCAAiC,qBAAqB,yDAAyD,UAAU,uBAAuB,sCAAsC,iCAAiC,mCAAmC,8BAA8B,SAAS,iBAAiB,YAAY,eAAe,kBAAkB,sBAAsB,iCAAiC,kBAAkB,oCAAoC,kBAAkB,6BAA6B,sBAAsB,MAAM,YAAY,kBAAkB,mBAAmB,4BAA4B,aAAa,+BAA+B,gBAAgB,yBAAyB,aAAa,gBAAgB,MAAM,aAAa,0BAA0B,kBAAkB,6BAA6B,eAAe,OAAO,uCAAuC,kCAAkC,oCAAoC,+BAA+B,uCAAuC,kCAAkC,oCAAoC,+BAA+B,oBAAoB,YAAY,YAAY,iBAAiB,oBAAoB,cAAc,UAAU,oCAAoC,aAAa,eAAe,iBAAiB,iEAAiE,SAAS,gBAAgB,SAAS,QAAQ,WAAW,iBAAiB,YAAY,gBAAgB,mBAAmB,eAAe,WAAW,WAAW,UAAU,gBAAgB,uBAAuB,OAAO,WAAW,UAAU,kBAAkB,wBAAwB,SAAS,eAAe,YAAY,WAAW,YAAY,iCAAiC,UAAU,cAAc,YAAY,WAAW,UAAU,iBAAiB,eAAe,YAAY,eAAe,eAAe,YAAY,4BAA4B,eAAe,cAAc,eAAe,sGAAsG,eAAe,cAAc,iBAAiB,cAAc,aAAa,kBAAkB,iBAAiB,gBAAgB,WAAW,0CAA0C,cAAc,gBAAgB,UAAU,wBAAwB,qBAAqB,gBAAgB,aAAa,sBAAsB,YAAY,aAAa,eAAe,iBAAiB,oBAAoB,aAAa,WAAW,8BAA8B,eAAe,SAAS,YAAY,kCAAkC,qBAAqB,cAAc,cAAc,YAAY,kBAAkB,aAAa,kBAAkB,kBAAkB,aAAa,eAAe,iBAAiB,kBAAkB,sBAAsB,YAAY,gBAAgB,uBAAuB,eAAe,sBAAsB,aAAa,IAAI,WAAW,sCAAsC,0BAA0B,4BAA4B,UAAU,mBAAmB,mCAAmC,SAAS,aAAa,kCAAkC,kBAAkB,mBAAmB,oBAAoB,mBAAmB,gCAAgC,gBAAgB,iBAAiB,mBAAmB,SAAS,uBAAuB,gBAAgB,YAAY,wBAAwB,gBAAgB,eAAe,kBAAkB,cAAc,gBAAgB,wBAAwB,mBAAmB,WAAW,4BAA4B,4BAA4B,eAAe,8BAA8B,sCAAsC,mfAAmf,WAAW,UAAU,8BAA8B,yBAAyB,4BAA4B,cAAc,gBAAgB,aAAa,kBAAkB,mCAAmC,wGAAwG,eAAe,8CAA8C,qBAAqB,oCAAoC,qFAAqF,gBAAgB,8BAA8B,cAAc,sBAAsB,iBAAiB,8BAA8B,eAAe,8BAA8B,gCAAgC,cAAc,eAAe,8BAA8B,gCAAgC,cAAc,6CAA6C,gBAAgB,wBAAwB,mBAAmB,aAAa,8BAA8B,mBAAmB,8BAA8B,mBAAmB,WAAW,eAAe,mBAAmB,iBAAiB,kBAAkB,mBAAmB,eAAe,qBAAqB,mBAAmB,gCAAgC,mBAAmB;;AAEltL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,IAAI;AACJ,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,gFAAgF,uEAAuE;AACvJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ;AACA;AACA;AACA,wBAAwB,oCAAoC;AAC5D;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA,sBAAsB,oCAAoC;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE+D;AAC/D,iEAAe,KAAK,EAAC;AACrB;;;;;;;;;;;;AC39EY;;AAEZ;;AAEA,mBAAmB,mBAAO,CAAC,8DAAe;AAC1C,cAAc,mBAAO,CAAC,kFAAsB;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,kBAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,KAAK;AACxB;AACA;AACA,MAAM;AACN;AACA,mBAAmB,KAAK;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,MAAM;AACpC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AClSA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3BA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC1BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;AC7BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;AC9CA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACpDA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC1BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACtDA,eAAe,mBAAO,CAAC,sDAAY;;AAEnC;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACzFA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,WAAW,WAAW;AACrC;AACA;AACA;AACA;;AAEA,eAAe,WAAW,YAAY;AACtC;AACA;AACA;AACA;;AAEA,gBAAgB,YAAY,YAAY;AACxC;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACzCA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAgB,YAAY,YAAY;AACxC,gBAAgB,YAAY,YAAY;AACxC,gBAAgB,YAAY,aAAa;;AAEzC;AACA,yBAAyB,yBAAyB;AAClD,6BAA6B,qBAAqB;AAClD,6BAA6B,yBAAyB;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC/DA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3CA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3CA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3CA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC9BA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,YAAY,YAAY;AAC5C,oBAAoB,YAAY,YAAY;AAC5C,oBAAoB,YAAY,aAAa;;AAE7C,sBAAsB,cAAc,cAAc;AAClD,sBAAsB,cAAc,cAAc;AAClD,sBAAsB,cAAc,eAAe;;AAEnD;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACrCA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACO;AACA;AACA;AACP;AACA;AACA;AACA,WAAW,4CAA4C;AACvD;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjDwC;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;;AAEnC,MAAM,kDAAmB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;;AAEnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;;AAEnC;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAY,+CAAgB;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA,YAAY,+CAAgB;AAC5B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,yBAAyB;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,eAAe;AAC1B,aAAa,MAAM;AACnB;;AAEO;AACP,wBAAwB,kDAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;;AAEzD;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,cAAc;AAC1B,YAAY,MAAM;AAClB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM;AAClB,YAAY,cAAc;AAC1B,YAAY,MAAM;AAClB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,YAAY,MAAM;AAClB;;AAEO;AACP,oBAAoB,kDAAmB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,OAAO;AAClB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB;AACA,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC,+CAAgB,+BAA+B,+CAAgB,+BAA+B,+CAAgB;AAC/I;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,uEAAuE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB,yEAAyE,+CAAgB;AAC/zC;AACA;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrxDiC;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;;AAEnC,MAAM,kDAAmB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,UAAU,8CAAe;AACzB,UAAU,8CAAe;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;;AAEA;AACA;AACA,6BAA6B;;AAE7B;AACA;AACA,kCAAkC;;AAElC;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,cAAc;;AAEd;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,sDAAsD;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,cAAc;;AAEd;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,sDAAsD;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA,cAAc;;AAEd;AACA;AACA,sBAAsB;;AAEtB;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB;AACxN;AACA;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClxBuC;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;;AAEnC,MAAM,kDAAmB;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,gBAAgB,kDAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;;AAEO;AACP,wBAAwB;AACxB;AACA;;AAEA;AACA;;AAEA;AACA,SAAS,8CAAe;AACxB,SAAS,8CAAe;AACxB;AACA,IAAI;;AAEJ;AACA,SAAS,8CAAe;AACxB,SAAS,8CAAe;AACxB;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA,sCAAsC;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,cAAc;AACzB,aAAa,SAAS;AACtB;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB,qEAAqE,+CAAgB;AAC7S;AACA;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA,cAAc;AACd;AACA;;AAEO;AACP;AACA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,aAAa,OAAO;AACpB;AACA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA,qBAAqB,OAAO;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;;;;;;;;;ACtpBD;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;AClDA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;AClBA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;;;;;;;;;ACXA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACbA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACnBA;;AAEA;AACA;AACA;AACA,WAAW,MAAM;AACjB,WAAW,MAAM;AACjB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBY;AACZ;AACA,gBAAgB,mBAAO,CAAC,uDAAY;AACpC;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvBA;;;;;;;;;;ACAA;AACA;AACA,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,gBAAgB,mBAAO,CAAC,+DAAa;;AAErC,aAAa,mBAAO,CAAC,wDAAgB;AACrC,YAAY,mBAAO,CAAC,sDAAe;AACnC,kBAAkB,mBAAO,CAAC,kEAAqB;AAC/C,aAAa,mBAAO,CAAC,wDAAgB;AACrC,gBAAgB,mBAAO,CAAC,8DAAmB;AAC3C;AACA,YAAY,mBAAO,CAAC,wDAAgB;AACpC,eAAe,mBAAO,CAAC,8DAAmB;AAC1C,SAAS,mBAAO,CAAC,kDAAa;AAC9B,WAAW,mBAAO,CAAC,sDAAe;AAClC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;;;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,MAAM;AACxB;AACA;AACA;;;;;;;;;;ACTA,WAAW,mBAAO,CAAC,oDAAc;;AAEjC,gBAAgB,mBAAO,CAAC,8DAAgB;AACxC,gBAAgB,mBAAO,CAAC,8DAAgB;AACxC,kBAAkB,mBAAO,CAAC,kEAAqB;AAC/C,YAAY,mBAAO,CAAC,sDAAY;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;ACnDA;AACA,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;AACtB,sBAAsB;;AAEtB;AACA;;AAEA;AACA,cAAc,mBAAO,CAAC,4DAAkB;AACxC,eAAe,mBAAO,CAAC,8DAAmB;AAC1C,cAAc,mBAAO,CAAC,4DAAkB;AACxC,YAAY,mBAAO,CAAC,wDAAgB;AACpC,WAAW,mBAAO,CAAC,sDAAe;AAClC,6BAA6B,mBAAO,CAAC,0FAAiC;AACtE;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;;;;AC3DY;;AAEZ,gBAAgB,mBAAO,CAAC,kFAAsB;AAC9C,gBAAgB,mBAAO,CAAC,kEAAkB;AAC1C,gBAAgB,mBAAO,CAAC,wDAAgB;AACxC,gBAAgB,mBAAO,CAAC,0DAAiB;AACzC,gBAAgB,mBAAO,CAAC,0DAAiB;AACzC,gBAAgB,mBAAO,CAAC,0DAAiB;AACzC,gBAAgB,mBAAO,CAAC,wDAAgB;AACxC,gBAAgB,mBAAO,CAAC,8DAAmB;AAC3C,gBAAgB,mBAAO,CAAC,sDAAe;AACvC,gBAAgB,mBAAO,CAAC,8DAAmB;;AAE3C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA,mBAAmB,MAAM;AACzB;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACrMY;;AAEZ;;AAEA,YAAY,mBAAO,CAAC,wDAAa;;AAEjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA,KAAK;AACL;AACA,yBAAyB,oBAAoB;AAC7C;AACA,KAAK;AACL;AACA,yBAAyB,UAAU;AACnC;AACA,KAAK;AACL;AACA,yBAAyB,UAAU;AACnC;AACA,KAAK;AACL;AACA,yBAAyB,aAAa;AACtC;AACA;AACA,GAAG;;AAEH;AACA;;;;;;;;;;;AC5MA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;;;;;;;;;;;ACxBY;;AAEZ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA,eAAe;;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;;;;;;;;;;;AC3DG;;AAEZ,WAAW,mBAAO,CAAC,8CAAO;;AAE1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACvCY;;AAEZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxCY;;AAEZ;;AAEA,oBAAoB,mBAAO,CAAC,+DAAiB;AAC7C,oBAAoB,mBAAO,CAAC,wDAAgB;AAC5C,oBAAoB,mBAAO,CAAC,4DAAkB;AAC9C,oBAAoB,mBAAO,CAAC,wDAAgB;AAC5C,oBAAoB,mBAAO,CAAC,wFAAqB;;AAEjD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,KAAK;AACpB;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,KAAK;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;;;;ACxYA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACTA;;;;;;;;;;ACAA;AACA,EAAE,qBAAM;AACR,EAAE,qBAAM;AACR;AACA,IAAI;AACJ;AACA;;;;;;;;;;;ACNA,eAAe,KAAoD,oBAAoB,CAA2D,CAAC,iBAAiB,aAAa,iBAAiB,wCAAwC,cAAc,8BAA8B,cAAc,YAAY,oBAAoB,qDAAqD,IAAI,gCAAgC,MAAM,OAAO,eAAe,YAAY,sDAAsD,4CAA4C,KAAK,mHAAmH,sFAAsF,aAAa,0DAA0D,4BAA4B,gBAAgB,IAAI,gCAAgC,sEAAsE,yBAAyB,6DAA6D,SAAS,mBAAmB,aAAa,0BAA0B,+BAA+B,mJAAmJ,iDAAiD,aAAa,yBAAyB,yNAAyN,2BAA2B,mRAAmR,GAAG;;;;;;;;;;;;ACAl3D;;AAEZ,gBAAgB,mBAAO,CAAC,sDAAY;;AAEpC;;AAEA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;ACzEA,IAAI,cAAc,GAAG,mBAAO,CAAC,mEAAkB,CAAC,CAAC;AACZ;AAErC,MAAM,MAAM;IAaV,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xC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAM;AACrB;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;AACA,eAAe,KAAK;AACpB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,eAAe,KAAK;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,KAAK;AACpB;AACA;;AAEA,eAAe,KAAK;AACpB;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB,MAAM;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAiB,KAAK;AACtB;AACA;AACA;AACA;AACA;AACA,iBAAiB,KAAK;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;AC3jBA,sqBAAsqB,0BAA0B,8OAA8O,sBAAsB,iBAAiB,sBAAsB,2JAA2J,mFAAmF,0IAA0I,+FAA+F,oCAAoC,gEAAgE,wZAAwZ,GAAG;;;;;;;;;;ACAj8D,+jBAA+jB,wPAAwP,oPAAoP,6PAA6P,qFAAqF,mFAAmF,mFAAmF,kJAAkJ,0JAA0J,0HAA0H,8KAA8K,+CAA+C,iHAAiH,8DAA8D,wkBAAwkB,oHAAoH,wGAAwG,0KAA0K;;;;;;UCAnyG;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;;;;;ACN+B;AAC/B,MAAM,KAAK,GAAG,mBAAO,CAAC,4DAAU,CAAC,CAAC;AACH;AACc;AACN;AACoB;AAC7B;AACE;AACmC;AAEnE,oEAAoE;AACpE,yEAAyE;AACzE,MAAM,QAAQ,GAAG;IACf,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,SAAS,EAAE,kCAAkC;CAC5D,CAAC;AAEF,IAAI,SAAoB,CAAC;AACzB,IAAI,MAAc,CAAC;AACnB,IAAI,gBAAgB,GAAW,CAAC,CAAC;AAEjC,SAAS,SAAS;IAChB,SAAS,GAAG,IAAI,2DAAS,CAAC,iDAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9E,SAAS,CAAC,MAAM,EAAE,CAAC;IACnB,MAAM,GAAG,IAAI,wDAAM,CAAC,iDAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,IAAI;IACX,gCAAgC;IAChC,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC;IACtB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAC7C,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;IACpC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAI,wCAAO,EAAE,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEhC,+BAA+B;IAC/B,MAAM,MAAM,GAAuB,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACrE,MAAM,EAAE,GAA4B,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,EAAE,EAAE;QACP,KAAK,CAAC,wBAAwB,CAAC,CAAC;KACjC;IACD,gGAAgG;IAChG,2DAA2D;IAC3D,+CAAK,CAAC,EAAE,CAAC,CAAC;IAEV,6BAA6B;IAC7B,SAAS,EAAE,CAAC;IAEZ,MAAM,MAAM,GAAG,IAAI,+CAAM,CAAC,iDAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,iDAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,IAAI,oEAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAI,mEAAa,CAAC;QAChC,IAAI,+DAAM,CAAC,EAAE,CAAC,aAAa,EAAE,mBAAO,CAAC,oEAA6B,CAAC,CAAC;QACpE,IAAI,+DAAM,CAAC,EAAE,CAAC,eAAe,EAAE,mBAAO,CAAC,oEAA6B,CAAC,CAAC;KACvE,CAAC,CAAC;IAEH,2CAA2C;IAC3C,SAAS,IAAI;QACX,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACzD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAG,QAAQ,CAAC,YAAY,IAAI,gBAAgB,EAC5C;YACE,gBAAgB,GAAG,QAAQ,CAAC,YAAY,CAAC;YACzC,SAAS,GAAG,IAAI,2DAAS,CAAC,iDAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACzE,SAAS,CAAC,MAAM,EAAE,CAAC;SACpB;QACD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE;YAC/B,SAAS;YACT,UAAU;SACX,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,EAAE,CAAC;QAEZ,wEAAwE;QACxE,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE;QAChC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,CAAC,sBAAsB,EAAE,CAAC;IAClC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,CAAC,sBAAsB,EAAE,CAAC;IAEhC,wBAAwB;IACxB,IAAI,EAAE,CAAC;AACT,CAAC;AAED,IAAI,EAAE,CAAC","sources":["webpack:///./node_modules/3d-view-controls/camera.js","webpack:///./node_modules/3d-view/view.js","webpack:///./node_modules/binary-search-bounds/search-bounds.js","webpack:///./node_modules/cubic-hermite/hermite.js","webpack:///./node_modules/dat.gui/build/dat.gui.module.js","webpack:///./node_modules/filtered-vector/fvec.js","webpack:///./node_modules/gl-mat4/clone.js","webpack:///./node_modules/gl-mat4/create.js","webpack:///./node_modules/gl-mat4/determinant.js","webpack:///./node_modules/gl-mat4/fromQuat.js","webpack:///./node_modules/gl-mat4/fromRotationTranslation.js","webpack:///./node_modules/gl-mat4/identity.js","webpack:///./node_modules/gl-mat4/invert.js","webpack:///./node_modules/gl-mat4/lookAt.js","webpack:///./node_modules/gl-mat4/multiply.js","webpack:///./node_modules/gl-mat4/rotate.js","webpack:///./node_modules/gl-mat4/rotateX.js","webpack:///./node_modules/gl-mat4/rotateY.js","webpack:///./node_modules/gl-mat4/rotateZ.js","webpack:///./node_modules/gl-mat4/scale.js","webpack:///./node_modules/gl-mat4/translate.js","webpack:///./node_modules/gl-mat4/transpose.js","webpack:///./node_modules/gl-matrix/esm/common.js","webpack:///./node_modules/gl-matrix/esm/mat4.js","webpack:///./node_modules/gl-matrix/esm/vec3.js","webpack:///./node_modules/gl-matrix/esm/vec4.js","webpack:///./node_modules/gl-quat/slerp.js","webpack:///./node_modules/gl-vec3/cross.js","webpack:///./node_modules/gl-vec3/dot.js","webpack:///./node_modules/gl-vec3/length.js","webpack:///./node_modules/gl-vec3/lerp.js","webpack:///./node_modules/gl-vec3/normalize.js","webpack:///./node_modules/has-passive-events/index.js","webpack:///./node_modules/is-browser/client.js","webpack:///./node_modules/mat4-decompose/index.js","webpack:///./node_modules/mat4-decompose/normalize.js","webpack:///./node_modules/mat4-interpolate/index.js","webpack:///./node_modules/mat4-recompose/index.js","webpack:///./node_modules/matrix-camera-controller/matrix.js","webpack:///./node_modules/mouse-change/mouse-listen.js","webpack:///./node_modules/mouse-event-offset/index.js","webpack:///./node_modules/mouse-event/mouse.js","webpack:///./node_modules/mouse-wheel/wheel.js","webpack:///./node_modules/orbit-camera-controller/lib/quatFromFrame.js","webpack:///./node_modules/orbit-camera-controller/orbit.js","webpack:///./node_modules/parse-unit/index.js","webpack:///./node_modules/quat-slerp/index.js","webpack:///./node_modules/right-now/browser.js","webpack:///./node_modules/stats-js/build/stats.min.js","webpack:///./node_modules/to-px/browser.js","webpack:///./src/Camera.ts","webpack:///./src/geometry/Icosphere.ts","webpack:///./src/geometry/Square.ts","webpack:///./src/globals.ts","webpack:///./src/rendering/gl/Drawable.ts","webpack:///./src/rendering/gl/OpenGLRenderer.ts","webpack:///./src/rendering/gl/ShaderProgram.ts","webpack:///./node_modules/turntable-camera-controller/turntable.js","webpack:///./src/shaders/lambert-frag.glsl","webpack:///./src/shaders/lambert-vert.glsl","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/main.ts"],"sourcesContent":["'use strict'\r\n\r\nmodule.exports = createCamera\r\n\r\nvar now = require('right-now')\r\nvar createView = require('3d-view')\r\nvar mouseChange = require('mouse-change')\r\nvar mouseWheel = require('mouse-wheel')\r\nvar mouseOffset = require('mouse-event-offset')\r\nvar hasPassive = require('has-passive-events')\r\n\r\nfunction createCamera(element, options) {\r\n element = element || document.body\r\n options = options || {}\r\n\r\n var limits = [ 0.01, Infinity ]\r\n if('distanceLimits' in options) {\r\n limits[0] = options.distanceLimits[0]\r\n limits[1] = options.distanceLimits[1]\r\n }\r\n if('zoomMin' in options) {\r\n limits[0] = options.zoomMin\r\n }\r\n if('zoomMax' in options) {\r\n limits[1] = options.zoomMax\r\n }\r\n\r\n var view = createView({\r\n center: options.center || [0,0,0],\r\n up: options.up || [0,1,0],\r\n eye: options.eye || [0,0,10],\r\n mode: options.mode || 'orbit',\r\n distanceLimits: limits\r\n })\r\n\r\n var pmatrix = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\r\n var distance = 0.0\r\n var width = element.clientWidth\r\n var height = element.clientHeight\r\n\r\n var camera = {\r\n view: view,\r\n element: element,\r\n delay: options.delay || 16,\r\n rotateSpeed: options.rotateSpeed || 1,\r\n zoomSpeed: options.zoomSpeed || 1,\r\n translateSpeed: options.translateSpeed || 1,\r\n flipX: !!options.flipX,\r\n flipY: !!options.flipY,\r\n modes: view.modes,\r\n tick: function() {\r\n var t = now()\r\n var delay = this.delay\r\n view.idle(t-delay)\r\n view.flush(t-(100+delay*2))\r\n var ctime = t - 2 * delay\r\n view.recalcMatrix(ctime)\r\n var allEqual = true\r\n var matrix = view.computedMatrix\r\n for(var i=0; i<16; ++i) {\r\n allEqual = allEqual && (pmatrix[i] === matrix[i])\r\n pmatrix[i] = matrix[i]\r\n }\r\n var sizeChanged =\r\n element.clientWidth === width &&\r\n element.clientHeight === height\r\n width = element.clientWidth\r\n height = element.clientHeight\r\n if(allEqual) {\r\n return !sizeChanged\r\n }\r\n distance = Math.exp(view.computedRadius[0])\r\n return true\r\n },\r\n lookAt: function(center, eye, up) {\r\n view.lookAt(view.lastT(), center, eye, up)\r\n },\r\n rotate: function(pitch, yaw, roll) {\r\n view.rotate(view.lastT(), pitch, yaw, roll)\r\n },\r\n pan: function(dx, dy, dz) {\r\n view.pan(view.lastT(), dx, dy, dz)\r\n },\r\n translate: function(dx, dy, dz) {\r\n view.translate(view.lastT(), dx, dy, dz)\r\n }\r\n }\r\n\r\n Object.defineProperties(camera, {\r\n matrix: {\r\n get: function() {\r\n return view.computedMatrix\r\n },\r\n set: function(mat) {\r\n view.setMatrix(view.lastT(), mat)\r\n return view.computedMatrix\r\n },\r\n enumerable: true\r\n },\r\n mode: {\r\n get: function() {\r\n return view.getMode()\r\n },\r\n set: function(mode) {\r\n view.setMode(mode)\r\n return view.getMode()\r\n },\r\n enumerable: true\r\n },\r\n center: {\r\n get: function() {\r\n return view.computedCenter\r\n },\r\n set: function(ncenter) {\r\n view.lookAt(view.lastT(), ncenter)\r\n return view.computedCenter\r\n },\r\n enumerable: true\r\n },\r\n eye: {\r\n get: function() {\r\n return view.computedEye\r\n },\r\n set: function(neye) {\r\n view.lookAt(view.lastT(), null, neye)\r\n return view.computedEye\r\n },\r\n enumerable: true\r\n },\r\n up: {\r\n get: function() {\r\n return view.computedUp\r\n },\r\n set: function(nup) {\r\n view.lookAt(view.lastT(), null, null, nup)\r\n return view.computedUp\r\n },\r\n enumerable: true\r\n },\r\n distance: {\r\n get: function() {\r\n return distance\r\n },\r\n set: function(d) {\r\n view.setDistance(view.lastT(), d)\r\n return d\r\n },\r\n enumerable: true\r\n },\r\n distanceLimits: {\r\n get: function() {\r\n return view.getDistanceLimits(limits)\r\n },\r\n set: function(v) {\r\n view.setDistanceLimits(v)\r\n return v\r\n },\r\n enumerable: true\r\n }\r\n })\r\n\r\n element.addEventListener('contextmenu', function(ev) {\r\n ev.preventDefault()\r\n return false\r\n })\r\n\r\n var lastX = 0, lastY = 0, lastMods = {shift: false, control: false, alt: false, meta: false}\r\n mouseChange(element, handleInteraction)\r\n\r\n //enable simple touch interactions\r\n element.addEventListener('touchstart', function (ev) {\r\n var xy = mouseOffset(ev.changedTouches[0], element)\r\n handleInteraction(0, xy[0], xy[1], lastMods)\r\n handleInteraction(1, xy[0], xy[1], lastMods)\r\n\r\n ev.preventDefault()\r\n }, hasPassive ? {passive: false} : false)\r\n\r\n element.addEventListener('touchmove', function (ev) {\r\n var xy = mouseOffset(ev.changedTouches[0], element)\r\n handleInteraction(1, xy[0], xy[1], lastMods)\r\n\r\n ev.preventDefault()\r\n }, hasPassive ? {passive: false} : false)\r\n\r\n element.addEventListener('touchend', function (ev) {\r\n var xy = mouseOffset(ev.changedTouches[0], element)\r\n handleInteraction(0, lastX, lastY, lastMods)\r\n\r\n ev.preventDefault()\r\n }, hasPassive ? {passive: false} : false)\r\n\r\n function handleInteraction (buttons, x, y, mods) {\r\n var scale = 1.0 / element.clientHeight\r\n var dx = scale * (x - lastX)\r\n var dy = scale * (y - lastY)\r\n\r\n var flipX = camera.flipX ? 1 : -1\r\n var flipY = camera.flipY ? 1 : -1\r\n\r\n var drot = Math.PI * camera.rotateSpeed\r\n\r\n var t = now()\r\n\r\n if(buttons & 1) {\r\n if(mods.shift) {\r\n view.rotate(t, 0, 0, -dx * drot)\r\n } else {\r\n view.rotate(t, flipX * drot * dx, -flipY * drot * dy, 0)\r\n }\r\n } else if(buttons & 2) {\r\n view.pan(t, -camera.translateSpeed * dx * distance, camera.translateSpeed * dy * distance, 0)\r\n } else if(buttons & 4) {\r\n var kzoom = camera.zoomSpeed * dy / window.innerHeight * (t - view.lastT()) * 50.0\r\n view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1))\r\n }\r\n\r\n lastX = x\r\n lastY = y\r\n lastMods = mods\r\n }\r\n\r\n mouseWheel(element, function(dx, dy, dz) {\r\n var flipX = camera.flipX ? 1 : -1\r\n var flipY = camera.flipY ? 1 : -1\r\n var t = now()\r\n if(Math.abs(dx) > Math.abs(dy)) {\r\n view.rotate(t, 0, 0, -dx * flipX * Math.PI * camera.rotateSpeed / window.innerWidth)\r\n } else {\r\n var kzoom = camera.zoomSpeed * flipY * dy / window.innerHeight * (t - view.lastT()) / 100.0\r\n view.pan(t, 0, 0, distance * (Math.exp(kzoom) - 1))\r\n }\r\n }, true)\r\n\r\n return camera\r\n}\r\n","'use strict'\n\nmodule.exports = createViewController\n\nvar createTurntable = require('turntable-camera-controller')\nvar createOrbit = require('orbit-camera-controller')\nvar createMatrix = require('matrix-camera-controller')\n\nfunction ViewController(controllers, mode) {\n this._controllerNames = Object.keys(controllers)\n this._controllerList = this._controllerNames.map(function(n) {\n return controllers[n]\n })\n this._mode = mode\n this._active = controllers[mode]\n if(!this._active) {\n this._mode = 'turntable'\n this._active = controllers.turntable\n }\n this.modes = this._controllerNames\n this.computedMatrix = this._active.computedMatrix\n this.computedEye = this._active.computedEye\n this.computedUp = this._active.computedUp\n this.computedCenter = this._active.computedCenter\n this.computedRadius = this._active.computedRadius\n}\n\nvar proto = ViewController.prototype\n\nproto.flush = function(a0) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].flush(a0)\n }\n}\nproto.idle = function(a0) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].idle(a0)\n }\n}\nproto.lookAt = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].lookAt(a0, a1, a2, a3)\n }\n}\nproto.rotate = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].rotate(a0, a1, a2, a3)\n }\n}\nproto.pan = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].pan(a0, a1, a2, a3)\n }\n}\nproto.translate = function(a0, a1, a2, a3) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].translate(a0, a1, a2, a3)\n }\n}\nproto.setMatrix = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setMatrix(a0, a1)\n }\n}\nproto.setDistanceLimits = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setDistanceLimits(a0, a1)\n }\n}\nproto.setDistance = function(a0, a1) {\n var cc = this._controllerList\n for (var i = 0; i < cc.length; ++i) {\n cc[i].setDistance(a0, a1)\n }\n}\n\nproto.recalcMatrix = function(t) {\n this._active.recalcMatrix(t)\n}\n\nproto.getDistance = function(t) {\n return this._active.getDistance(t)\n}\nproto.getDistanceLimits = function(out) {\n return this._active.getDistanceLimits(out)\n}\n\nproto.lastT = function() {\n return this._active.lastT()\n}\n\nproto.setMode = function(mode) {\n if(mode === this._mode) {\n return\n }\n var idx = this._controllerNames.indexOf(mode)\n if(idx < 0) {\n return\n }\n var prev = this._active\n var next = this._controllerList[idx]\n var lastT = Math.max(prev.lastT(), next.lastT())\n\n prev.recalcMatrix(lastT)\n next.setMatrix(lastT, prev.computedMatrix)\n\n this._active = next\n this._mode = mode\n\n //Update matrix properties\n this.computedMatrix = this._active.computedMatrix\n this.computedEye = this._active.computedEye\n this.computedUp = this._active.computedUp\n this.computedCenter = this._active.computedCenter\n this.computedRadius = this._active.computedRadius\n}\n\nproto.getMode = function() {\n return this._mode\n}\n\nfunction createViewController(options) {\n options = options || {}\n\n var eye = options.eye || [0,0,1]\n var center = options.center || [0,0,0]\n var up = options.up || [0,1,0]\n var limits = options.distanceLimits || [0, Infinity]\n var mode = options.mode || 'turntable'\n\n var turntable = createTurntable()\n var orbit = createOrbit()\n var matrix = createMatrix()\n\n turntable.setDistanceLimits(limits[0], limits[1])\n turntable.lookAt(0, eye, center, up)\n orbit.setDistanceLimits(limits[0], limits[1])\n orbit.lookAt(0, eye, center, up)\n matrix.setDistanceLimits(limits[0], limits[1])\n matrix.lookAt(0, eye, center, up)\n\n return new ViewController({\n turntable: turntable,\n orbit: orbit,\n matrix: matrix\n }, mode)\n}","\"use strict\"\n\n// (a, y, c, l, h) = (array, y[, cmp, lo, hi])\n\nfunction ge(a, y, c, l, h) {\n var i = h + 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p >= 0) { i = m; h = m - 1 } else { l = m + 1 }\n }\n return i;\n};\n\nfunction gt(a, y, c, l, h) {\n var i = h + 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p > 0) { i = m; h = m - 1 } else { l = m + 1 }\n }\n return i;\n};\n\nfunction lt(a, y, c, l, h) {\n var i = l - 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p < 0) { i = m; l = m + 1 } else { h = m - 1 }\n }\n return i;\n};\n\nfunction le(a, y, c, l, h) {\n var i = l - 1;\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p <= 0) { i = m; l = m + 1 } else { h = m - 1 }\n }\n return i;\n};\n\nfunction eq(a, y, c, l, h) {\n while (l <= h) {\n var m = (l + h) >>> 1, x = a[m];\n var p = (c !== undefined) ? c(x, y) : (x - y);\n if (p === 0) { return m }\n if (p <= 0) { l = m + 1 } else { h = m - 1 }\n }\n return -1;\n};\n\nfunction norm(a, y, c, l, h, f) {\n if (typeof c === 'function') {\n return f(a, y, c, (l === undefined) ? 0 : l | 0, (h === undefined) ? a.length - 1 : h | 0);\n }\n return f(a, y, undefined, (c === undefined) ? 0 : c | 0, (l === undefined) ? a.length - 1 : l | 0);\n}\n\nmodule.exports = {\n ge: function(a, y, c, l, h) { return norm(a, y, c, l, h, ge)},\n gt: function(a, y, c, l, h) { return norm(a, y, c, l, h, gt)},\n lt: function(a, y, c, l, h) { return norm(a, y, c, l, h, lt)},\n le: function(a, y, c, l, h) { return norm(a, y, c, l, h, le)},\n eq: function(a, y, c, l, h) { return norm(a, y, c, l, h, eq)}\n}\n","\"use strict\"\n\nfunction dcubicHermite(p0, v0, p1, v1, t, f) {\n var dh00 = 6*t*t-6*t,\n dh10 = 3*t*t-4*t + 1,\n dh01 = -6*t*t+6*t,\n dh11 = 3*t*t-2*t\n if(p0.length) {\n if(!f) {\n f = new Array(p0.length)\n }\n for(var i=p0.length-1; i>=0; --i) {\n f[i] = dh00*p0[i] + dh10*v0[i] + dh01*p1[i] + dh11*v1[i]\n }\n return f\n }\n return dh00*p0 + dh10*v0 + dh01*p1[i] + dh11*v1\n}\n\nfunction cubicHermite(p0, v0, p1, v1, t, f) {\n var ti = (t-1), t2 = t*t, ti2 = ti*ti,\n h00 = (1+2*t)*ti2,\n h10 = t*ti2,\n h01 = t2*(3-2*t),\n h11 = t2*ti\n if(p0.length) {\n if(!f) {\n f = new Array(p0.length)\n }\n for(var i=p0.length-1; i>=0; --i) {\n f[i] = h00*p0[i] + h10*v0[i] + h01*p1[i] + h11*v1[i]\n }\n return f\n }\n return h00*p0 + h10*v0 + h01*p1 + h11*v1\n}\n\nmodule.exports = cubicHermite\nmodule.exports.derivative = dcubicHermite","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n\\n
\\n\\n
\\n\\n
\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","'use strict'\n\nmodule.exports = createFilteredVector\n\nvar cubicHermite = require('cubic-hermite')\nvar bsearch = require('binary-search-bounds')\n\nfunction clamp(lo, hi, x) {\n return Math.min(hi, Math.max(lo, x))\n}\n\nfunction FilteredVector(state0, velocity0, t0) {\n this.dimension = state0.length\n this.bounds = [ new Array(this.dimension), new Array(this.dimension) ]\n for(var i=0; i= n-1) {\n var ptr = state.length-1\n var tf = t - time[n-1]\n for(var i=0; i= n-1) {\n var ptr = state.length-1\n var tf = t - time[n-1]\n for(var i=0; i=0; --i) {\n if(velocity[--ptr]) {\n return false\n }\n }\n return true\n}\n\nproto.jump = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t < t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var ptr = state.length-this.dimension\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n this._time.push(t0, t)\n for(var j=0; j<2; ++j) {\n for(var i=0; i0; --i) {\n state.push(clamp(lo[i-1], hi[i-1], arguments[i]))\n velocity.push(0)\n }\n}\n\nproto.push = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t < t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var ptr = state.length-this.dimension\n var dt = t - t0\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var sf = (dt > 1e-6) ? 1/dt : 0\n this._time.push(t)\n for(var i=d; i>0; --i) {\n var xc = clamp(lo[i-1], hi[i-1], arguments[i])\n state.push(xc)\n velocity.push((xc - state[ptr++]) * sf)\n }\n}\n\nproto.set = function(t) {\n var d = this.dimension\n if(t < this.lastT() || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n this._time.push(t)\n for(var i=d; i>0; --i) {\n state.push(clamp(lo[i-1], hi[i-1], arguments[i]))\n velocity.push(0)\n }\n}\n\nproto.move = function(t) {\n var t0 = this.lastT()\n var d = this.dimension\n if(t <= t0 || arguments.length !== d+1) {\n return\n }\n var state = this._state\n var velocity = this._velocity\n var statePtr = state.length - this.dimension\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var dt = t - t0\n var sf = (dt > 1e-6) ? 1/dt : 0.0\n this._time.push(t)\n for(var i=d; i>0; --i) {\n var dx = arguments[i]\n state.push(clamp(lo[i-1], hi[i-1], state[statePtr++] + dx))\n velocity.push(dx * sf)\n }\n}\n\nproto.idle = function(t) {\n var t0 = this.lastT()\n if(t < t0) {\n return\n }\n var d = this.dimension\n var state = this._state\n var velocity = this._velocity\n var statePtr = state.length-d\n var bounds = this.bounds\n var lo = bounds[0]\n var hi = bounds[1]\n var dt = t - t0\n this._time.push(t)\n for(var i=d-1; i>=0; --i) {\n state.push(clamp(lo[i], hi[i], state[statePtr] + dt * velocity[statePtr]))\n velocity.push(0)\n statePtr += 1\n }\n}\n\nfunction getZero(d) {\n var result = new Array(d)\n for(var i=0; iFormat: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nexport function perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","module.exports = slerp\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nfunction slerp (out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3]\n\n var omega, cosom, sinom, scale0, scale1\n\n // calc cosine\n cosom = ax * bx + ay * by + az * bz + aw * bw\n // adjust signs (if necessary)\n if (cosom < 0.0) {\n cosom = -cosom\n bx = -bx\n by = -by\n bz = -bz\n bw = -bw\n }\n // calculate coefficients\n if ((1.0 - cosom) > 0.000001) {\n // standard case (slerp)\n omega = Math.acos(cosom)\n sinom = Math.sin(omega)\n scale0 = Math.sin((1.0 - t) * omega) / sinom\n scale1 = Math.sin(t * omega) / sinom\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t\n scale1 = t\n }\n // calculate final values\n out[0] = scale0 * ax + scale1 * bx\n out[1] = scale0 * ay + scale1 * by\n out[2] = scale0 * az + scale1 * bz\n out[3] = scale0 * aw + scale1 * bw\n\n return out\n}\n","module.exports = cross;\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nfunction cross(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2],\n bx = b[0], by = b[1], bz = b[2]\n\n out[0] = ay * bz - az * by\n out[1] = az * bx - ax * bz\n out[2] = ax * by - ay * bx\n return out\n}","module.exports = dot;\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}","module.exports = length;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nfunction length(a) {\n var x = a[0],\n y = a[1],\n z = a[2]\n return Math.sqrt(x*x + y*y + z*z)\n}","module.exports = lerp;\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nfunction lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2]\n out[0] = ax + t * (b[0] - ax)\n out[1] = ay + t * (b[1] - ay)\n out[2] = az + t * (b[2] - az)\n return out\n}","module.exports = normalize;\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nfunction normalize(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2]\n var len = x*x + y*y + z*z\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len)\n out[0] = a[0] * len\n out[1] = a[1] * len\n out[2] = a[2] * len\n }\n return out\n}","'use strict'\r\n\r\nvar isBrowser = require('is-browser')\r\n\r\nfunction detect() {\r\n\tvar supported = false\r\n\r\n\ttry {\r\n\t\tvar opts = Object.defineProperty({}, 'passive', {\r\n\t\t\tget: function() {\r\n\t\t\t\tsupported = true\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\twindow.addEventListener('test', null, opts)\r\n\t\twindow.removeEventListener('test', null, opts)\r\n\t} catch(e) {\r\n\t\tsupported = false\r\n\t}\r\n\r\n\treturn supported\r\n}\r\n\r\nmodule.exports = isBrowser && detect()\r\n","module.exports = true;","/*jshint unused:true*/\n/*\nInput: matrix ; a 4x4 matrix\nOutput: translation ; a 3 component vector\n scale ; a 3 component vector\n skew ; skew factors XY,XZ,YZ represented as a 3 component vector\n perspective ; a 4 component vector\n quaternion ; a 4 component vector\nReturns false if the matrix cannot be decomposed, true if it can\n\n\nReferences:\nhttps://github.com/kamicane/matrix3d/blob/master/lib/Matrix3d.js\nhttps://github.com/ChromiumWebApps/chromium/blob/master/ui/gfx/transform_util.cc\nhttp://www.w3.org/TR/css3-transforms/#decomposing-a-3d-matrix\n*/\n\nvar normalize = require('./normalize')\n\nvar create = require('gl-mat4/create')\nvar clone = require('gl-mat4/clone')\nvar determinant = require('gl-mat4/determinant')\nvar invert = require('gl-mat4/invert')\nvar transpose = require('gl-mat4/transpose')\nvar vec3 = {\n length: require('gl-vec3/length'),\n normalize: require('gl-vec3/normalize'),\n dot: require('gl-vec3/dot'),\n cross: require('gl-vec3/cross')\n}\n\nvar tmp = create()\nvar perspectiveMatrix = create()\nvar tmpVec4 = [0, 0, 0, 0]\nvar row = [ [0,0,0], [0,0,0], [0,0,0] ]\nvar pdum3 = [0,0,0]\n\nmodule.exports = function decomposeMat4(matrix, translation, scale, skew, perspective, quaternion) {\n if (!translation) translation = [0,0,0]\n if (!scale) scale = [0,0,0]\n if (!skew) skew = [0,0,0]\n if (!perspective) perspective = [0,0,0,1]\n if (!quaternion) quaternion = [0,0,0,1]\n\n //normalize, if not possible then bail out early\n if (!normalize(tmp, matrix))\n return false\n\n // perspectiveMatrix is used to solve for perspective, but it also provides\n // an easy way to test for singularity of the upper 3x3 component.\n clone(perspectiveMatrix, tmp)\n\n perspectiveMatrix[3] = 0\n perspectiveMatrix[7] = 0\n perspectiveMatrix[11] = 0\n perspectiveMatrix[15] = 1\n\n // If the perspectiveMatrix is not invertible, we are also unable to\n // decompose, so we'll bail early. Constant taken from SkMatrix44::invert.\n if (Math.abs(determinant(perspectiveMatrix) < 1e-8))\n return false\n\n var a03 = tmp[3], a13 = tmp[7], a23 = tmp[11],\n a30 = tmp[12], a31 = tmp[13], a32 = tmp[14], a33 = tmp[15]\n\n // First, isolate perspective.\n if (a03 !== 0 || a13 !== 0 || a23 !== 0) {\n tmpVec4[0] = a03\n tmpVec4[1] = a13\n tmpVec4[2] = a23\n tmpVec4[3] = a33\n\n // Solve the equation by inverting perspectiveMatrix and multiplying\n // rightHandSide by the inverse.\n // resuing the perspectiveMatrix here since it's no longer needed\n var ret = invert(perspectiveMatrix, perspectiveMatrix)\n if (!ret) return false\n transpose(perspectiveMatrix, perspectiveMatrix)\n\n //multiply by transposed inverse perspective matrix, into perspective vec4\n vec4multMat4(perspective, tmpVec4, perspectiveMatrix)\n } else { \n //no perspective\n perspective[0] = perspective[1] = perspective[2] = 0\n perspective[3] = 1\n }\n\n // Next take care of translation\n translation[0] = a30\n translation[1] = a31\n translation[2] = a32\n\n // Now get scale and shear. 'row' is a 3 element array of 3 component vectors\n mat3from4(row, tmp)\n\n // Compute X scale factor and normalize first row.\n scale[0] = vec3.length(row[0])\n vec3.normalize(row[0], row[0])\n\n // Compute XY shear factor and make 2nd row orthogonal to 1st.\n skew[0] = vec3.dot(row[0], row[1])\n combine(row[1], row[1], row[0], 1.0, -skew[0])\n\n // Now, compute Y scale and normalize 2nd row.\n scale[1] = vec3.length(row[1])\n vec3.normalize(row[1], row[1])\n skew[0] /= scale[1]\n\n // Compute XZ and YZ shears, orthogonalize 3rd row\n skew[1] = vec3.dot(row[0], row[2])\n combine(row[2], row[2], row[0], 1.0, -skew[1])\n skew[2] = vec3.dot(row[1], row[2])\n combine(row[2], row[2], row[1], 1.0, -skew[2])\n\n // Next, get Z scale and normalize 3rd row.\n scale[2] = vec3.length(row[2])\n vec3.normalize(row[2], row[2])\n skew[1] /= scale[2]\n skew[2] /= scale[2]\n\n\n // At this point, the matrix (in rows) is orthonormal.\n // Check for a coordinate system flip. If the determinant\n // is -1, then negate the matrix and the scaling factors.\n vec3.cross(pdum3, row[1], row[2])\n if (vec3.dot(row[0], pdum3) < 0) {\n for (var i = 0; i < 3; i++) {\n scale[i] *= -1;\n row[i][0] *= -1\n row[i][1] *= -1\n row[i][2] *= -1\n }\n }\n\n // Now, get the rotations out\n quaternion[0] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] - row[1][1] - row[2][2], 0))\n quaternion[1] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] + row[1][1] - row[2][2], 0))\n quaternion[2] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] - row[1][1] + row[2][2], 0))\n quaternion[3] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] + row[1][1] + row[2][2], 0))\n\n if (row[2][1] > row[1][2])\n quaternion[0] = -quaternion[0]\n if (row[0][2] > row[2][0])\n quaternion[1] = -quaternion[1]\n if (row[1][0] > row[0][1])\n quaternion[2] = -quaternion[2]\n return true\n}\n\n//will be replaced by gl-vec4 eventually\nfunction vec4multMat4(out, a, m) {\n var x = a[0], y = a[1], z = a[2], w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n\n//gets upper-left of a 4x4 matrix into a 3x3 of vectors\nfunction mat3from4(out, mat4x4) {\n out[0][0] = mat4x4[0]\n out[0][1] = mat4x4[1]\n out[0][2] = mat4x4[2]\n \n out[1][0] = mat4x4[4]\n out[1][1] = mat4x4[5]\n out[1][2] = mat4x4[6]\n\n out[2][0] = mat4x4[8]\n out[2][1] = mat4x4[9]\n out[2][2] = mat4x4[10]\n}\n\nfunction combine(out, a, b, scale1, scale2) {\n out[0] = a[0] * scale1 + b[0] * scale2\n out[1] = a[1] * scale1 + b[1] * scale2\n out[2] = a[2] * scale1 + b[2] * scale2\n}","module.exports = function normalize(out, mat) {\n var m44 = mat[15]\n // Cannot normalize.\n if (m44 === 0) \n return false\n var scale = 1 / m44\n for (var i=0; i<16; i++)\n out[i] = mat[i] * scale\n return true\n}","var lerp = require('gl-vec3/lerp')\n\nvar recompose = require('mat4-recompose')\nvar decompose = require('mat4-decompose')\nvar determinant = require('gl-mat4/determinant')\nvar slerp = require('quat-slerp')\n\nvar state0 = state()\nvar state1 = state()\nvar tmp = state()\n\nmodule.exports = interpolate\nfunction interpolate(out, start, end, alpha) {\n if (determinant(start) === 0 || determinant(end) === 0)\n return false\n\n //decompose the start and end matrices into individual components\n var r0 = decompose(start, state0.translate, state0.scale, state0.skew, state0.perspective, state0.quaternion)\n var r1 = decompose(end, state1.translate, state1.scale, state1.skew, state1.perspective, state1.quaternion)\n if (!r0 || !r1)\n return false \n\n\n //now lerp/slerp the start and end components into a temporary lerp(tmptranslate, state0.translate, state1.translate, alpha)\n lerp(tmp.translate, state0.translate, state1.translate, alpha)\n lerp(tmp.skew, state0.skew, state1.skew, alpha)\n lerp(tmp.scale, state0.scale, state1.scale, alpha)\n lerp(tmp.perspective, state0.perspective, state1.perspective, alpha)\n slerp(tmp.quaternion, state0.quaternion, state1.quaternion, alpha)\n\n //and recompose into our 'out' matrix\n recompose(out, tmp.translate, tmp.scale, tmp.skew, tmp.perspective, tmp.quaternion)\n return true\n}\n\nfunction state() {\n return {\n translate: vec3(),\n scale: vec3(1),\n skew: vec3(),\n perspective: vec4(),\n quaternion: vec4()\n }\n}\n\nfunction vec3(n) {\n return [n||0,n||0,n||0]\n}\n\nfunction vec4() {\n return [0,0,0,1]\n}","/*\nInput: translation ; a 3 component vector\n scale ; a 3 component vector\n skew ; skew factors XY,XZ,YZ represented as a 3 component vector\n perspective ; a 4 component vector\n quaternion ; a 4 component vector\nOutput: matrix ; a 4x4 matrix\n\nFrom: http://www.w3.org/TR/css3-transforms/#recomposing-to-a-3d-matrix\n*/\n\nvar mat4 = {\n identity: require('gl-mat4/identity'),\n translate: require('gl-mat4/translate'),\n multiply: require('gl-mat4/multiply'),\n create: require('gl-mat4/create'),\n scale: require('gl-mat4/scale'),\n fromRotationTranslation: require('gl-mat4/fromRotationTranslation')\n}\n\nvar rotationMatrix = mat4.create()\nvar temp = mat4.create()\n\nmodule.exports = function recomposeMat4(matrix, translation, scale, skew, perspective, quaternion) {\n mat4.identity(matrix)\n\n //apply translation & rotation\n mat4.fromRotationTranslation(matrix, quaternion, translation)\n\n //apply perspective\n matrix[3] = perspective[0]\n matrix[7] = perspective[1]\n matrix[11] = perspective[2]\n matrix[15] = perspective[3]\n \n // apply skew\n // temp is a identity 4x4 matrix initially\n mat4.identity(temp)\n\n if (skew[2] !== 0) {\n temp[9] = skew[2]\n mat4.multiply(matrix, matrix, temp)\n }\n\n if (skew[1] !== 0) {\n temp[9] = 0\n temp[8] = skew[1]\n mat4.multiply(matrix, matrix, temp)\n }\n\n if (skew[0] !== 0) {\n temp[8] = 0\n temp[4] = skew[0]\n mat4.multiply(matrix, matrix, temp)\n }\n\n //apply scale\n mat4.scale(matrix, matrix, scale)\n return matrix\n}","'use strict'\n\nvar bsearch = require('binary-search-bounds')\nvar m4interp = require('mat4-interpolate')\nvar invert44 = require('gl-mat4/invert')\nvar rotateX = require('gl-mat4/rotateX')\nvar rotateY = require('gl-mat4/rotateY')\nvar rotateZ = require('gl-mat4/rotateZ')\nvar lookAt = require('gl-mat4/lookAt')\nvar translate = require('gl-mat4/translate')\nvar scale = require('gl-mat4/scale')\nvar normalize = require('gl-vec3/normalize')\n\nvar DEFAULT_CENTER = [0,0,0]\n\nmodule.exports = createMatrixCameraController\n\nfunction MatrixCameraController(initialMatrix) {\n this._components = initialMatrix.slice()\n this._time = [0]\n this.prevMatrix = initialMatrix.slice()\n this.nextMatrix = initialMatrix.slice()\n this.computedMatrix = initialMatrix.slice()\n this.computedInverse = initialMatrix.slice()\n this.computedEye = [0,0,0]\n this.computedUp = [0,0,0]\n this.computedCenter = [0,0,0]\n this.computedRadius = [0]\n this._limits = [-Infinity, Infinity]\n}\n\nvar proto = MatrixCameraController.prototype\n\nproto.recalcMatrix = function(t) {\n var time = this._time\n var tidx = bsearch.le(time, t)\n var mat = this.computedMatrix\n if(tidx < 0) {\n return\n }\n var comps = this._components\n if(tidx === time.length-1) {\n var ptr = 16*tidx\n for(var i=0; i<16; ++i) {\n mat[i] = comps[ptr++]\n }\n } else {\n var dt = (time[tidx+1] - time[tidx])\n var ptr = 16*tidx\n var prev = this.prevMatrix\n var allEqual = true\n for(var i=0; i<16; ++i) {\n prev[i] = comps[ptr++]\n }\n var next = this.nextMatrix\n for(var i=0; i<16; ++i) {\n next[i] = comps[ptr++]\n allEqual = allEqual && (prev[i] === next[i])\n }\n if(dt < 1e-6 || allEqual) {\n for(var i=0; i<16; ++i) {\n mat[i] = prev[i]\n }\n } else {\n m4interp(mat, prev, next, (t - time[tidx])/dt)\n }\n }\n\n var up = this.computedUp\n up[0] = mat[1]\n up[1] = mat[5]\n up[2] = mat[9]\n normalize(up, up)\n\n var imat = this.computedInverse\n invert44(imat, mat)\n var eye = this.computedEye\n var w = imat[15]\n eye[0] = imat[12]/w\n eye[1] = imat[13]/w\n eye[2] = imat[14]/w\n\n var center = this.computedCenter\n var radius = Math.exp(this.computedRadius[0])\n for(var i=0; i<3; ++i) {\n center[i] = eye[i] - mat[2+4*i] * radius\n }\n}\n\nproto.idle = function(t) {\n if(t < this.lastT()) {\n return\n }\n var mc = this._components\n var ptr = mc.length-16\n for(var i=0; i<16; ++i) {\n mc.push(mc[ptr++])\n }\n this._time.push(t)\n}\n\nproto.flush = function(t) {\n var idx = bsearch.gt(this._time, t) - 2\n if(idx < 0) {\n return\n }\n this._time.splice(0, idx)\n this._components.splice(0, 16*idx)\n}\n\nproto.lastT = function() {\n return this._time[this._time.length-1]\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n eye = eye || this.computedEye\n center = center || DEFAULT_CENTER\n up = up || this.computedUp\n this.setMatrix(t, lookAt(this.computedMatrix, eye, center, up))\n var d2 = 0.0\n for(var i=0; i<3; ++i) {\n d2 += Math.pow(center[i] - eye[i], 2)\n }\n d2 = Math.log(Math.sqrt(d2))\n this.computedRadius[0] = d2\n}\n\nproto.rotate = function(t, yaw, pitch, roll) {\n this.recalcMatrix(t)\n var mat = this.computedInverse\n if(yaw) rotateY(mat, mat, yaw)\n if(pitch) rotateX(mat, mat, pitch)\n if(roll) rotateZ(mat, mat, roll)\n this.setMatrix(t, invert44(this.computedMatrix, mat))\n}\n\nvar tvec = [0,0,0]\n\nproto.pan = function(t, dx, dy, dz) {\n tvec[0] = -(dx || 0.0)\n tvec[1] = -(dy || 0.0)\n tvec[2] = -(dz || 0.0)\n this.recalcMatrix(t)\n var mat = this.computedInverse\n translate(mat, mat, tvec)\n this.setMatrix(t, invert44(mat, mat))\n}\n\nproto.translate = function(t, dx, dy, dz) {\n tvec[0] = dx || 0.0\n tvec[1] = dy || 0.0\n tvec[2] = dz || 0.0\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n translate(mat, mat, tvec)\n this.setMatrix(t, mat)\n}\n\nproto.setMatrix = function(t, mat) {\n if(t < this.lastT()) {\n return\n }\n this._time.push(t)\n for(var i=0; i<16; ++i) {\n this._components.push(mat[i])\n }\n}\n\nproto.setDistance = function(t, d) {\n this.computedRadius[0] = d\n}\n\nproto.setDistanceLimits = function(a,b) {\n var lim = this._limits\n lim[0] = a\n lim[1] = b\n}\n\nproto.getDistanceLimits = function(out) {\n var lim = this._limits\n if(out) {\n out[0] = lim[0]\n out[1] = lim[1]\n return out\n }\n return lim\n}\n\nfunction createMatrixCameraController(options) {\n options = options || {}\n var matrix = options.matrix || \n [1,0,0,0,\n 0,1,0,0,\n 0,0,1,0,\n 0,0,0,1]\n return new MatrixCameraController(matrix)\n}\n","'use strict'\n\nmodule.exports = mouseListen\n\nvar mouse = require('mouse-event')\n\nfunction mouseListen (element, callback) {\n if (!callback) {\n callback = element\n element = window\n }\n\n var buttonState = 0\n var x = 0\n var y = 0\n var mods = {\n shift: false,\n alt: false,\n control: false,\n meta: false\n }\n var attached = false\n\n function updateMods (ev) {\n var changed = false\n if ('altKey' in ev) {\n changed = changed || ev.altKey !== mods.alt\n mods.alt = !!ev.altKey\n }\n if ('shiftKey' in ev) {\n changed = changed || ev.shiftKey !== mods.shift\n mods.shift = !!ev.shiftKey\n }\n if ('ctrlKey' in ev) {\n changed = changed || ev.ctrlKey !== mods.control\n mods.control = !!ev.ctrlKey\n }\n if ('metaKey' in ev) {\n changed = changed || ev.metaKey !== mods.meta\n mods.meta = !!ev.metaKey\n }\n return changed\n }\n\n function handleEvent (nextButtons, ev) {\n var nextX = mouse.x(ev)\n var nextY = mouse.y(ev)\n if ('buttons' in ev) {\n nextButtons = ev.buttons | 0\n }\n if (nextButtons !== buttonState ||\n nextX !== x ||\n nextY !== y ||\n updateMods(ev)) {\n buttonState = nextButtons | 0\n x = nextX || 0\n y = nextY || 0\n callback && callback(buttonState, x, y, mods)\n }\n }\n\n function clearState (ev) {\n handleEvent(0, ev)\n }\n\n function handleBlur () {\n if (buttonState ||\n x ||\n y ||\n mods.shift ||\n mods.alt ||\n mods.meta ||\n mods.control) {\n x = y = 0\n buttonState = 0\n mods.shift = mods.alt = mods.control = mods.meta = false\n callback && callback(0, 0, 0, mods)\n }\n }\n\n function handleMods (ev) {\n if (updateMods(ev)) {\n callback && callback(buttonState, x, y, mods)\n }\n }\n\n function handleMouseMove (ev) {\n if (mouse.buttons(ev) === 0) {\n handleEvent(0, ev)\n } else {\n handleEvent(buttonState, ev)\n }\n }\n\n function handleMouseDown (ev) {\n handleEvent(buttonState | mouse.buttons(ev), ev)\n }\n\n function handleMouseUp (ev) {\n handleEvent(buttonState & ~mouse.buttons(ev), ev)\n }\n\n function attachListeners () {\n if (attached) {\n return\n }\n attached = true\n\n element.addEventListener('mousemove', handleMouseMove)\n\n element.addEventListener('mousedown', handleMouseDown)\n\n element.addEventListener('mouseup', handleMouseUp)\n\n element.addEventListener('mouseleave', clearState)\n element.addEventListener('mouseenter', clearState)\n element.addEventListener('mouseout', clearState)\n element.addEventListener('mouseover', clearState)\n\n element.addEventListener('blur', handleBlur)\n\n element.addEventListener('keyup', handleMods)\n element.addEventListener('keydown', handleMods)\n element.addEventListener('keypress', handleMods)\n\n if (element !== window) {\n window.addEventListener('blur', handleBlur)\n\n window.addEventListener('keyup', handleMods)\n window.addEventListener('keydown', handleMods)\n window.addEventListener('keypress', handleMods)\n }\n }\n\n function detachListeners () {\n if (!attached) {\n return\n }\n attached = false\n\n element.removeEventListener('mousemove', handleMouseMove)\n\n element.removeEventListener('mousedown', handleMouseDown)\n\n element.removeEventListener('mouseup', handleMouseUp)\n\n element.removeEventListener('mouseleave', clearState)\n element.removeEventListener('mouseenter', clearState)\n element.removeEventListener('mouseout', clearState)\n element.removeEventListener('mouseover', clearState)\n\n element.removeEventListener('blur', handleBlur)\n\n element.removeEventListener('keyup', handleMods)\n element.removeEventListener('keydown', handleMods)\n element.removeEventListener('keypress', handleMods)\n\n if (element !== window) {\n window.removeEventListener('blur', handleBlur)\n\n window.removeEventListener('keyup', handleMods)\n window.removeEventListener('keydown', handleMods)\n window.removeEventListener('keypress', handleMods)\n }\n }\n\n // Attach listeners\n attachListeners()\n\n var result = {\n element: element\n }\n\n Object.defineProperties(result, {\n enabled: {\n get: function () { return attached },\n set: function (f) {\n if (f) {\n attachListeners()\n } else {\n detachListeners()\n }\n },\n enumerable: true\n },\n buttons: {\n get: function () { return buttonState },\n enumerable: true\n },\n x: {\n get: function () { return x },\n enumerable: true\n },\n y: {\n get: function () { return y },\n enumerable: true\n },\n mods: {\n get: function () { return mods },\n enumerable: true\n }\n })\n\n return result\n}\n","var rootPosition = { left: 0, top: 0 }\n\nmodule.exports = mouseEventOffset\nfunction mouseEventOffset (ev, target, out) {\n target = target || ev.currentTarget || ev.srcElement\n if (!Array.isArray(out)) {\n out = [ 0, 0 ]\n }\n var cx = ev.clientX || 0\n var cy = ev.clientY || 0\n var rect = getBoundingClientOffset(target)\n out[0] = cx - rect.left\n out[1] = cy - rect.top\n return out\n}\n\nfunction getBoundingClientOffset (element) {\n if (element === window ||\n element === document ||\n element === document.body) {\n return rootPosition\n } else {\n return element.getBoundingClientRect()\n }\n}\n","'use strict'\n\nfunction mouseButtons(ev) {\n if(typeof ev === 'object') {\n if('buttons' in ev) {\n return ev.buttons\n } else if('which' in ev) {\n var b = ev.which\n if(b === 2) {\n return 4\n } else if(b === 3) {\n return 2\n } else if(b > 0) {\n return 1<<(b-1)\n }\n } else if('button' in ev) {\n var b = ev.button\n if(b === 1) {\n return 4\n } else if(b === 2) {\n return 2\n } else if(b >= 0) {\n return 1< 0) {\n var l = Math.sqrt(tr + 1.0)\n out[0] = 0.5 * (uz - fy) / l\n out[1] = 0.5 * (fx - rz) / l\n out[2] = 0.5 * (ry - uy) / l\n out[3] = 0.5 * l\n } else {\n var tf = Math.max(rx, uy, fz)\n var l = Math.sqrt(2 * tf - tr + 1.0)\n if(rx >= tf) {\n //x y z order\n out[0] = 0.5 * l\n out[1] = 0.5 * (ux + ry) / l\n out[2] = 0.5 * (fx + rz) / l\n out[3] = 0.5 * (uz - fy) / l\n } else if(uy >= tf) {\n //y z x order\n out[0] = 0.5 * (ry + ux) / l\n out[1] = 0.5 * l\n out[2] = 0.5 * (fy + uz) / l\n out[3] = 0.5 * (fx - rz) / l\n } else {\n //z x y order\n out[0] = 0.5 * (rz + fx) / l\n out[1] = 0.5 * (uz + fy) / l\n out[2] = 0.5 * l\n out[3] = 0.5 * (ry - ux) / l\n }\n }\n return out\n}","'use strict'\n\nmodule.exports = createOrbitController\n\nvar filterVector = require('filtered-vector')\nvar lookAt = require('gl-mat4/lookAt')\nvar mat4FromQuat = require('gl-mat4/fromQuat')\nvar invert44 = require('gl-mat4/invert')\nvar quatFromFrame = require('./lib/quatFromFrame')\n\nfunction len3(x,y,z) {\n return Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2))\n}\n\nfunction len4(w,x,y,z) {\n return Math.sqrt(Math.pow(w,2) + Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2))\n}\n\nfunction normalize4(out, a) {\n var ax = a[0]\n var ay = a[1]\n var az = a[2]\n var aw = a[3]\n var al = len4(ax, ay, az, aw)\n if(al > 1e-6) {\n out[0] = ax/al\n out[1] = ay/al\n out[2] = az/al\n out[3] = aw/al\n } else {\n out[0] = out[1] = out[2] = 0.0\n out[3] = 1.0\n }\n}\n\nfunction OrbitCameraController(initQuat, initCenter, initRadius) {\n this.radius = filterVector([initRadius])\n this.center = filterVector(initCenter)\n this.rotation = filterVector(initQuat)\n\n this.computedRadius = this.radius.curve(0)\n this.computedCenter = this.center.curve(0)\n this.computedRotation = this.rotation.curve(0)\n this.computedUp = [0.1,0,0]\n this.computedEye = [0.1,0,0]\n this.computedMatrix = [0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]\n\n this.recalcMatrix(0)\n}\n\nvar proto = OrbitCameraController.prototype\n\nproto.lastT = function() {\n return Math.max(\n this.radius.lastT(),\n this.center.lastT(),\n this.rotation.lastT())\n}\n\nproto.recalcMatrix = function(t) {\n this.radius.curve(t)\n this.center.curve(t)\n this.rotation.curve(t)\n\n var quat = this.computedRotation\n normalize4(quat, quat)\n\n var mat = this.computedMatrix\n mat4FromQuat(mat, quat)\n\n var center = this.computedCenter\n var eye = this.computedEye\n var up = this.computedUp\n var radius = Math.exp(this.computedRadius[0])\n\n eye[0] = center[0] + radius * mat[2]\n eye[1] = center[1] + radius * mat[6]\n eye[2] = center[2] + radius * mat[10]\n up[0] = mat[1]\n up[1] = mat[5]\n up[2] = mat[9]\n\n for(var i=0; i<3; ++i) {\n var rr = 0.0\n for(var j=0; j<3; ++j) {\n rr += mat[i+4*j] * eye[j]\n }\n mat[12+i] = -rr\n }\n}\n\nproto.getMatrix = function(t, result) {\n this.recalcMatrix(t)\n var m = this.computedMatrix\n if(result) {\n for(var i=0; i<16; ++i) {\n result[i] = m[i]\n }\n return result\n }\n return m\n}\n\nproto.idle = function(t) {\n this.center.idle(t)\n this.radius.idle(t)\n this.rotation.idle(t)\n}\n\nproto.flush = function(t) {\n this.center.flush(t)\n this.radius.flush(t)\n this.rotation.flush(t)\n}\n\nproto.pan = function(t, dx, dy, dz) {\n dx = dx || 0.0\n dy = dy || 0.0\n dz = dz || 0.0\n\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n\n var fx = mat[2]\n var fy = mat[6]\n var fz = mat[10]\n var fu = fx * ux + fy * uy + fz * uz\n var fr = fx * rx + fy * ry + fz * rz\n fx -= fu * ux + fr * rx\n fy -= fu * uy + fr * ry\n fz -= fu * uz + fr * rz\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n var vx = rx * dx + ux * dy\n var vy = ry * dx + uy * dy\n var vz = rz * dx + uz * dy\n\n this.center.move(t, vx, vy, vz)\n\n //Update z-component of radius\n var radius = Math.exp(this.computedRadius[0])\n radius = Math.max(1e-4, radius + dz)\n this.radius.set(t, Math.log(radius))\n}\n\nproto.rotate = function(t, dx, dy, dz) {\n this.recalcMatrix(t)\n\n dx = dx||0.0\n dy = dy||0.0\n\n var mat = this.computedMatrix\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n\n var fx = mat[2]\n var fy = mat[6]\n var fz = mat[10]\n\n var qx = dx * rx + dy * ux\n var qy = dx * ry + dy * uy\n var qz = dx * rz + dy * uz\n\n var bx = -(fy * qz - fz * qy)\n var by = -(fz * qx - fx * qz)\n var bz = -(fx * qy - fy * qx) \n var bw = Math.sqrt(Math.max(0.0, 1.0 - Math.pow(bx,2) - Math.pow(by,2) - Math.pow(bz,2)))\n var bl = len4(bx, by, bz, bw)\n if(bl > 1e-6) {\n bx /= bl\n by /= bl\n bz /= bl\n bw /= bl\n } else {\n bx = by = bz = 0.0\n bw = 1.0\n }\n\n var rotation = this.computedRotation\n var ax = rotation[0]\n var ay = rotation[1]\n var az = rotation[2]\n var aw = rotation[3]\n\n var cx = ax*bw + aw*bx + ay*bz - az*by\n var cy = ay*bw + aw*by + az*bx - ax*bz\n var cz = az*bw + aw*bz + ax*by - ay*bx\n var cw = aw*bw - ax*bx - ay*by - az*bz\n \n //Apply roll\n if(dz) {\n bx = fx\n by = fy\n bz = fz\n var s = Math.sin(dz) / len3(bx, by, bz)\n bx *= s\n by *= s\n bz *= s\n bw = Math.cos(dx)\n cx = cx*bw + cw*bx + cy*bz - cz*by\n cy = cy*bw + cw*by + cz*bx - cx*bz\n cz = cz*bw + cw*bz + cx*by - cy*bx\n cw = cw*bw - cx*bx - cy*by - cz*bz\n }\n\n var cl = len4(cx, cy, cz, cw)\n if(cl > 1e-6) {\n cx /= cl\n cy /= cl\n cz /= cl\n cw /= cl\n } else {\n cx = cy = cz = 0.0\n cw = 1.0\n }\n\n this.rotation.set(t, cx, cy, cz, cw)\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n\n center = center || this.computedCenter\n eye = eye || this.computedEye\n up = up || this.computedUp\n\n var mat = this.computedMatrix\n lookAt(mat, eye, center, up)\n\n var rotation = this.computedRotation\n quatFromFrame(rotation,\n mat[0], mat[1], mat[2],\n mat[4], mat[5], mat[6],\n mat[8], mat[9], mat[10])\n normalize4(rotation, rotation)\n this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3])\n\n var fl = 0.0\n for(var i=0; i<3; ++i) {\n fl += Math.pow(center[i] - eye[i], 2)\n }\n this.radius.set(t, 0.5 * Math.log(Math.max(fl, 1e-6)))\n\n this.center.set(t, center[0], center[1], center[2])\n}\n\nproto.translate = function(t, dx, dy, dz) {\n this.center.move(t,\n dx||0.0,\n dy||0.0,\n dz||0.0)\n}\n\nproto.setMatrix = function(t, matrix) {\n\n var rotation = this.computedRotation\n quatFromFrame(rotation,\n matrix[0], matrix[1], matrix[2],\n matrix[4], matrix[5], matrix[6],\n matrix[8], matrix[9], matrix[10])\n normalize4(rotation, rotation)\n this.rotation.set(t, rotation[0], rotation[1], rotation[2], rotation[3])\n\n var mat = this.computedMatrix\n invert44(mat, matrix)\n var w = mat[15]\n if(Math.abs(w) > 1e-6) {\n var cx = mat[12]/w\n var cy = mat[13]/w\n var cz = mat[14]/w\n\n this.recalcMatrix(t) \n var r = Math.exp(this.computedRadius[0])\n this.center.set(t, cx-mat[2]*r, cy-mat[6]*r, cz-mat[10]*r)\n this.radius.idle(t)\n } else {\n this.center.idle(t)\n this.radius.idle(t)\n }\n}\n\nproto.setDistance = function(t, d) {\n if(d > 0) {\n this.radius.set(t, Math.log(d))\n }\n}\n\nproto.setDistanceLimits = function(lo, hi) {\n if(lo > 0) {\n lo = Math.log(lo)\n } else {\n lo = -Infinity \n }\n if(hi > 0) {\n hi = Math.log(hi)\n } else {\n hi = Infinity\n }\n hi = Math.max(hi, lo)\n this.radius.bounds[0][0] = lo\n this.radius.bounds[1][0] = hi\n}\n\nproto.getDistanceLimits = function(out) {\n var bounds = this.radius.bounds\n if(out) {\n out[0] = Math.exp(bounds[0][0])\n out[1] = Math.exp(bounds[1][0])\n return out\n }\n return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ]\n}\n\nproto.toJSON = function() {\n this.recalcMatrix(this.lastT())\n return {\n center: this.computedCenter.slice(),\n rotation: this.computedRotation.slice(),\n distance: Math.log(this.computedRadius[0]),\n zoomMin: this.radius.bounds[0][0],\n zoomMax: this.radius.bounds[1][0]\n }\n}\n\nproto.fromJSON = function(options) {\n var t = this.lastT()\n var c = options.center\n if(c) {\n this.center.set(t, c[0], c[1], c[2])\n }\n var r = options.rotation\n if(r) {\n this.rotation.set(t, r[0], r[1], r[2], r[3])\n }\n var d = options.distance\n if(d && d > 0) {\n this.radius.set(t, Math.log(d))\n }\n this.setDistanceLimits(options.zoomMin, options.zoomMax)\n}\n\nfunction createOrbitController(options) {\n options = options || {}\n var center = options.center || [0,0,0]\n var rotation = options.rotation || [0,0,0,1]\n var radius = options.radius || 1.0\n\n center = [].slice.call(center, 0, 3)\n rotation = [].slice.call(rotation, 0, 4)\n normalize4(rotation, rotation)\n\n var result = new OrbitCameraController(\n rotation,\n center,\n Math.log(radius))\n\n result.setDistanceLimits(options.zoomMin, options.zoomMax)\n\n if('eye' in options || 'up' in options) {\n result.lookAt(0, options.eye, options.center, options.up)\n }\n\n return result\n}","module.exports = function parseUnit(str, out) {\n if (!out)\n out = [ 0, '' ]\n\n str = String(str)\n var num = parseFloat(str, 10)\n out[0] = num\n out[1] = str.match(/[\\d.\\-\\+]*\\s*(.*)/)[1] || ''\n return out\n}","module.exports = require('gl-quat/slerp')","module.exports =\n global.performance &&\n global.performance.now ? function now() {\n return performance.now()\n } : Date.now || function now() {\n return +new Date\n }\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.Stats=t()}(this,function(){\"use strict\";var c=function(){var n=0,l=document.createElement(\"div\");function e(e){return l.appendChild(e.dom),e}function t(e){for(var t=0;t*>(&buffer[offset]);\n let triangles: Array = new Array(20);\n let nextTriangles: Array = new Array();\n for (let i = 0; i < 20; ++i) {\n triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n }\n\n // Create 3-float buffer views into the backing buffer to represent positions\n let vertices: Array = new Array(12);\n for (let i = 0; i < 12; ++i) {\n vertices[i] =new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n }\n\n // Initialize normals for a 20-sided icosahedron\n vertices[0].set([ -X,N,Z,0 ]);\n vertices[1].set([ X,N,Z,0 ]);\n vertices[2].set([ -X,N,-Z,0 ]);\n vertices[3].set([ X,N,-Z,0 ]);\n vertices[4].set([ N,Z,X,0 ]);\n vertices[5].set([ N,Z,-X,0 ]);\n vertices[6].set([ N,-Z,X,0 ]);\n vertices[7].set([ N,-Z,-X,0 ]);\n vertices[8].set([ Z,X,N,0 ]);\n vertices[9].set([ -Z,X, N,0 ]);\n vertices[10].set([ Z,-X,N,0 ]);\n vertices[11].set([ -Z,-X,N,0 ]);\n\n // Initialize indices for a 20-sided icosahedron\n triangles[0].set([ 0,4,1 ]);\n triangles[1].set([ 0,9,4 ]);\n triangles[2].set([ 9,5,4 ]);\n triangles[3].set([ 4,5,8 ]);\n triangles[4].set([ 4,8,1 ]);\n triangles[5].set([ 8,10,1 ]);\n triangles[6].set([ 8,3,10 ]);\n triangles[7].set([ 5,3,8 ]);\n triangles[8].set([ 5,2,3 ]);\n triangles[9].set([ 2,7,3 ]);\n triangles[10].set([ 7,10,3 ]);\n triangles[11].set([ 7,6,10 ]);\n triangles[12].set([ 7,11,6 ]);\n triangles[13].set([ 11,0,6 ]);\n triangles[14].set([ 0,1,6 ],);\n triangles[15].set([ 6,1,10 ]);\n triangles[16].set([ 9,0,11 ]);\n triangles[17].set([ 9,11,2 ]);\n triangles[18].set([ 9,2,5 ]);\n triangles[19].set([ 7,2,11 ]);\n\n // This loop subdivides the icosahedron\n for (let s = 0; s < this.subdivisions; ++s) {\n b = 1 - b;\n nextTriangles.length = triangles.length * 4;\n let triangleIdx = 0;\n\n // edgeMap maps a pair of vertex indices to a vertex index at their midpoint\n // The function `mid` will get that midpoint vertex if it has already been created\n // or it will create the vertex and add it to the map\n let edgeMap: Map = new Map();\n function mid(v0: number, v1: number): number {\n let key = [v0, v1].sort().join('_');\n if (!edgeMap.has(key)) {\n let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n vec4.add(midpoint, vertices[v0], vertices[v1]);\n vec4.normalize(midpoint, midpoint);\n edgeMap.set(key, vertices.length);\n vertices.push(midpoint);\n }\n return edgeMap.get(key);\n }\n\n for (let t = 0; t < triangles.length; ++t) {\n let v0 = triangles[t][0];\n let v1 = triangles[t][1];\n let v2 = triangles[t][2];\n let v3 = mid(v0, v1); // Get or create a vertex between these two vertices\n let v4 = mid(v1, v2);\n let v5 = mid(v2, v0);\n\n let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3);\n\n let triangleOffset = nextTriangles.length;\n t0.set([v0, v3, v5]);\n t1.set([v3, v4, v5]);\n t2.set([v3, v1, v4]);\n t3.set([v5, v4, v2]);\n }\n\n // swap buffers\n let temp = triangles;\n triangles = nextTriangles;\n nextTriangles = temp;\n }\n\n if (b === 1) {\n // if indices did not end up in buffer0, copy them there now\n let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length);\n let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length);\n temp0.set(temp1);\n }\n\n // Populate one position for each normal\n for (let i = 0; i < vertices.length; ++i) {\n let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4);\n vec4.scaleAndAdd(pos, this.center, vertices[i], this.radius);\n }\n\n this.buffer = buffer0;\n this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3);\n this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4);\n this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4);\n\n this.generateIdx();\n this.generatePos();\n this.generateNor();\n\n this.count = this.indices.length;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW);\n\n console.log(`Created icosphere with ${vertices.length} vertices`);\n }\n};\n\nexport default Icosphere;\n","import {vec3, vec4} from 'gl-matrix';\nimport Drawable from '../rendering/gl/Drawable';\nimport {gl} from '../globals';\n\nclass Square extends Drawable {\n indices: Uint32Array;\n positions: Float32Array;\n normals: Float32Array;\n center: vec4;\n\n constructor(center: vec3) {\n super(); // Call the constructor of the super class. This is required.\n this.center = vec4.fromValues(center[0], center[1], center[2], 1);\n }\n\n create() {\n\n this.indices = new Uint32Array([0, 1, 2,\n 0, 2, 3]);\n this.normals = new Float32Array([0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0]);\n this.positions = new Float32Array([-1, -1, 0, 1,\n 1, -1, 0, 1,\n 1, 1, 0, 1,\n -1, 1, 0, 1]);\n\n this.generateIdx();\n this.generatePos();\n this.generateNor();\n\n this.count = this.indices.length;\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW);\n\n console.log(`Created square`);\n }\n};\n\nexport default Square;\n","\nexport var gl: WebGL2RenderingContext;\nexport function setGL(_gl: WebGL2RenderingContext) {\n gl = _gl;\n}\n","import {gl} from '../../globals';\n\nabstract class Drawable {\n count: number = 0;\n\n bufIdx: WebGLBuffer;\n bufPos: WebGLBuffer;\n bufNor: WebGLBuffer;\n\n idxBound: boolean = false;\n posBound: boolean = false;\n norBound: boolean = false;\n\n abstract create() : void;\n\n destory() {\n gl.deleteBuffer(this.bufIdx);\n gl.deleteBuffer(this.bufPos);\n gl.deleteBuffer(this.bufNor);\n }\n\n generateIdx() {\n this.idxBound = true;\n this.bufIdx = gl.createBuffer();\n }\n\n generatePos() {\n this.posBound = true;\n this.bufPos = gl.createBuffer();\n }\n\n generateNor() {\n this.norBound = true;\n this.bufNor = gl.createBuffer();\n }\n\n bindIdx(): boolean {\n if (this.idxBound) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx);\n }\n return this.idxBound;\n }\n\n bindPos(): boolean {\n if (this.posBound) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos);\n }\n return this.posBound;\n }\n\n bindNor(): boolean {\n if (this.norBound) {\n gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor);\n }\n return this.norBound;\n }\n\n elemCount(): number {\n return this.count;\n }\n\n drawMode(): GLenum {\n return gl.TRIANGLES;\n }\n};\n\nexport default Drawable;\n","import {mat4, vec4} from 'gl-matrix';\nimport Drawable from './Drawable';\nimport Camera from '../../Camera';\nimport {gl} from '../../globals';\nimport ShaderProgram from './ShaderProgram';\n\n// In this file, `gl` is accessible because it is imported above\nclass OpenGLRenderer {\n constructor(public canvas: HTMLCanvasElement) {\n }\n\n setClearColor(r: number, g: number, b: number, a: number) {\n gl.clearColor(r, g, b, a);\n }\n\n setSize(width: number, height: number) {\n this.canvas.width = width;\n this.canvas.height = height;\n }\n\n clear() {\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n }\n\n render(camera: Camera, prog: ShaderProgram, drawables: Array) {\n let model = mat4.create();\n let viewProj = mat4.create();\n let color = vec4.fromValues(1, 0, 0, 1);\n\n mat4.identity(model);\n mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix);\n prog.setModelMatrix(model);\n prog.setViewProjMatrix(viewProj);\n prog.setGeometryColor(color);\n\n for (let drawable of drawables) {\n prog.draw(drawable);\n }\n }\n};\n\nexport default OpenGLRenderer;\n","import {vec4, mat4} from 'gl-matrix';\nimport Drawable from './Drawable';\nimport {gl} from '../../globals';\n\nvar activeProgram: WebGLProgram = null;\n\nexport class Shader {\n shader: WebGLShader;\n\n constructor(type: number, source: string) {\n this.shader = gl.createShader(type);\n gl.shaderSource(this.shader, source);\n gl.compileShader(this.shader);\n\n if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) {\n throw gl.getShaderInfoLog(this.shader);\n }\n }\n};\n\nclass ShaderProgram {\n prog: WebGLProgram;\n\n attrPos: number;\n attrNor: number;\n attrCol: number;\n\n unifModel: WebGLUniformLocation;\n unifModelInvTr: WebGLUniformLocation;\n unifViewProj: WebGLUniformLocation;\n unifColor: WebGLUniformLocation;\n\n constructor(shaders: Array) {\n this.prog = gl.createProgram();\n\n for (let shader of shaders) {\n gl.attachShader(this.prog, shader.shader);\n }\n gl.linkProgram(this.prog);\n if (!gl.getProgramParameter(this.prog, gl.LINK_STATUS)) {\n throw gl.getProgramInfoLog(this.prog);\n }\n\n this.attrPos = gl.getAttribLocation(this.prog, \"vs_Pos\");\n this.attrNor = gl.getAttribLocation(this.prog, \"vs_Nor\");\n this.attrCol = gl.getAttribLocation(this.prog, \"vs_Col\");\n this.unifModel = gl.getUniformLocation(this.prog, \"u_Model\");\n this.unifModelInvTr = gl.getUniformLocation(this.prog, \"u_ModelInvTr\");\n this.unifViewProj = gl.getUniformLocation(this.prog, \"u_ViewProj\");\n this.unifColor = gl.getUniformLocation(this.prog, \"u_Color\");\n }\n\n use() {\n if (activeProgram !== this.prog) {\n gl.useProgram(this.prog);\n activeProgram = this.prog;\n }\n }\n\n setModelMatrix(model: mat4) {\n this.use();\n if (this.unifModel !== -1) {\n gl.uniformMatrix4fv(this.unifModel, false, model);\n }\n\n if (this.unifModelInvTr !== -1) {\n let modelinvtr: mat4 = mat4.create();\n mat4.transpose(modelinvtr, model);\n mat4.invert(modelinvtr, modelinvtr);\n gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr);\n }\n }\n\n setViewProjMatrix(vp: mat4) {\n this.use();\n if (this.unifViewProj !== -1) {\n gl.uniformMatrix4fv(this.unifViewProj, false, vp);\n }\n }\n\n setGeometryColor(color: vec4) {\n this.use();\n if (this.unifColor !== -1) {\n gl.uniform4fv(this.unifColor, color);\n }\n }\n\n draw(d: Drawable) {\n this.use();\n\n if (this.attrPos != -1 && d.bindPos()) {\n gl.enableVertexAttribArray(this.attrPos);\n gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0);\n }\n\n if (this.attrNor != -1 && d.bindNor()) {\n gl.enableVertexAttribArray(this.attrNor);\n gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0);\n }\n\n d.bindIdx();\n gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0);\n\n if (this.attrPos != -1) gl.disableVertexAttribArray(this.attrPos);\n if (this.attrNor != -1) gl.disableVertexAttribArray(this.attrNor);\n }\n};\n\nexport default ShaderProgram;\n","'use strict'\n\nmodule.exports = createTurntableController\n\nvar filterVector = require('filtered-vector')\nvar invert44 = require('gl-mat4/invert')\nvar rotateM = require('gl-mat4/rotate')\nvar cross = require('gl-vec3/cross')\nvar normalize3 = require('gl-vec3/normalize')\nvar dot3 = require('gl-vec3/dot')\n\nfunction len3(x, y, z) {\n return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2))\n}\n\nfunction clamp1(x) {\n return Math.min(1.0, Math.max(-1.0, x))\n}\n\nfunction findOrthoPair(v) {\n var vx = Math.abs(v[0])\n var vy = Math.abs(v[1])\n var vz = Math.abs(v[2])\n\n var u = [0,0,0]\n if(vx > Math.max(vy, vz)) {\n u[2] = 1\n } else if(vy > Math.max(vx, vz)) {\n u[0] = 1\n } else {\n u[1] = 1\n }\n\n var vv = 0\n var uv = 0\n for(var i=0; i<3; ++i ) {\n vv += v[i] * v[i]\n uv += u[i] * v[i]\n }\n for(var i=0; i<3; ++i) {\n u[i] -= (uv / vv) * v[i]\n }\n normalize3(u, u)\n return u\n}\n\nfunction TurntableController(zoomMin, zoomMax, center, up, right, radius, theta, phi) {\n this.center = filterVector(center)\n this.up = filterVector(up)\n this.right = filterVector(right)\n this.radius = filterVector([radius])\n this.angle = filterVector([theta, phi])\n this.angle.bounds = [[-Infinity,-Math.PI/2], [Infinity,Math.PI/2]]\n this.setDistanceLimits(zoomMin, zoomMax)\n\n this.computedCenter = this.center.curve(0)\n this.computedUp = this.up.curve(0)\n this.computedRight = this.right.curve(0)\n this.computedRadius = this.radius.curve(0)\n this.computedAngle = this.angle.curve(0)\n this.computedToward = [0,0,0]\n this.computedEye = [0,0,0]\n this.computedMatrix = new Array(16)\n for(var i=0; i<16; ++i) {\n this.computedMatrix[i] = 0.5\n }\n\n this.recalcMatrix(0)\n}\n\nvar proto = TurntableController.prototype\n\nproto.setDistanceLimits = function(minDist, maxDist) {\n if(minDist > 0) {\n minDist = Math.log(minDist)\n } else {\n minDist = -Infinity\n }\n if(maxDist > 0) {\n maxDist = Math.log(maxDist)\n } else {\n maxDist = Infinity\n }\n maxDist = Math.max(maxDist, minDist)\n this.radius.bounds[0][0] = minDist\n this.radius.bounds[1][0] = maxDist\n}\n\nproto.getDistanceLimits = function(out) {\n var bounds = this.radius.bounds[0]\n if(out) {\n out[0] = Math.exp(bounds[0][0])\n out[1] = Math.exp(bounds[1][0])\n return out\n }\n return [ Math.exp(bounds[0][0]), Math.exp(bounds[1][0]) ]\n}\n\nproto.recalcMatrix = function(t) {\n //Recompute curves\n this.center.curve(t)\n this.up.curve(t)\n this.right.curve(t)\n this.radius.curve(t)\n this.angle.curve(t)\n\n //Compute frame for camera matrix\n var up = this.computedUp\n var right = this.computedRight\n var uu = 0.0\n var ur = 0.0\n for(var i=0; i<3; ++i) {\n ur += up[i] * right[i]\n uu += up[i] * up[i]\n }\n var ul = Math.sqrt(uu)\n var rr = 0.0\n for(var i=0; i<3; ++i) {\n right[i] -= up[i] * ur / uu\n rr += right[i] * right[i]\n up[i] /= ul\n }\n var rl = Math.sqrt(rr)\n for(var i=0; i<3; ++i) {\n right[i] /= rl\n }\n\n //Compute toward vector\n var toward = this.computedToward\n cross(toward, up, right)\n normalize3(toward, toward)\n\n //Compute angular parameters\n var radius = Math.exp(this.computedRadius[0])\n var theta = this.computedAngle[0]\n var phi = this.computedAngle[1]\n\n var ctheta = Math.cos(theta)\n var stheta = Math.sin(theta)\n var cphi = Math.cos(phi)\n var sphi = Math.sin(phi)\n\n var center = this.computedCenter\n\n var wx = ctheta * cphi \n var wy = stheta * cphi\n var wz = sphi\n\n var sx = -ctheta * sphi\n var sy = -stheta * sphi\n var sz = cphi\n\n var eye = this.computedEye\n var mat = this.computedMatrix\n for(var i=0; i<3; ++i) {\n var x = wx * right[i] + wy * toward[i] + wz * up[i]\n mat[4*i+1] = sx * right[i] + sy * toward[i] + sz * up[i]\n mat[4*i+2] = x\n mat[4*i+3] = 0.0\n }\n\n var ax = mat[1]\n var ay = mat[5]\n var az = mat[9]\n var bx = mat[2]\n var by = mat[6]\n var bz = mat[10]\n var cx = ay * bz - az * by\n var cy = az * bx - ax * bz\n var cz = ax * by - ay * bx\n var cl = len3(cx, cy, cz)\n cx /= cl\n cy /= cl\n cz /= cl\n mat[0] = cx\n mat[4] = cy\n mat[8] = cz\n\n for(var i=0; i<3; ++i) {\n eye[i] = center[i] + mat[2+4*i]*radius\n }\n\n for(var i=0; i<3; ++i) {\n var rr = 0.0\n for(var j=0; j<3; ++j) {\n rr += mat[i+4*j] * eye[j]\n }\n mat[12+i] = -rr\n }\n mat[15] = 1.0\n}\n\nproto.getMatrix = function(t, result) {\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n if(result) {\n for(var i=0; i<16; ++i) {\n result[i] = mat[i]\n }\n return result\n }\n return mat\n}\n\nvar zAxis = [0,0,0]\nproto.rotate = function(t, dtheta, dphi, droll) {\n this.angle.move(t, dtheta, dphi)\n if(droll) {\n this.recalcMatrix(t)\n\n var mat = this.computedMatrix\n zAxis[0] = mat[2]\n zAxis[1] = mat[6]\n zAxis[2] = mat[10]\n\n var up = this.computedUp\n var right = this.computedRight\n var toward = this.computedToward\n\n for(var i=0; i<3; ++i) {\n mat[4*i] = up[i]\n mat[4*i+1] = right[i]\n mat[4*i+2] = toward[i]\n }\n rotateM(mat, mat, droll, zAxis)\n for(var i=0; i<3; ++i) {\n up[i] = mat[4*i]\n right[i] = mat[4*i+1]\n }\n\n this.up.set(t, up[0], up[1], up[2])\n this.right.set(t, right[0], right[1], right[2])\n }\n}\n\nproto.pan = function(t, dx, dy, dz) {\n dx = dx || 0.0\n dy = dy || 0.0\n dz = dz || 0.0\n\n this.recalcMatrix(t)\n var mat = this.computedMatrix\n\n var dist = Math.exp(this.computedRadius[0])\n\n var ux = mat[1]\n var uy = mat[5]\n var uz = mat[9]\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n\n var rx = mat[0]\n var ry = mat[4]\n var rz = mat[8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n\n var vx = rx * dx + ux * dy\n var vy = ry * dx + uy * dy\n var vz = rz * dx + uz * dy\n this.center.move(t, vx, vy, vz)\n\n //Update z-component of radius\n var radius = Math.exp(this.computedRadius[0])\n radius = Math.max(1e-4, radius + dz)\n this.radius.set(t, Math.log(radius))\n}\n\nproto.translate = function(t, dx, dy, dz) {\n this.center.move(t,\n dx||0.0,\n dy||0.0,\n dz||0.0)\n}\n\n//Recenters the coordinate axes\nproto.setMatrix = function(t, mat, axes, noSnap) {\n \n //Get the axes for tare\n var ushift = 1\n if(typeof axes === 'number') {\n ushift = (axes)|0\n } \n if(ushift < 0 || ushift > 3) {\n ushift = 1\n }\n var vshift = (ushift + 2) % 3\n var fshift = (ushift + 1) % 3\n\n //Recompute state for new t value\n if(!mat) { \n this.recalcMatrix(t)\n mat = this.computedMatrix\n }\n\n //Get right and up vectors\n var ux = mat[ushift]\n var uy = mat[ushift+4]\n var uz = mat[ushift+8]\n if(!noSnap) {\n var ul = len3(ux, uy, uz)\n ux /= ul\n uy /= ul\n uz /= ul\n } else {\n var ax = Math.abs(ux)\n var ay = Math.abs(uy)\n var az = Math.abs(uz)\n var am = Math.max(ax,ay,az)\n if(ax === am) {\n ux = (ux < 0) ? -1 : 1\n uy = uz = 0\n } else if(az === am) {\n uz = (uz < 0) ? -1 : 1\n ux = uy = 0\n } else {\n uy = (uy < 0) ? -1 : 1\n ux = uz = 0\n }\n }\n\n var rx = mat[vshift]\n var ry = mat[vshift+4]\n var rz = mat[vshift+8]\n var ru = rx * ux + ry * uy + rz * uz\n rx -= ux * ru\n ry -= uy * ru\n rz -= uz * ru\n var rl = len3(rx, ry, rz)\n rx /= rl\n ry /= rl\n rz /= rl\n \n var fx = uy * rz - uz * ry\n var fy = uz * rx - ux * rz\n var fz = ux * ry - uy * rx\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n this.center.jump(t, ex, ey, ez)\n this.radius.idle(t)\n this.up.jump(t, ux, uy, uz)\n this.right.jump(t, rx, ry, rz)\n\n var phi, theta\n if(ushift === 2) {\n var cx = mat[1]\n var cy = mat[5]\n var cz = mat[9]\n var cr = cx * rx + cy * ry + cz * rz\n var cf = cx * fx + cy * fy + cz * fz\n if(tu < 0) {\n phi = -Math.PI/2\n } else {\n phi = Math.PI/2\n }\n theta = Math.atan2(cf, cr)\n } else {\n var tx = mat[2]\n var ty = mat[6]\n var tz = mat[10]\n var tu = tx * ux + ty * uy + tz * uz\n var tr = tx * rx + ty * ry + tz * rz\n var tf = tx * fx + ty * fy + tz * fz\n\n phi = Math.asin(clamp1(tu))\n theta = Math.atan2(tf, tr)\n }\n\n this.angle.jump(t, theta, phi)\n\n this.recalcMatrix(t)\n var dx = mat[2]\n var dy = mat[6]\n var dz = mat[10]\n\n var imat = this.computedMatrix\n invert44(imat, mat)\n var w = imat[15]\n var ex = imat[12] / w\n var ey = imat[13] / w\n var ez = imat[14] / w\n\n var gs = Math.exp(this.computedRadius[0])\n this.center.jump(t, ex-dx*gs, ey-dy*gs, ez-dz*gs)\n}\n\nproto.lastT = function() {\n return Math.max(\n this.center.lastT(),\n this.up.lastT(),\n this.right.lastT(),\n this.radius.lastT(),\n this.angle.lastT())\n}\n\nproto.idle = function(t) {\n this.center.idle(t)\n this.up.idle(t)\n this.right.idle(t)\n this.radius.idle(t)\n this.angle.idle(t)\n}\n\nproto.flush = function(t) {\n this.center.flush(t)\n this.up.flush(t)\n this.right.flush(t)\n this.radius.flush(t)\n this.angle.flush(t)\n}\n\nproto.setDistance = function(t, d) {\n if(d > 0) {\n this.radius.set(t, Math.log(d))\n }\n}\n\nproto.lookAt = function(t, eye, center, up) {\n this.recalcMatrix(t)\n\n eye = eye || this.computedEye\n center = center || this.computedCenter\n up = up || this.computedUp\n\n var ux = up[0]\n var uy = up[1]\n var uz = up[2]\n var ul = len3(ux, uy, uz)\n if(ul < 1e-6) {\n return\n }\n ux /= ul\n uy /= ul\n uz /= ul\n\n var tx = eye[0] - center[0]\n var ty = eye[1] - center[1]\n var tz = eye[2] - center[2]\n var tl = len3(tx, ty, tz)\n if(tl < 1e-6) {\n return\n }\n tx /= tl\n ty /= tl\n tz /= tl\n\n var right = this.computedRight\n var rx = right[0]\n var ry = right[1]\n var rz = right[2]\n var ru = ux*rx + uy*ry + uz*rz\n rx -= ru * ux\n ry -= ru * uy\n rz -= ru * uz\n var rl = len3(rx, ry, rz)\n\n if(rl < 0.01) {\n rx = uy * tz - uz * ty\n ry = uz * tx - ux * tz\n rz = ux * ty - uy * tx\n rl = len3(rx, ry, rz)\n if(rl < 1e-6) {\n return\n }\n }\n rx /= rl\n ry /= rl\n rz /= rl\n\n this.up.set(t, ux, uy, uz)\n this.right.set(t, rx, ry, rz)\n this.center.set(t, center[0], center[1], center[2])\n this.radius.set(t, Math.log(tl))\n\n var fx = uy * rz - uz * ry\n var fy = uz * rx - ux * rz\n var fz = ux * ry - uy * rx\n var fl = len3(fx, fy, fz)\n fx /= fl\n fy /= fl\n fz /= fl\n\n var tu = ux*tx + uy*ty + uz*tz\n var tr = rx*tx + ry*ty + rz*tz\n var tf = fx*tx + fy*ty + fz*tz\n\n var phi = Math.asin(clamp1(tu))\n var theta = Math.atan2(tf, tr)\n\n var angleState = this.angle._state\n var lastTheta = angleState[angleState.length-1]\n var lastPhi = angleState[angleState.length-2]\n lastTheta = lastTheta % (2.0 * Math.PI)\n var dp = Math.abs(lastTheta + 2.0 * Math.PI - theta)\n var d0 = Math.abs(lastTheta - theta)\n var dn = Math.abs(lastTheta - 2.0 * Math.PI - theta)\n if(dp < d0) {\n lastTheta += 2.0 * Math.PI\n }\n if(dn < d0) {\n lastTheta -= 2.0 * Math.PI\n }\n\n this.angle.jump(this.angle.lastT(), lastTheta, lastPhi)\n this.angle.set(t, theta, phi)\n}\n\nfunction createTurntableController(options) {\n options = options || {}\n\n var center = options.center || [0,0,0]\n var up = options.up || [0,1,0]\n var right = options.right || findOrthoPair(up)\n var radius = options.radius || 1.0\n var theta = options.theta || 0.0\n var phi = options.phi || 0.0\n\n center = [].slice.call(center, 0, 3)\n\n up = [].slice.call(up, 0, 3)\n normalize3(up, up)\n\n right = [].slice.call(right, 0, 3)\n normalize3(right, right)\n\n if('eye' in options) {\n var eye = options.eye\n var toward = [\n eye[0]-center[0],\n eye[1]-center[1],\n eye[2]-center[2]\n ]\n cross(right, toward, up)\n if(len3(right[0], right[1], right[2]) < 1e-6) {\n right = findOrthoPair(up)\n } else {\n normalize3(right, right)\n }\n\n radius = len3(toward[0], toward[1], toward[2])\n\n var ut = dot3(up, toward) / radius\n var rt = dot3(right, toward) / radius\n phi = Math.acos(ut)\n theta = Math.acos(rt)\n }\n\n //Use logarithmic coordinates for radius\n radius = Math.log(radius)\n\n //Return the controller\n return new TurntableController(\n options.zoomMin,\n options.zoomMax,\n center,\n up,\n right,\n radius,\n theta,\n phi)\n}","module.exports = \"#version 300 es\\n\\n// This is a fragment shader. If you've opened this file first, please\\n// open and read lambert.vert.glsl before reading on.\\n// Unlike the vertex shader, the fragment shader actually does compute\\n// the shading of geometry. For every pixel in your program's output\\n// screen, the fragment shader is run for every bit of geometry that\\n// particular pixel overlaps. By implicitly interpolating the position\\n// data passed into the fragment shader by the vertex shader, the fragment shader\\n// can compute what color to apply to its pixel based on things like vertex\\n// position, light position, and vertex color.\\nprecision highp float;\\n\\nuniform vec4 u_Color; // The color with which to render this instance of geometry.\\n\\n// These are the interpolated values out of the rasterizer, so you can't know\\n// their specific values without knowing the vertices that contributed to them\\nin vec4 fs_Nor;\\nin vec4 fs_LightVec;\\nin vec4 fs_Col;\\n\\nout vec4 out_Col; // This is the final output color that you will see on your\\n // screen for the pixel that is currently being processed.\\n\\nvoid main()\\n{\\n // Material base color (before shading)\\n vec4 diffuseColor = u_Color;\\n\\n // Calculate the diffuse term for Lambert shading\\n float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec));\\n // Avoid negative lighting values\\n // diffuseTerm = clamp(diffuseTerm, 0, 1);\\n\\n float ambientTerm = 0.2;\\n\\n float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier\\n //to simulate ambient lighting. This ensures that faces that are not\\n //lit by our point light are not completely black.\\n\\n // Compute final shaded color\\n out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a);\\n}\\n\"","module.exports = \"#version 300 es\\n\\n//This is a vertex shader. While it is called a \\\"shader\\\" due to outdated conventions, this file\\n//is used to apply matrix transformations to the arrays of vertex data passed to it.\\n//Since this code is run on your GPU, each vertex is transformed simultaneously.\\n//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time.\\n//This simultaneous transformation allows your program to run much faster, especially when rendering\\n//geometry with millions of vertices.\\n\\nuniform mat4 u_Model; // The matrix that defines the transformation of the\\n // object we're rendering. In this assignment,\\n // this will be the result of traversing your scene graph.\\n\\nuniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix.\\n // This allows us to transform the object's normals properly\\n // if the object has been non-uniformly scaled.\\n\\nuniform mat4 u_ViewProj; // The matrix that defines the camera's transformation.\\n // We've written a static matrix for you to use for HW2,\\n // but in HW3 you'll have to generate one yourself\\n\\nin vec4 vs_Pos; // The array of vertex positions passed to the shader\\n\\nin vec4 vs_Nor; // The array of vertex normals passed to the shader\\n\\nin vec4 vs_Col; // The array of vertex colors passed to the shader.\\n\\nout vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader.\\nout vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader.\\nout vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader.\\n\\nconst vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of\\n //the geometry in the fragment shader.\\n\\nvoid main()\\n{\\n fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation\\n\\n mat3 invTranspose = mat3(u_ModelInvTr);\\n fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation.\\n // Transform the geometry's normals by the inverse transpose of the\\n // model matrix. This is necessary to ensure the normals remain\\n // perpendicular to the surface after the surface is transformed by\\n // the model matrix.\\n\\n\\n vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below\\n\\n fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies\\n\\n gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is\\n // used to render the final positions of the geometry's vertices\\n}\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {vec3} from 'gl-matrix';\nconst Stats = require('stats-js');\nimport * as DAT from 'dat.gui';\nimport Icosphere from './geometry/Icosphere';\nimport Square from './geometry/Square';\nimport OpenGLRenderer from './rendering/gl/OpenGLRenderer';\nimport Camera from './Camera';\nimport {setGL} from './globals';\nimport ShaderProgram, {Shader} from './rendering/gl/ShaderProgram';\n\n// Define an object with application parameters and button callbacks\n// This will be referred to by dat.GUI's functions that add GUI elements.\nconst controls = {\n tesselations: 5,\n 'Load Scene': loadScene, // A function pointer, essentially\n};\n\nlet icosphere: Icosphere;\nlet square: Square;\nlet prevTesselations: number = 5;\n\nfunction loadScene() {\n icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, controls.tesselations);\n icosphere.create();\n square = new Square(vec3.fromValues(0, 0, 0));\n square.create();\n}\n\nfunction main() {\n // Initial display for framerate\n const stats = Stats();\n stats.setMode(0);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n // Add controls to the gui\n const gui = new DAT.GUI();\n gui.add(controls, 'tesselations', 0, 8).step(1);\n gui.add(controls, 'Load Scene');\n\n // get canvas and webgl context\n const canvas = document.getElementById('canvas');\n const gl = canvas.getContext('webgl2');\n if (!gl) {\n alert('WebGL 2 not supported!');\n }\n // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module.\n // Later, we can import `gl` from `globals.ts` to access it\n setGL(gl);\n\n // Initial call to load scene\n loadScene();\n\n const camera = new Camera(vec3.fromValues(0, 0, 5), vec3.fromValues(0, 0, 0));\n\n const renderer = new OpenGLRenderer(canvas);\n renderer.setClearColor(0.2, 0.2, 0.2, 1);\n gl.enable(gl.DEPTH_TEST);\n\n const lambert = new ShaderProgram([\n new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')),\n new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')),\n ]);\n\n // This function will be called every frame\n function tick() {\n camera.update();\n stats.begin();\n gl.viewport(0, 0, window.innerWidth, window.innerHeight);\n renderer.clear();\n if(controls.tesselations != prevTesselations)\n {\n prevTesselations = controls.tesselations;\n icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations);\n icosphere.create();\n }\n renderer.render(camera, lambert, [\n icosphere,\n // square,\n ]);\n stats.end();\n\n // Tell the browser to call `tick` again whenever it renders a new frame\n requestAnimationFrame(tick);\n }\n\n window.addEventListener('resize', function() {\n renderer.setSize(window.innerWidth, window.innerHeight);\n camera.setAspectRatio(window.innerWidth / window.innerHeight);\n camera.updateProjectionMatrix();\n }, false);\n\n renderer.setSize(window.innerWidth, window.innerHeight);\n camera.setAspectRatio(window.innerWidth / window.innerHeight);\n camera.updateProjectionMatrix();\n\n // Start the render loop\n tick();\n}\n\nmain();\n"],"names":[],"sourceRoot":""} \ No newline at end of file From bd3b9246f38f82a4d3db2388166a22e089778947 Mon Sep 17 00:00:00 2001 From: Austin Eng Date: Thu, 30 Sep 2021 17:32:54 -0700 Subject: [PATCH 10/10] .gitignore bundled files in dist/ --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 3c3629e6..9fd9fda2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ node_modules + +dist/bundle.js +dist/bundle.js.map

B7wm@T7Q)2Q?FV)A8*(N;81d z>-y+Ct1PY4?#w=gLdoQ%*aOXA2e949lx;vq!rPH+!4K z=8a{@S<-$LXKqDI^Zh=8Q^W zF&V>KZ?4O~_=COQZBf`?YWAhR zrRe5Uc~eHQ$psYq!{au5+bHQa`ZuUg_>@4wGp)i7NRMa^*Facq65zFre9bJ4H29M) z{QZLsvPFr%`ZaSl@#k5=6MxshFUx$EmR^^91KbPLYA|9jx)5X2AU@X!yIyvRS$1dE zL-*NdhhMJPKpgGu*?CV`UM5bjNyW&hg2)nx9n0jyy0a1|KbJ^E^|jm}ssSpTxO0d5 zhdw68IkYA3MLmS;Lp%p&oW5oF3Jt4ASa$NSq?5{v%@A>@I6h?&WHhCIZq|JP-g`HM z?K`XFwTB5?)%Cn_+=Ho)Mi91l0%FaU`d7>ST$Oe1mEB>_lU@=WMdJbYL`BgU)UOPG z)X6$!E{D$ayqrS6x&_o*!`w;!Ogah`9GeIoHv8++jNe>!S!-?nfCd9sU3%u)Vw$`D z;_8B%Wt2qJz`|=sHyF^!C@3^y=XukxqT*op1P_!Y@L^(}%xCAwBap=RK|Ant5q(HG z>tR9$q5b+!jfc3%R_znT96zy46Th5m4bMmW8OjCt1CJ0#!#3^2FUj>cW9+L8t9&he zBU_*fZ9GFUe^_SLf@9-Ujh~^(2wl`gju=qnko$k@bEly_@Co=5=kVXi^sGiS*%NoI z6!)@hzKI~_jMmvx?d%;~#9_qtB!)&KpHxxE4eezA;X=%b%zeLmYj_l8=Fz z)DQJBH+Ddl-E`&z!kt++nv~kgBo4w8;8O03-Yq-9Nx_`~2x{uON7_G#i z4mHm@*R$*O`udL1<^XW_rQ-tu!uG@0-F5F{)4pnY>PurGM(9;C zml#|T$x!{Pv>usqVpq=>K=xu|2e0uB2^V+Z!$Ww1^{;D@9jMuag-S~Us9ilj0NQ7UT5S`m8a$T-6 za?@Dq zjn-~fe7`?6U(!_r?`XK=yr3Mv48BO&HGRDZj!aw3 z=c_R=xE=F;m2c9~5HiRTUL(&-ZtP4!>T*$RW^NNU+TP}&>oEEAX+0|ytP}F5p$xr+ z3)z7bZQJXj8|%xEd4oP_pT^!ii`H8fjc;(t6pZeXD;x*OS45z0ImRm`i;}P=;^-qU zpagK8>BflQ=&>HT=NIN_-{SEt1O?+*98J07XpZc?xz8-is%=e#mhNHf7ujBM?rz`hi$XB9gr0DEm5C^eAkBTbOU&K>nNURWG z+1*{Q*dhZ{$o*E4%c;k+dMDenJdmb6BEOxsiSXv&waY||{EDwY5~lac<&h=yxDYD9>?^= z{1lugcOP~YN{B^0r1wUZz=)?`Q5b@9EXSP1qTCI3^Y7dH1F#i5y^y{fQ{lRW9t|NQ z@OBbZ6_VMG#Av;4`+T%JpU42S42@g(RNLD!_Pa>LvIKny=9*=;qJYW#WR(IQ*6bn< z_irWdRvUKWc2a`Vx8BK+fsJzJgosFmo23XXXq~n^-#dhqr9ONnyU%|Q)auGjIbk>=l$n2wjYQ~-^rW$(Q&mAuItxK_KjgJ%{pRgsJ<9EaU zlLQlwdO`b~LySi{d^cml3K$ni0NBULi`eVnn#c2++APZp$9~pIHOrCLq9iBR!y4bu z$CfE{);xIb3w;Mvb9a9))w4(r`6YHWJn?Cc#T-5vv6YoZ+g;_l+;*6=5jI(LeFe#ap)G&vdR_$pptte{Vpc`$#uWQC?d*pWGAWw$73*)fGn zhy)^TJ1U$wii=lN|19x<0820Qn}#3PNC!~LCEFU9{rjvN+6SSI`iEmmgrxlsp6T^l zZ@o9k#K0u*k_?is+64X)cs1`8D?)8T<$#E>v9o`6*3T;O7KI+98_+oVJKIQ>hfwIx zNC{(99fZCF?;d6SY_!Q3B-kcTJsDjovU68zO8v3Eyf0#ovJ=U_=_kLFU1yr=HpS6d z>e=vInjRsEnn5Jtu@~w09AULx&Pr^RV$Eny%QjZH zM!+3U0YJa6fP0Oe<3lvIf5Jv6#GA_Si`vR`%j9Rt%S!%2UZp|7_R>wOirOewP>Czs zX>I5Da_DDKX2Iff2|*{%Hg6Xv?{k>9A#cOI#S`!@hY_sLQHA5BwN9{Y5=D9!_WZoHB@K!bN7bIql6~ zr-Isn{cXm_fG&EFr?>lNv;K1%_0wC(@8{!l@|VAXUCt|;`{mYvGAjS?|_&S z|HS=Oeq^#9ON~He+9o;T;sCuGY})+2zg0;w;MG9m*yu zTv4=-g1M@pR~FLngro(FATykRWw`k$>5>cPJLH|qfdxxaxtvP2x+C-V+JE!tAL|Iz zvCKk4vjMJh!{rmMU)`|*WC(u|xGIu{tULZZ0!cuq->qDj5o)4fEaMw+M1We-veep! z>x`^ac$GKqV~o^g18BDsgjCy5BrsJ(oM)SGK?_Y4gfR!%&g_lpb!geXXZlBS5D6zx z$a|oZ9v};3oC~DbVlyka`p~ZM)waL0$YfC+%4dr|f-6I&VbP|#5P0tMJwbd+6vO{U zzils?zH&i%a2NFzZlL;91B{3L#OSOhTZ*Vg;v#j=a~?xvf(zAzG?1$S1O14znX^?4 zsAdx7KrAh3^buNXKjS}`N(NK?)CeJ4_0PE0I?q1?w#xda6Pka4@>j-9B zl&;85W{4KQ{btbx&}^3Q%Ne2>zA!Yc{Y?2d@4Dh$WcYFStK)H?lcoEbjp4PTjYS^V z5eSY<4$tgoRI9xHm3`|cULIYS3=RB|r}EWJcPuk8>Sf$1_a?B-Z};UcDrxR{{Q*e3 z;jSEttPF!*SC?!4JXlQaP`p@ll1hcyN|4O9Af!zn36$3`Tab^Z2>e9)$kW)4R5b;a zJ21uo$xn^+BEY!1-~S7@`R88yfPR}r_TK{D8qRi#*SW0B*+D|n7g{4TBK)#3@^%V$ z)^*C87nN_l7ZnTfl18Z<4~s_}XlqtxBka`6XYeyUx6FGiUBgwToe(8RS?tv!boy5( zzqnkROps)7WQhLNc^IO49dQdbi0n{Q0Rz70m2=EUx0wS*b>6DVW)E3eJ0j*b5H;cQr4Jz3?7FIBhvE z>{?sq7VB$HgLB^3x!oSe;rsSP20xnDCr-S-7N?vMq??^?euec#Yfd`9y3_~2L#oao z5^K}NmTf+$od|J2sDguQxq(4UuIGIB(&ZTv_{l&PuxwI*F?ZtdDS9$06D?~t8E%NG z$PU0_0z<$Hf#H{mY3Ss8wFO~2u0HhazUt}jA14#$ZSf~9T_<=-?0zT_}n$j=VO6H_D{hkkC417-z(%ZlnCh zi%%BQDvqLfcGP-u&R6`P#Mo-2gvkd~GY-&e+FXOYz`gJSVPfkR^S6nk*bsOmeAc#Vh zAYTRRpcESlI8P(al3{Rn0F!?|1B#$yP|0ARVbV!t;V z_l(+UvxDmcQvkNb@uz@>d&@MH&Uy~T%p({e8QEt6Mb2mMExMXeS zY1`5$1;uK*?PzMe=IOTmfsDC%$?A`Xm0Gr52+zq`4f9$3+Pna=9bn$u5LFs6!DzJ8 zkCOE3pDF82{lC?4W@|S5t--DeX0wUR{yT(w5UizTC%&%NRJOG_U=9$;fq7v;ViX$B z90k{AtkP(x&nuepEN)gGV05PpRlV>iNwE4eRl%j@M&HD1(6KJll*a+l$bzW1T-u_i z$hpKH=vOCiTRN7{oTS~xBVVncjB>L_iHuRkPWwt81H~x93q~396RqzqswjDClP1jP zk5@0CJ7bRtFV1%>*nw7eZ7&ym0D`b%Hnwt6R;5SjWm-;Fi_Z)FctNwdwS7%J{oG@8+QA~MJuV};5nSJeO-P;iB8E`} z0THc1E5uSemg?}?wTGCwCU6@MyI7U3s69ikf%*a$^B#}}M?LO^D=$0zF|dz|P6<>1 z5DFe?s?g5=TsT^_pPLJ_qgw3nG9uUdApToVjXOLH1ZRUvY5o;VA?22jABbMjrQY-L ztXSKQCMZuPH%L#&WNp#V+;@Ar&Du>bD1p(ns~Bv5P$7oF$wgc>TCM*=IbkFiv7y%w zQXVXmn(a#W0jD8J72j`i1*voR7A*z*ig|Ts!#ZGYdjA{BAO($3&@$mD__DIBo557! zIz4}_`1jV%g)*$r#UavfiEb!hKLcGqnsx1>?=4NZFKuZz8K3|d%pY3RLt$6I4$ctp zoSMjGPgBS0|vzP=dJC%4m+Y&NRlmProS|h!xS|1U3+QA!u)jUi!FYbB} z#Z;Zc7?Pr6hP=10#PAcBvdhA49Fxf4Bmrl6ZWJNf{#D$R3ntk$ObWxaKt^)s;i*Li zs+@D}7&?0i!7bJsA+z>_P$Kw`)Qjeasrm_V-uy+pcno@3&*C_F>F>~gzI(Ye{lORG znixN}bwlg0i&iZjKe+#=f21WY$F4&M*}sDXtR~PtcQk$(w{-k+qTNwN z#BwOvQ4(EZ@^-4E?WqML2jCWO`Z~5D`)^48!{E4Wv;@A8X8xxmTBmdbu5sUNh9eFq zOqIUkkU#c*OWr{svS#|$G9BXFNCw`ypR{#-v#{_NQ6$EkXNZ0n1y zTKEcmX#rf<2~SbD3X@2pG{6j0?gLSR3Z{78t%~xKY2Qct8KLrfVTsZvVxBv9MT}8& zJVC!aw=;)=5H{N&4aaC1-&i{%AcFnH6%qIkkv`k*YnqF#zqG(_HCzDBKVx}CMr%65 zEy2x0xN~5SGFf$J{X_^xH->$D5Qz;{a}VkGnOV98T^4*5`UrD zH@>`@RWpuXmS611yZ9hsNa>mu78SLoAsQh{+ivLn+HRz|K#AQa7n5-i zpBde%(5Hik1((v|zZls>5?;F5k;3W=xfD#Ba}Th5w+9*|>Fj^uV+Hl!fm(^D(&%kRQd_H#d$zVo{t z)%3dLa@35^F$-a9DJUJwyJ>bD&T~5g-FW=Ax3WwF9`~Myc1)iaqc}TWN+l`v(KLyq zbq;{`B#{SeHE&}xX=CL{q4}BZgF52!SD5}`Msbf~gZvA7Ze@idNP|Ee-^s~q^A`a{ z-u8e|srEGZlk9H+tD7zS(`;)0Lnr!&x8djd&v4PHLcFl<-z7f-(Znw%w3)agRNCGR zHB;}8rkjtu*Waulu$T-psUn`*m_EX-?U)MGPllzpw&xpqCx`xfhLBST zw-|I%WJ_xUAFshVzY1x+*c= zTBZ|}?>NoG%c7B{PdGbdx81^z|M)U)NE9?)eZ-f3T2bJ%WR*uO@TXUn1Eje&Dgvn} zh+Hy2-0?tmv~FwdFp{{Dg}}}-C4g+O8~NN_fHQ)@t)?=3Qx0?Sn|D|=IUyrHBF&eW zsTH2>=S0Rf`=!MbyWhTH!6$X6ut@Y;14VYi z<>FfqrZ1{QP%)&2Z?SCFBm-nDG?gYd2%3K?3~n zgfXuD3Iltfw3CV2V!XWc;s>fHfjM2TacnXaWsjXk`fd9y)X2*#ia%hnmvN8NhrK?= zt3B77x^G@2P*ZA2{q}RTlU{Oy%@R0|ueoYHRtw|>e)nA-B$7WT+%t%e_NgvBj_Ss; zo~vK{?=&T^1KB$6O2KX&*K@Zc;h}yv>YP6PFtstXp$62o_l}PnQx6t zk%ncj|&%pJjWC-X3_Qss??s4iUp7dKilQ7iq;dmb%AO`fmn%P79TF*+=)nWXl?&j zho#X`UmfG?FY}tZrGoc!O}4|zay<9s`b=OXMGP(Qcy=68L4@$D7H@olgT-6ouNcj6 z?Dc`uTAj*ELM0DyTAktm|IyLO0>_`@Lz!{p@v=U*bd0z*^gP%~T}ny38m=r1c(`2H z#yr&52~e9IVg*f3+w;!S)yLvcUQP|JLB}#$bK9X|wY12)&rk|OekF7RZz(<-{O_gd zz&_L2(SYX)zu|?@ar_HTfKz|4y#L@eSEuJ{$s$G!aGQ;QiKNY(`e>bAPrfc4*VW{B z-4YYd1K|23(X>quSFv+L<+3)D%KN=9tV@pQE;rquRs}bG$EKRwljp3S9cS-_uZUX? z%e?DI8X~O|6FU&bQ+nw2lc0xU%*2?3`g#4M_iJQTzJbS$y&TTy?XAR)NFpb zoLJ&=l&}v(S|X|6>&4$34ZP=kbjb|7^n4X(Db0G?7#_Hqwz@+t&DYPreUVbKOND6` zh`gkM_d%P6$_Dz%d_hflyX7tH3$L1e4%`4A9hihYaD!?c4 zGcN{}LV2McfOIx$t1Ws^JR(m78~FuMlZX{Y%S5i0^U)}F><2+XekTyq5eb7$gpjha zXwxd5VZ}A4^+zla`StwXqFvhk>M#evO*y zEE;{Zix5XMO^`-tmz#jI4dFE12{dpIvByn=RWDk>Ud8UwjLesTBAMemyZ8E?`XGZt z{0xi>vh}QqFnx46!j*x8-EO2*rlGhr9r)oH=UF()YJ&dAY$JclWO7ZuK{k@xX!9&k zz5u((J$>srS$Eg%684M%@43boL+$Tm4@oD6^8Nb9OwEsS32yQv0~5TT09Ek@F$tew z1R}YJH$%vhUiGcd>jUSvF*K}O&Ftf{py3C3xQHtpcBn(XxA&{jMd_92J2?NO=NDu$ z#K*^q$6M2vlSIkeWyZv{M|sKm*7Ig+)Ha%>L1gd4PZAbOjFFO&2Qi^au5lvC*$WnS z&1@R}4#C?V{k)fsA`c`Dmt;J?7!O8C$qrn%+Woo{EfKHs%jZ-guXQn|ljnn^q>w0p&wC-=q%kjwX%}x3?S_wU7Pn+{Jkv#`e$X{y zM@xZeK`EW#G?WvJf@2p0BZ<&GSRl6FKXBwxMDjO=Os;oZ`}-@x0O3^|*`r~yfFxCNe}uWy&Xgo@j9~5Vc?deh5b1V86FNJ0^XW!LY+&D6VKVb3rnnb~GsZ-# zDSTIkZz6f-o?-xMR)5D%Du9oH2Ae(Fkh`w3_VS^cG`|7c)nI2{v}YrlG2a7^lUe)f z(Wrgp)=R+5K!K$N`NfqhqoGUG@6DzN?yk$@q_e3vx9*3Hhe_NNr3^&+R~+x4q}M|x zvR06kPrUa2cm#wvZ!I~`^fg>}xj*dcKTztAqX&C$1Y^VJOA1blsE!dvb6hy9esw4r z6N!I6Y^en^K#7>6V+>10+1Qkz*FLS+2J}ss!0M0{9 zKi5Ri4M%~EMlCx`czeZZ{EzjZ(5P>1R7rj6Wc^o<-Yx5E^5!jh9rX8m$>o}IAfO|` zuQP?VlW^X5qvpl7aeJyCjCKVU?W|5QdF3tv7fP?KDt~%{bM)8SQTN8>t(%kBa84>Q zu0OFRSKxV=ux>q2AY|wy8?hnvcX^e=aVtzA^ClLa z?92BnH-bEPJz&ugw@mI%v<5x8&?U$xAB+J%Z=(+Q_%B|nWR=n+*3xM@9x1QKx_#tz3m-??BOm<+o4!i{fX7)k&ku} z{$#WS;*swD829mHx7csI;MwHP+isb&XY*Se_u_11SBnLjS1nu(&!nCCitl zGX+fMY8{2R?h>_gTS!C5H*wTTyn*wY6t{-I z&D(+dK=j@PGO-YYki_zpU95qIli1N>gp?F;2s<;lheNg$bN>$FQ+(LQC3u(E*mv)L z?jJGdZhj=Zh%Io3fRjtkfB2>|_wYcwf~Q^>KuKc^|D`(86+GQGan$Z~4ER9ruqsTf zAxoSxd=vbnb`&_w42{_bLoGBL!64EJu4K(-Yj_tan(nXI=W zhq=@aP&wOuMxna$h@ukYZyCOFz5;ezyYmm^O?^rm^Z#^59Qg7Ynt*93vROl(zlDPM z9zKv2jqq~iOJ}AB0y^Wsh+^n&L$mubwFB!ea~4L$kAaFre5qW?jKqx?Njst4l1<<) zEb$GlTU|M>8&oaCKj2?M_^hvdf49n+xrN!8PAsu4du^l#ARz`LrW!+P{}dvVou~#S+IDZ1 z#x9S2`;Qg?lhA=r97I6OTk+1Yj-D6=_goJsKDfb2@UcG$ol$i8E$!hGE~oZJT6?*P zigkN~u6dBgH?tzq&ldgNKg+S*4nHLv@VeF&LD`s~F|zbk0Bx~g5>jA6Xy)W5@>-Pa z08)S4ju)2 zWW!jGlJ-OFxsd>`&uUtMeF+@eUA#UMie$Oab3P~3-P(j7%qJgRO_@z`9KrU-{6N#S zMtM8gEN(_9um~@-ba0&B{kD4S&%^;mt%u)@(*3qH=LE`S+)%yHt0mS4wm~j1*KZL^ zqosOR`;jIBwRUBW5B<5KE0f;a+IR6sC;n6h+6+4`7=2oeMybxI3Q#|BJgRKG=ciuy z%nK~r3uP28@p#MQ&l&GUF5^@_yH@3r5L9UU0z(BJzQO+#w2ELV}^4{iX##MoHr7#s=X^pChQEc}@by5YR8mzH4UW8Kf=$NsZu$j|L zg(fO>=SDO#dzocOh@TedQZL0*Q(oaE)QWzX=K)L6*>lbo%#TES?I!CkN{#IIpp3Vq2Mv0;h-^Dzp8#8urlvb z+A!%)d;s&$$tX|MBIhv!BFRJ$$3veQJ8`=q#l;?lr=;u)*H-NBcI7RYYXKb%cU%+* zcr)}J`S(R%H4+aFV`eEf+>EFA`T9j_D}F}fN8o4koR26B!!59}YSENJTN30=w`1ls zbgnlsqj+-Frz=0M5Fc~9f>`2koq_M+V<)2(BtYWo$*CG+8lRyc;;3B6K%e7;ivCv< z#Fk7U4+?(-Jowhx=W=hMDqMSj!ve9wsu2mp|dbfszI1Mm#2_$APfh zG*0^8iQ2sE*zT7`5dO6 zZ?EZF2tdd8i|$)V5pOqH-C3Kp;e_l6EFf8ZIlmO~`%D^oqNU+$4m}taJM(RMyj9=a%8%l^M)INP9? z4x-bnjsMP-R)Iubx1mFbr-?e$>_18pI%dRM9uxf$j3s}rzjNw4-}F!ubxvB z5=Jh@XipLGw1)F(j!p@LsmDEpG0aLWM!i$p!W&kS+`<+HK2&veGMNysmdW@%-57Zu z*w@9`;=$%#KDwBlo`y~L;H??QyD&+4`x(YdzuUQ5S5L(UG2{7n%V^7^+MFVesqUBX z;A}m*U3)N>1J7-dXQZj6y%Ir!e1JKcEXumxjSI>uB)`7(@>f?vcgzi%)qVejCXs!3 z$*g~o`Cd*`XR1K&>A zzRSc5P6K4bIO{SUQpCpZ^kTxf!qTo|k4QpT9nY>-oL@IkWD+E1Jp(r;W)nAjWca~_ zz+s1LP-k^Sz7g71h6|AjKk?k>`1<^v?OsiPS<`ngY|erZRS?HXJo!#eRDJjKqd)K8 zW~k#$miedG;AUiToGjV5v2(o5LF_?+(HG+V_#oMRNp+Q7ZhbvP7noEsp74Q{n z2*CRM{ZXfLDHUV3Cg^?I_VsyTrS0#(z5(FS7HX~>$40+r-q(zI&-pU5lRxHH;%5Hf z8)wh4%cYAP3-np+j&~T9pW{!o7#(;MwPocuOY0VZAwqcIz~~V0*}^S@aw_YGs`Rc1 zs^vImpw}tGo|CLFX7U6DHc9i!s z>Rs!J5D4Ao-3*VmgE%0?6E07HdF^S6&Oda~=K=Q!DuCUH*l@(W3C$%RS8PTX&T<_9~z*ji4p;~mik<=?4NBaWjRPXEA(hTAucD@b!^OyCZ6BYDn z1gn{>>>|aZm|SmgU0Zs5S|mt|?p^W-Tc!Z6bjs28g^`GB07ak;oB|@BEQE%%!E>Z; z0xOyU7c$QvFF?3CFGYbMFlZ%!nC<%b@%0JHcv5wwC=t5Db~?oAa>>aoslQt^nq zT5MvYvARp~ZGRxHrD(qVqwuH7YGq$OQ?Q5%57pY@Z7RkS0u}k?-!m+^i5)MNY;xbj z&XH0%C}jjh+Ul^B(g^+oqzcQ7qsCqf*huD0*pHzRU@L7D=e zjIO{4o8h4ckI|iq*N4wL zJ+4LCge$<+md~UwC56%^I1of6!swU&paGH78a?06TvHOe;F%i~Ud3YMi<0$?l50ORk`eibqsj3PN7Lm>P zqGayHQo{06)>7eBweygOWN1RmVvjD`N_Ra~seJ|sj<>?Rv=m@`l3$kg5ZboOUT61P z;oHUT&$H;0c8%by^MS269cW{u7)o+(mS$b;!?ITX@B&uU=qIOf)ZEzj=Y0N z$@YA<3u*!*yDU(ms|{(7g0uBQ#7Tl%IqTHe`7h13w9%_>tn+>)6CVP#2|3K)$Rp7j zBc)k$!#7%d|+jc!Wia~CN#sTRMyIiJxg96n4z+oh~#1opMMfrD)KLlqR zb_aR<=WhHx?rsCG8-FdZzigj8_wJx~Tznf!dYLKw6X)D_d(iy6T?D_>@6)G+vs2V1 z-{+wgMUcU4eOZu8C9-XS)o}6DKjw>|$d%lGu3f*z->_nF?6LZEw-X-n;&BHXL4bWq z`oGJMnE$MpuVr^J-2FQvPQcxqtVJ2zD!?<6WhP|0#9s9vZfI$*IXdxSTRyL%q;DI$ z09>h{;hu7Q#3zzN>}AWN2C*ABTpJz}%dKQps@@Uid=VyTt)z1e7^;Sm`k53oAtnb+ zHaV^D?sc(=3xpO2YwRVqWy~!TTH%fi8u&(SG}W9n=Rmj(wzd0WpwEBhVRK|!f8L&A zVGBc9=N!eg#B?*`Ub`%8nTn&Y3@&prbcm;nuDmSaxuv65@yh&Vyht8msEf9Y^p#jL zpL*%#CINeOQ&e@utE8}WFN=@K$>YB^s?!zTjAYg`Eg~hc6k<2WIP@fg$o6L`aNq2; zq!%m7+JS}d+73JWo8We8sBKC;2ZfX14F94OA00Qs`M_TnfAdv%n3oTmp_s4JkK?Nr z7m;nOaI0X`hyb|F=>4U+0w6Rq&t080*;Z<|?Tr-)&&Keh2_+H6M_Jd?%MRTQ34yIP z>MM?Zx`_b}DP7*oAUa`R z8nu3uQB2OV`Eiai-sX0zmPG6*(H1-Q=YKn!y3RT4e~==7k5sLHW0`j7htQ>-rMXF6 zC8b}jY?7rGQc)%}SRmLvDTQ>-W~hlM+8<#2d?QY|`}vA1z!?#5Jpr>*cF|D76?2$Y zwy+kA-sAS?f)&~VZicf$BSA%_vIq(uvC9%UKwVW7h(skr#g`BtFV`ijvdCcf3V)J@ zVA&)&kYU*_Hn@FjV3Y8iB8DERZDcJI^ z(WkG0TM;5X`$(z>;1rBFAed+v3{fMT zFNcgS@O!?XVlWIs3JUXoX}WbqG@crcD52SyjnZecfnxia9gRnXjz9XSt;Vtd=mM$N1 zyE^39ufmwBJd4?YB9MAAeq^CN4f&`lffFW-yNbrgJ;tX);wWiBk~bjT`-o;+$)rDg zGHDA0`ni=}pPyqH>RF6W(mj6jyo%`CeT-P^*)!5!=2oWq zPw&RLgJrcg#u&6F?HM0vZW1uo5vBY_;!OIb`#fdse*Qf0WztmTjd7>8&H07+b+ed6 zjEp1yCx>7;gON=W)S|u2gyd}}aD>%eXf(@OShj0fSDXCYpPT>xwVS^hq(Q6Yh``Fy#VfJ=k@LjaSOp<%+ zXa{1;0LD0EoGXA!>6?s`Z%g8%izxkwp}c$IU#c6E1WqZc0_iqf^6KsNJlv|nWFk2P zk8SVqH>~o~*VE-cIc!zG4>Xkcc_iA-E=e+JpoF>SZVxn4hL}j zaz=zg#LDp$FqI|tWeqph&$ZV>)aOf=xY-_W8EcBRSsU&|ib`vgoqj6oNYs*;L&h_R zk?C$kw;D_aR}NS^J~NN<8?9-}hdYqgBL5a;xO!~QF64ImJ7=g}bXZ;b!nsw{mNBGo zK%<^gng1;ru?Fv&H6RX)B@ZHn%nq~ua%dprHFT(&=hSfF|EO*Ji^JI-jL0B#!;iuD z`(Iz%DPN@wbWQauR^hpF8WX-35?C{H=?cc8GvVmN2{mpd4wKU*i8;bFW+i41e0NmA zB)}~Yz$Lt>Go6;iYf!0dE6>Z+ywy;{>8$3+j?zu+>d@w!6eHhB3w_j{xJ88$(Sm`v zuYbz8&7AA@#DW8~p$b9_PZu@s~6I+GX`ahH!7 z?HBmmF8DAZ`(+Qk;z z{}m~(3+zK*;JJFQ~z6 zYYVMTBUhZJhvA3%{2;-wx8Ihz-wuShiLFi=fKw>*H51Bc;v^T|?NgBb7D$Ps*EVpF znlaA@?)))^mmT?KcaiSu4)S<5s1WA>?UD5$;gqs=!)3z-R6kZ2^L+|UvvW9J=MN-# zB2S~J$2@u_uvl9Np1YjANPenCHPQF9%$Q7odN4ft^OghB&`(i?d&Y9_sWd5OMajX5rF(^da^1`V z`bK|r52_o0|e_53%Ru8k6%`n%q10O{P)MS2Zu z?l8vnRkhLq7=V?D{Y4TVWt63)-WAaNDS=ObLBr&!IMeP>Z zvAW9i-Z^dYzcb|dO+KZiou8+8uNt(eb9UgWdhUlcIhW2NLMJ)odKI0tGQ982xkMDD zXESexk2p;cr)dYn36>NgW#qGh8k%3G@u=M^IY;PlIYrhKxc>!kyXb z1aYT2@e_qFI{t?ASIJ@l6gjQ$eTnRMA@unu0Tu>1j-&Uc0|K{Ismw8j=DaC`jB&Ag z9X@;`Z9}m0AHSR|w3fq{-+?NM{Qs!>#_&4WrrYcojnkNot;TL_n~iPT zwr#Vq(Z)7+*qA#uPM+^Q&-b2l&ABqS!>M%r2kFn`g&>>+fUt@&foR%4HsI9 z7~jAwqN5d1F%wk}J)Y{+G`5mVy@8RRa@Jkh3eu@MsIHGsOr9bVC zvS_HBM&`w=R{4{XkPAF0*(lgR8dH|a={~$WH8Sl9c?>+$k`3Tx+0vGScAdsWqkmfp zClumgW(tK=Wlmu)Hw{6tW#73wqM@eSKg2t~r-uXC zLu;sk&*+OVIj*f$6Fup^%H%BRed;Q=$8DYE7~q2CVOApbcfQ-Sk1kw$9mwye$NRyw zukK!w`G46%8@2)OX0IEzVO$^o$vr!5gs%7J(^*|J2D!Z@k4W(rndM64eFX+B@k8cN#1)1n&z-Sw{22F#*^#Efh_wD^ zur)e}+l9#*yw!x?_%Yby4st@&hZXo9fbc!UU*crTgQxzE$W=sqr|#w(!6z>VawD)P z#>sfCRnP80RjBrW56FZj^1lfF%DQ|0@Q?TaNT^9jXs7YY+pJ-iQ_nr}!dM5fT++&j zR8qtF2TbseC%ty?;{_qDqJ6L(7JUW+)byJj@WlP+b`y_3q(DJ0^W^cn`v&&LnLsMW`sJ-QD93LCwGGvUdK&%=(H@Ro5$Es`L`H<_& z@cgMRmt*lw00#@{i;gSZY*wa+rFkKH(Rzp?hz?{~B<~Xo%iv=X-vgsnGP2lYH9ntNS{Q8kTuvJ-*kfM5_0cQ(O=l^G0tYL2Z*-ig0QKv{EuI6daV?*ZRQo#)GD2C%+Mj?AhS9)YQ%(PP;yJ)(E>@-d7BVy31@ zFUW1oNY!$f>nBci-vY_xJ)#ed>Xk(7PHN-f@ zhQpc}->e8nX^E5h=k{55zaZMDxS)pL{0;4Ht-8KwM__O)zXy!KwT+G^WfwYO_-mfa zY)obQ%hkItIS9vrS^s1*ozBbozK7&#e2a}U?VGgA6AE>6raK1zOEP1RZ$G)_hD^aO zImO_FZGrc-JB1~sxx|w+j`@#y$X*#HM=LE`Paa^|I?R?nj7CKMDL(dqFr8Oihc!c} z2ko+#WThkSX$(i`a9xKnuJzz0I6KlkIL`4_sYUgaJ-TC;YmeL3nkHw9fTzc`k_$73 zPP--b>hOJROWXH>2!&6)V~4T`&0dh>Dp46XU4WvQK6{n7RRzp?{MZ z);^NyTGK3Z41I1pjaWP0_1mR+mhQhx>aK`?zIGI$8I%8+iML!aXZj=OH8W4+kIRoq z2a6&PU-fVy55YvcLfBgCkrd=+s2F!)(h+7#gDU;++aUi^%`f?9=I1h0fxbskn)&ex zXR7z?lngezM1z+X$9V&xT)w$Qv&{ssHB26GxQDd37)EC!7WdQ(-OXWr{bn3aE#B*F zjUzwG8aBImZKMoEV>yCPma;m8zeB&B=;_>$6Lv4Mc>Hz{jm=I8&+K^nw7q)&Ey0k+LvtF=8S_;^i02tcg@}d_baF)H_Qjbg2 zN|ajbz7Y(MjGv`J?7lYyk708%nOEx#&pB(d`00wOW0tTSdcGf1gvj1=m^8B8oF4|k{R6*3El z4LXucHs1K*dNz)QJ&jH9y{Nxand!5x|CMP>oN7tg8a3vx4`E+5Vo2T{R?JvLARcz) zzv8n-OJZqZf$3vk;B1{=21{=Vr&`;KgXK4FW@L9LAEC#aRYvqRgxO*|(yO}4vAf#; z6E0-&y^xy-<<-Y;2PFWr8yf1JTG6%?EER|Pi6Li?N3$1>efhE%P+m!#m%M&q#OZ}1mRW5q-Xm9_9VEA(R zEHpnPDWy7W<1S0NN!?0EG_VTp%^EoBHUTI;gGvm)sLayh8p6H&;&I@f))q7>9qaNk z)whN#ndaa;ZqERf{5Pj4p3rhkSk1rc0BZt=calgCxJPP-oV2zq^9v*2Y)3{n|F76V zOC#S1>(hCn+zox^j>EUzb$(vseemn#U68wMC+e{`*j!+xvF#i&oX7xB0|ImZ8|(}? zuo0>M%UF^s_xTX10$Ee*@C&<}4`kB4$ZX9v{&rNQra+M6r{l>lKy3noj0b|XXdgfc zPH+|L7oyg_DL+KDaNQC65-S$}7kiFvGRtpZy7*dhO9MVhccLvW^Gu2W^w!MEZ<6;{ zM^>KuYy1PB^e-P{naKN93B7#C{47N$z@dBE7PGX% zR^-$wv-W5RE=s|fEZ(*1LL?_A2G@-ny}rog-PC0SwLe9bBeIZ$NeI>^wb^=|uq6xx z@&V*?YugVafj&$o8x>4x4PR?+Ic#7{N=U@bci@=BZMB`R`c=Tqi{e^tMdNdt$H>z& zuZIL_(^*BVPaQM0WI`K${4_4&;7i<;W52;@sWVkM0ZFNo-7@{^WTvQhkliU%yHDMs zw=bgK7iw#vdr`*i+KfJ7Hj0CM(6h>tB-P|3Ejml^Uul}>faH?5^I9zT-ABSYL-mK0lO;=CYnz5I#H&(3fpo}bJMZuNeo`IVY|+aD{T5OpYAs`rthOqiTC(U-R=ifWF2+;yMgJ3V-^nca!(Ei7_1ilQ!ebu`XxEW>s4o4U?q}7x0)N3El@(Usy2T7 zl$&yHtovueS+-Q@te)5(aw2FeO&O!4g=!_vm!P309{r9RRWtkX+26jcY4-#bzbk69 zuwZ`tq@krMaBkvYSN3ZK;U%uybE(a<)1JQvLY~3rHONf0OPxxLg~@vg(Kz`X%7K-E z>l)pm|8y5bUe??`k@%hkI;)cYW?gsH!EjU}n=~@6G{c$wO32~TRgn1_VO(UlAH;r7 z=GFy{^z+gyA>sk7ANqs`qX+EvC7|~)YTV54t}KnRE0twfn`F9e##lRF_!OsGB{h(S z>q4`GfDHG09w27Udfs(w{Tw*gJToJX-OUpHJC@Sce#0r~)M0bmbKJI(<$r6S|7R2C zX#M@4Y~=Y3?(TiQcM3z!LPm&s4p8Nf3?lpV5`MgyM`lXXVN@0rYgPRvBcCA-Q?Fyd zk}dZevunyR>b#60j<9T>dC6WLrgu_!YFppp&VW^HKE78|$$RgmqU-#|RHmub`#6Xx zetb-P)M7Jr*+m1$x2Q~>BdW;p-Lxoa0jTopM=Rngd^mk!Uut%P1Way|L4r61sxKr8 zD;-@XyrZa&X!WdQ-mo4498-!;g;M7am)A)W^GV#}S)LwK&N=x7EG(%#CAdBg;AwyN z-+oTQE9Wi9?5c4}M;*4}=q%<*7~|M-LF&w*x}Ohi@>3&`@3Y z;3_mr>}EvC-Jz2Wl4GG$ntg*=(z?Q}d6*8dwmF%UO>)G6s&gWngA4erxD7t#k{6;V z?agddBcTC3Bgh2boke-`3UG@Tp_z}_Tlo$#r2*{Z#nRnxQpFqWO2?}E-anFOvzc6- z-dEr8(4uyfSBr1b#~#!r{43j{3P*;rjfcu#yai|j<)E@QnTwdd1JItjnV&(SX^&7; zK_4THhocWL*HzL;tU=r7+zWJG**|9#^XJ)a&7^0MKuJFf(}~zRoDsG)hf1(nj(5&K zA`G?3j~eWLRlS73_Rvx1Oo<(weT{rAIiutjdH}sY^|pFnwZ30FzCCVU2ZJdHbyzVQ z`AU%?*`KxBsMXTe-{{h z>CD@gD$Hwi`CsVypV2nvGZ$N#hv@#p|MKqCGAI*YiB(#^*?HWh&PfIR5%OY`yK7wN z@==YC&HK3jepiadz+!7!vI)wL!ZP(UAnF?Tw=U`dcj~vik`mXPrjw(zPvG65op$w^ z*4d*O|J0t(u{^31D23H_|E;ZaOlHnKUsp?Dd)M-r|ACjNaqt8 zA;na;;Hjw$^Hi+B-)`MCk=2QjjFx(p5`4p(?l#B_+1kzA83*g#Lh|RCUQ(tAhlu#BoncNR>o*+kw zc*8H7^sK@|wGi9f4_y*j0Cc*i+BL_#9%A_Sam5$o4q_}_n}dAIKnfc~%42ps{i34h zXC-*}d|zQFb#&F^F0Nxai;m#aSq(4PHnGGZi$Is-{h4Ht@GnLNgWOsze#Ho27V688 zw8p*C2?-gU{jg*|@nq2emz?h%VWds`#(33hMQ-zJqav)!d$nIJgh7PdaD;PpJsYia zF%%6>xUYxM(rCFn#p*gDYrJQ)C8PIF4T0VHaGUaGt3mSaJW6WJhp6Sj^uI7VfUJAL z!*BZdQ{3LK2jyZ~)aKenc&*d|P)#6BCUP&8TYR|Tj$iCz?4B}r;QO}MeB#jJI?F1S zUp5x=2y+#zt&KOH#Dd$uADKgDB{-PnrcOkg>mBxU8r_pnWz89SJ*Sg;xQD;L6nq@@ zYWkiMy-qkjy)HW5Y=`XcR6)(bErh6R1@mz9x>n}LymBvqdCx8F=SDt5KH%#X2&tv^ zv+uhSc^vRKj@pvLbtYV23_ziJF@$saK4Y#{|3AY?)~5wkudMyWMi<1v`ajt7CNt*D z12vI(n+HI{UaUKVtq-50fnscoG|UV|Zdz8staSlZy#!K*^-%uq)Z`nMS$jaUYppuO ziG(;nz+0j+kp-&z$8bbhG_PXh2+^(tF0$=qOLP-(@ww@BOr4L#cfQ<;m1XQGil12} z&Y{#p7!HP=X2i-8q)ft9nK9(N7#293e}dccrKO<0+@O2+%6XN+#!yAuk#sG5;u>20 zqXJWbB~b1cLwVAdLyrUODscmte1q@t+iO!twMW`F;n9Ez0=o;L>5juk>I9=rUK$N@ z_p<7vKP!Y!!IT}MeupLR2Pb>NZnr<=Z^!U)({JWb4s^Pc$-&1eh`}=wddKHmWRfG!bW4o{%v5W_YGFuJw#tY*yHc%VI zs#i~V=Xr)~eJOC@szdyf`s4(&g+MEaGZl$Vm8`*{g^M<0oNOAiLIy4=Rn|mnq?J6R z<#>y|k3Z;2{4A=&8mvT$&Yqm*E-EmyT@Tg$ihl%m_9z{#%ceZTI;^Tx6f=jm1D&Sx zVTL633VfOfG>#@A&!TtT|kFaqzkRtE8m#@d`SXdfN9g65M zoUQUuh}v6BHY=ANn#;Z>`FPl^RaT6w)dxFYjl3rBlgHK^x1x1UFmGI|Z$=BUtiLU` ziRr%#8;~o)UQauC=7~SPCk1TFG2dTF-;&SullE=8yV;*omfsE*)Tb3{4-l%EEH}h@ zuDJ(FbvKI4P8*K3O)80}nrW=N^|MM=j}l5diR4e!!&dBst2sJ)x~2H4A6Som%yZkm zbjV_kaezC3gI5~}vc<`HIxk2g@TOL{>GFQ{*zfr2j+q|laK;xXvf#isglmNG2Zub3 zv~hVl5h4?=Z@(JP(ZfM?qgZQO=K#lF)*exTo?V>K^Qncw?)zQ0BM<4Ej0kZKWEt=D zFt_@^y3@!$K^S2f#TMMmZ_Qyt1b1hfrjbmseKp`3+{2KuoU8Umyy~nRUMaik{5bn2#Y=P(_~+oUE0c_N&x9vQkkC#l_{`$P}TY}F@NFHojA(h z_QSCK<9aw%yza`2DE_r*ynlJy%_sk+3|LH1{SwRVbSFhtCO}(ExYa{8EVWy{HMv>L zNJG_MX3=7D+s1YM-cA6@AoTJxW$t{}Q?uOx2Og>bf< z1yCOVJsll|daq5J1He`~Eq(;Rd$fxi7MKAPj zTHOb>#31(LyJ(&mF4txo6fok=GDp@C;#mV;?coKfJ>r!fIZZ5b3oC2e1=1F-2n-RJ zYXk-+|941 z`Y$Hx#Kb?Ux(^j^xBAQ`s5t(BJ8K;P%7MCILj-ze7wZ!z32FiDv~ew3SOWvG{(1)h zA9gQQL~AVf@yyEvw{c0MWP-kk1WhDWFaq%?)}EWv1akf;JZ{m%MDaWp0xzh{*`+81Fm8%HbpO~oiQdMmL>KOYAbsJ(*9GUYjds{f6UV*Ef*iKd z)bBPZCO-MpH3d!}g@=9z*|k~2t#qp_s|vYy9lu8&eJwqYE7EZ%qDP3nj^*&o7i=Gz zk3ZMxyEUcIhu5229ShU*7h~)uuZV&inN>*+p){%=o&qM8Lh|VT7j;B_0Q-w+-)=O@ zjsMQkJZt}WmWnfive*B4?EDR`?{lZ>4{56tqh5v;+~58o_gaX&?E;7f+f&)YC)QaP z<)skjx%>h#6I0&avrh8e-RJ9FsTZ727Y|>}eGAo4b(&X%T_&UK z8cJfW52j>-4e=1!15K^a>@3h^cI5SN<)Q12H~BlEyFZc`0oV_FNn*sf-fxY(@Ta)K zbuz~$DWoRH5w(Ac?k(V5$enaLJ|709LDvY|ELj*|InGm%e{2jaK5*2k>`TEFpKMn1p{ z7!dDQDJAwacwz%-20R07QipeWy$gd(pw#sR`CeYpxnH)siKWuDM)fKObxFsWlH^Vh^h zzOqeQDywzGyG<&CzErad5OAEb9W`JUIDL>n1c07q($duRpP4AlFZzQF4vi&`^8#hpYv-nx#S^oBN$^h)KSdVpHx?px*)i3rqMq*NA3SP+?@2I%K!#1 zj_?D!NRS@vmw{0r4I$r!2e*KQLkrXxf9*ZYtn)~v+fYcf>#)&vL@;`G)d-gtf(qJ%(V5k~uD|x3zaAm!-gPb)pf55v zYBQob$oe$9Uon&VDf`#KIoT{8E(h7I37*7~$+6eF5M+})ARZ^>I@hQ=OuDa~R*+jC z*Nw6U__GOys(=~QnhHZNk|yH&r}c!D%L{sk~-Q_ zAvx8oHHPA0k{GXe6=@Beuvsd&Cc#Tsyj3>Bs29F#Hfg|PA`&y$F*?hGCp1Bq>0F(! zgqpoK6EOUEL9QgnrOQ4&t2hMjv;W?(LhSRN{vv|eT}1E=I-zjBeSv;-_|`ytx?$AR zv?o57?0iuuI6HMdQe+iS55ydU|hf zj4=IIgu1<9^+_!3_FDFx^8VZyZxa{c-To3q>Sv>dx%&94-mdMQ&2HBMLW3cSYR}BFe&&T zl{PXFu23iV8stMVggJX`zA5H)NbO@0;a?gWIeS_ADWAn__;jELj|H@t*}XDBi4*^f zS2bIL<29?^rmi^FH@?>Pu&VK#PT|xfLa| zd$f^9C)Jt~Z(_)>WH0?`CE8X&FX?$_1oARo=@D6+thQn9R-Ih6Nu1sO$&Zl6!a0mn zO>sD_oEY*zFRn>$9R0oDv-w)=YH7gJ&D$eS@^iTyC=~AXsESIfQb-U}{kF9CSLa|`OMzOWYav1+?7miPh*o8;%2FE+ON5kd~Jl*~w1tj#IKX)9eDQd)^6q5uiC9gRj9 zi!ETu zMc_|`RbV-|h2pZ&2orEEnh#+ZC$bL%I@{#>ZmRG;fUAz!Xq!GRZzQIj1+xot+0_Tc zFcW#&vCbUCt5Fgvt+DIcPB62&OF%EwUbKb3r2BRi*0DVBDUOb<0bJuE-H8FPV@_&5 zFeWerk!ddrlRs|m+`pgMfY_SZKkrhGvUn<2?wQH5cx*I-+>$7ChFOVNM&d|yDl@mV2`CuT?K#og;25LytD2ucYf4xJ&K)d-(R6;-Z zAcT04CbClZZN!Q#h@FmeZ>x0FsKRYZ71-zoK7UlWL?c%wqYIty^;^_uK>9$hyZQkU zUc*L|Jb8pgK5yMcJtHoE6B-P}%$48H?_8Ceyg!Bl>^^da6FnbwE^L z(Q^eSzSkN@G13d7l($79@_t?2c_xob*5@;Jl6 zRdjp0+F5iu*pWxLnKSk7cY7NYc{<;%`(?gt=mqNiuCb+u(NQPD46)+p`jB_|-u`jM zUn{DOs_}p0F(lmo!=+~|vhP3Pg$*FGsQHV8npipxO0@ThO9c^;YNPv~(pmL!2DC-D z2aQ}6*A=UQ)8m!1Yi3Ymi3`GJ9<$YSxY#O8>q^#B!WZDTaP(Q2&w0^J%F5rw)*b*| zCv#X@Kh1lHWsQ(BrzoB5plKT?eG-ozd&ph}+%~qxYFF=!kVUsl#4HA6-(pU@t3{Ce3YQ48Pq_orUBVbe`@Z zqnK}f4D`VqV9xyfA<8F6tu2iN{yv?>PuPYQ#-&#GG*SV2jPmPPxt=^yv)yg-l>DOW6RDpo zjmu69_|iN1^6eFAkM&yvp+n5)`jeYJ3kTQ2$x(03;mO2@CzMf>n-2!WuclS|aw)Da z%ieHLKP#M*9`loXe)?76Tb_V2;OGn+?#RPABkC>(^tN~Tch$|K>kb%3x%EUDmZtx@ zwsZe^#yB3G$WGt);qvG>?x{@3U(WuyGb_gWLZs|sKMyJTIq7e)-IE8`BYMBPw-U+V zJ;ur(tL-267=}(On^$&5b4^}%X-IkazAu;EK%$nuN;SxT!?*t1wjWnr!?$1m6PJWy z280%}J^dHqQBhlDTRUbxgl4kORM?c9!l@|)&I_h}gr-)K7?YWmHi4%r(3R&&)JA0P zsXuCXxlfsu?@0N;ay(nujgG6j_ZO{{2`m(7A0Ee_NO6y!}vUyNr!b7YWSDj zwNOuMIMr;5!L}{*8@chQTN;=?|K^xWw-E<01nB;HDPGGewLmJ^vNc)CFbs78_5|&XBhYjHyoew(a3<5^gaM?H&j zl3OO&LC{ML3;yswz{WoI~Pl3_xSNrL-OGPc0 z9eubSe8CoVzxJ|PpY=NyoLkqyuOO@X?1!hX)ELV)Px@bOQkF(w(N2P`5cq-3NL4jM znpO4${I97*!H?9PJN(f3FOQcyb*}!>^LC54 z51w(PD>(kP@9me|PuOSdsBeYE*8`k>ry}}(JpM}Zz?b(+#Vx(}sU6m#o=z}s(x(5d ziHsVMuXPWq|K{dqBW#=1l(<%vx1iF8nPfDW*g6}QLNwjDwdLA^EWgVc#%Pw^Yhae71~^Ufk- zj5*P*@@&rsH*#kSlzU#A^*qc>MY&&`h!A$;N!n&D0(I(hlQ(*XL?R%o!rO07xz?e0 zjn+?@lPpud{>c#NKRbidZ}1jkZTS?1tfi?LSw;;q*oiQz&aGHFm#UKHB2VAHRa z$60Ithp`XovPyb69f=7}-&NVQI;XMoe4v-jWOlp@Io|gP&2h-82D}~)zvwpc(58;_ zGwI@5d?AU4I|-2)k>YyqI>Xeb-yu65!QerK=-D@ar_v%B>v~<>2d0B>8jK;Bo0rK1 zE!~4Jw zeNk(#Gk5>#%t5hzgS!G^N~Gy?pu|Q@CRFEBarM(6gM*ho9p5t{pMa&oPZ`6W5fkrst#UI6>-|QM)I3Jw~Qyn2meB zGIu}nr=xXwXSiW{+N&mYjli7%tH0`L?Fq*vDN7T~Hq6bWD9_pSS#BOrjph7QS2Nl6CKo*SxbKmT}g)~u5F^tiHLUvZy6SzdI}xevRM%!smd(_qAH zp3(9vCHw8%UU?nWt?C4bn*1GV!?d)A&ycqC`h zr(Zl{P3oq)O-4?j2OIF>&m&%5UkMnf{h%8FnB5%*Mg5L9Q8^~*Pge77RDVWKlZsTV ziM3pv3v0Zc%ZF5YH zu@S0D@?Xi-!W722&h(}Ybs5`-j(gsOV{68qbLgC?d79nMfE&|k-3Dy+U%46R9pk#t zG#SVu-!%5Sd|sKaTw7JgIR$hh@tbD6rgqG%$NahIaT{>_TI$nfc7f&11Z=x?Rt3-{ zUCq(4s3lWH5ni3(4o>OaK-Xm*@INp_+mk%4XvHlO(LPukXCsm$R}Kho?aD?Uv`5_{ zmKReVZk(7XLcp{hU(@C@PPH1t4Hsh0J9PMf zuknp%Y1XhnIN+~vvoaAe-M28`H*SY4fxnshTelZX-VuXEx~k^G(gWf)r<8!gWjE#N znyW-oMV~+1Quru;pF1HY*=Rsu;l7cg((g6mmKo^0jovrRDCf_3A{A`o-ZO`GQGz)y zKkk0#g$>L1@Or;)5Sct=+f{e9{q^w-%OkYa_dc}0+o8PdGW5O3ccEzJNw$+Po?5$m za}0GpD-nB0!E>nSE`z#kGE3l)Uh0|O9s%jZxsjiKo@OkNK63QB;t7+#+EriLtwB#z zt%I%ppLhiqF$i$#1;g@?b@&{3w||Nnd`O(`?+Wzq!KaU_tIG}~J-Nu1s&pQ#XZ>6f zg-)g$lR4_?*Fe-&L+hOCXuz{`?n^ROy1&#W*#FUUsKRo2EXC5eltktLxzI>UiIaWX z(l}`}{L)hDIi-?@Zk&-rA10c6#IJ11jyqhDn8E{RQn5X~>k3|Y4S7}oO~sZ_yE49s z6pj(ipp|-K!ET0VYvz0+h8&roiPqx;#nzP5`qLP+yipy?!zL}r8U2NcGLvarCz{7^ z8Fnq`PmB?~uoD)ce@+Wxg@LeTSSKfDXe&3{`mpCp8Gr1V7OqnZGmXLV&RzIowM|_d zk>|)%yV}82yEIr$W@>&Ix0IbfEcZ{B3zAj?&p*7^95wq5=*T|_Gbc-?&l}o3_iDV1 z@m6pnHdf{i2^E!;XNhwLH4ukMlnSj-gV*n0b!`u=pcutdi|W8FVf^>HkPfenZF zj?P=dGK}pUO2EybD{}Todlqquh9{y)eFsCrO{-My`O6vDIsUBYkKkw7_(@v58dv|~1wD0caE%3u% z*LiC?wms|fuFK_7(DWrLUn>wO2)aq6Tp zTN$Bs*LK6jcmf2Q$Fc6g1M9eRKZP_|{1+zag+)E`3-v=S?Ko)r&uGB(jj8j1A@{Yy zSlMINZ*y~FTX;@l_A4vJiE+;&MT#}|+oj}Ib5ivN7Uf=I2KCbG&c^6aZUb3qpaN1( z@&Un9OmD^y0aVU&gI<1q2PythLIRebWJVKB9F!Eo#z*UQqm>(uEH@lQGKo~IF|tF| zi`cnoQYZbKpU%oEPf_;97fC$x^R`kk9(ZPO4aHw7*$Lz_Zk)^AO4)O9HdnEgN?RxE zD=0wT*nfYW3-(L+a}jV8M#34xZZ1K1Dsi%yMIT3<9l8SR(^I-9eK#zXJJq*cz9`Uy z@B0M25yL}aKwC!_T;JReec(4tl01U3pvFgeJjvDhlkcqH1T;s+Tm`yd@yROYUCV6- znc)&(ow0;6Jb}NDiJep6buUDZSKZUVCtm?-TAXdj^;8wBrcB+43b+HF6{|n0c!ccC1=(d0k`a8Acwv zP!T5o&^r?m9R2*wx(sf#4nm)`C;=_daZ76FpA8LXhHVO;u=9K9;~RC*OB~ut18?S+ zm61lsQHE)%3%^`vI^ZOKUa|IjDqs4sSuyOs1ixM@Or*@9fMj|=U0z)%)9RrM5$MFR z9ET*I%g>|Z_lbn;I|Ya>y`S&))Anq8-kbo##wi72s&9Qz)19V5XGxRh`0jY9*Di{0 zunlBe9%o$)mso~qZq9n>l#}NlR&WZNyYNr1mV6Y{y#7Vt3dBDv6!IH<-BZnH$>N=W z)w$oT?%_c&uyt)FaGT87XtRp2j*Rwzh(L>xOP8fe;>v&-m6vQ$nKXhSm~1tX?VmF& z8J0s$+@oa;akVCk3T}%bFp;yNZA*&Fy+B?SVb=T!tao^Q3#J4Z2^N zn6V4uc0PYcebQe(Z72~=NyhxNS5#tX=bD>uHDDy(_N0A~2H~L0aV(X7KEkRypMLV<3p9ExiTb~J}m8Qh)d1g8|clIVOwJ~ zYm7k{Xjjp=@w&i^Ms3VO_FL7yNv$4y*}AKP@o>-Bu&%`_wGQD1B+XwHVtNq3AMce{ ziFZ0bD;s_KmDN{sLzrP5jmvZtTUZf?Ompv|%H@Fs}EfzB5!Rd6J605MMP zd#1x@M|i}H%Of3(W~E9z4+WalOKhW$yl@`WJ1?o*yXMpb+`HLj1lKzg%yqA{xX0(} zx+JfYW$nCA<%)m-pMYuijmuIRev>Y3E137QkptoT5^P7xG#V>L$9wd2pwsmjmd6t| za-8?nwCB+RJALAomN6NuZ}%Pg+Lm@)YY&@_mHofj^YfqnhP=yNtNBmEdkqx%L@2tw zpASdvM`9-o8mwYHfqy1kuLr$&0R=?K86zEygH+TPDxvnj)Kc z^RO}3vzzKpy$Jg$`_x@1A2^Vz@PLR}aW`|m4mLVXVVRsmLA5+HFJBM-USm@ys!|-F)};@PF$gSRP@BZBX=RMe$s2q>a z1-igDlx-@PafOnBX|{FzmGx9K)Mp8dA|&N`|arccORPF&qLC2bx@_1Ij_5 zN6~Q@fmCMAGM6>E>@AzVlWqTDOpcT>djUGTkqzf9UtHEbC{zG&BJf_}8w@M~oc*}j z%ls*$oUmLhe#3!q|5);cilU^pRi-v$RWr4m4x*Z5DN`xkP^-?L{ zf}|h5OE&2$YV%voTPagU#;4Cwgxp=1TK>c|&-BS>Oer`zU3m>dECcXCrO*w~& z@lCF2sws$F-3~yg;S$G15UDd?CCx(&+MdEA=KAaN0Xpr22iF2=EGQ#kBG7w3Aaa{m+7+2e6*;sR2CO>BzJL_y# zGS1tiwLbiT14 zJfV(1Ze86e*M6X^G=0D}!_mx#a>9&&^^dDQ8=Id;W;&gc3M85XonWbR@G{+cFbBUm zC>KrhnEjwF45TZmx8z2r)mgWWg_AbiV{IFzf#Yh}H2Hg_U1DV0$oxQG?M99*KB$_R zBn&&=>~Z0kbcF|P62nI^xE>5a*7s0q*_c6HYJ%O9ql29R?C=`R+iems!JN0Y0U7-k zKI}HT%hqe6t_zmt@4VYfoVE+)i%&v#+^kkw8)2SN?`o;jNh~%iYxBKzUt0Sed^nnv zoH*uL8~0$g@i>JzACnjw#wVB{kyuU&;`@FlCf!s-klgdqQ4hK#{Nxp(bQQOr64B0W z8F5?(IOg$(_dxy<2IT79;_nvhZ|pgV*Tat4^9gE%Lw5vqtn-Z(VZB|=>hwRq56Ugg zVZwMoo8!HsZFpK>5Rp=6j5&v@{g#r~&K%+ECxZY4A;p#qfS0iV7fQ%llMw>ZqE3GO z++tszwRQbNaya41$=iX#zmy+WMyS_-SJIJ|yagaTmtXTdGtD5mJ zrCDbg1ExxZCz5CKea$!^SaMdHO({Z2KMn#j#bjGkcDDWBD}xG2J@{; z5Gk^&tzj)yNj|<%)3I+clcUwUZ92x8idNP+wLS0%>t?h7T4*Z z-Ft9JedV3-b!`(02sQEbjkEV<@-+KhHJB5oo0dS-Pj@Qipt;?}wlk#RYB$)~MtZy* z*CI_Kj!eUGrp$%|lx|dE_ieVm^TrKbE=d`XpeRIl4q?<7azO!n$kv~QPB*SlnU(wE z5!rI4<)k2Wuq<3Rs6?<@YPQZ99nqJ~L#EmPq#a^N7qfIU=i;0~jhL z+;D50hMMaM?KTSQasM5tkiY*^bMmoVWv%|HIXj};^V5V0x9yXLu9F#1nQyQZ8kEgp zrZ%puI8#jz%~ut^{$vAjtBN-nh=~?YqC-1uj>2)Q97xc$t3C`AZ%xPSqR9^p98=PcBeDo4k5s z>ArmPSe_uYZqGIw?W|P7P`5!C6a}&}%u_X`k`Oh!iy;bPlR?p>qhO8R>562I-aTsjd(djUPIr>b z!~Lzd>DX_Cm?kM5m5r1EngU{vGt~p`dF5Ti9W@wyI@qcSS_f(B?&ZIWn!>r_#yzpe z>c%uUHT7JId_MRpjWni)%fq9F1JuO@_a1AxSU&bzDZzvu-fr7X67bJ4&6MzWLLg z)xbcXD6OUY#qx9Xs6~gwosjTiWRhPd$jQRjmFz=?o2cpGfz|>yry$4V>)D9OAu*MY z+*-GNbReU%=+yoUm+VMD!N~yJp%N_lPHykd|CS+we`P4dLvuF$KV?YoxePh^Uf*LI z7#!7pLUBPsE)Y;>+M_S!Qpd{(H-FXlu5{wya~WSSOG)gK39@!9e8zEm`~!aPWdUjw zdEAn0?Lcbo!?xIEi{|<8cjl|9flE2=`3nuh{I(E;P0WA!3|!8u!$MiqcD5;E-?vKp8Hva8};)!nO-U3C;}UwZDBPo z{MFoc0dJ=phK3PfX9ou|i6!bBmSUsi@vEoEPY0nQV%$Y=Od7Wz>x9=WURZ_G^Ig3~yQk%7@ZeSuQA#(n^AmHvYpIDvL2_FT;?E2~0)o7$j zqDzepd&+N-BQ?d^_P{G%Uxyej1y`D@gzc07{^Q{)*S!TKAs(fn0z)y8f@INB_voCg z=?pa5;-i(Jn47%@=(P9E=-_8da}jV27Lqm!`gwkdC+UxRa6Mk<*7LA_PZGo|lasBF zYKK0|8{ynX@A~37WCZ(siFyuwHyI?cQG6*~7cO1!!nQ*prSVIPWQ7~_h6@v^>CjLQ zc>x)U&KaBKjYz!FKTgihmIn!T3c6QeS)*-`At|?|$O-}*qK0N$msA4jSJj!IK+HLP zwAMU3oV8Mu8{NG~r)9Z@fTdI{Ll_Spl{@Cp`UH+?UaA$7<15olHNVKC-o3dPCi8Q0 z>%Qq(h^64np!AwtE<-27FPAB??qe?{Z)zC|-9QOdBK`t(gRs4yfssDDtSC{K^@sfn zfC`I3dyaUnn%=ydY*{f^5NA{Vg(}66jO~>VVq9N#m%qjrnBJj$vNpJEYaC`g<@CPU ze7N0>?ewME4@P)EW~O*DxDSIM@4%$gihp@qJU1MTq~|09$h_-3;QM@ztlj1T=D*=U z3%I#gN$ObqiQ=-$w{@?i%LMu9+B?++_&GECadP(Rav5JiIaylxi2@N`#mAg8v z4z8B16?(g{V%q%{13Kj$+ZFe2V1eDh&`T9ubx?`d`5xuS|nOC_N?+q zT1_hbR3=&Xcxh+#*`2Y)$;k41iGAwWhr4~`lJTZVA|wu4V7L zuK@vfC;Hw)DEY4fbipPJE9LSN?w@!qYW&IHw!%w+^Q#+S@w68TVJ&NU$dS@nB)a^EF74r7P zLx5%;`#ChnMj3=hcQ~Q%A_ApwoN#Z)3fm?kLF=*4G-AR_kci5)>Exf45ani}e&XTp zO%VnYE@33Ai(6RFs_lT$EkmE3Wqz-(Mx^nZw-VL-X*i@qtY1#$^+Aew$=;h4HV@Vw zE*NqQ9q$eJ=5OiGuV{ui+29rdV8qj#2$Cn5#Lsm7Y*iO;Zv{M8uZw%S2;JeZ@@KAzY4Vvl0ffQObRKk-_Tz}#d&EulWb-Uo6`d~ zP=x+h_kSL*pS82GitW_V|0uHIowXbW)PCn!VPD-wVob4Ueu<7i8|Hbn#52ev2i7Y1 z#(CDQbV{t$@g30Zu7!e=7s4fVca+cVdrX3Y%l4^0iy3~{S#Dz)e4=>?`U(`tIbvYi zgH!D{F{jm(M%59>zgn4qDe6na$=1IsJT(7JlzNZnGjh6B>?bPil(a9#j3IxOt+!CF z-2PrUM2zwDv6>2Ts5jixVm>>&pQ=!nV^}on-iYje-EaAWOf)TO!gC+{BlCet1(G4f z{@TP#PEZpP`Z-U+ID@`{O7y`3pCm9T9ZBD9_=F3yv*~(M_!4E{3s#Z77zR@pSh!QT zvlWG0;d7e?ZMK~|8ytC4FG@XJc-0vWBM%!c-I5V~eE)`dxT+zv9J%ukIl!9s$9X%u z5zf#Yi$dm*jDAvb0DjFve9+bD%Vi`y>@wjcEM(w@q|(g>88xP-&vdfPi-)P;vW|WV z{Zxrh$Bfc6(dC@QEgvj+doJAf6_<{Kn#dYk-w$XQs$2( z1F12V!a-I)a|b!4#6@HJzt!bcpa~%0ZhDpD+SOP%2bR~)TOXbJ7j23%oPH&f$=*Y~ z&yqV%d{1(}Ce)Y(Es(8!H6L?9uGq7gA#-hm{X&)p+=6IpNq*miUTzYX-lVoA`CLos zxBEl)m>$9*tx?MtL*UTOgVp!o2EfgX7@+m`bQY*2Uz^&z9RXE@<2133l?lJrgeCnx z(%%y+s0lj!smmIX<%HY}is$6kLt%5^XOM3$KcMMoyU*yZZRv2jzCLugTKWH(pq8Hg zwZVsupEel(DQ*HNS$^i`XYu5xzyrJr(>`;EIg37aq^)m1BPXiHfq3DXs=eWMT-o&8 z*e1D7-4M;eK(n#K^%Z%-eT(sot4ykD974S%vM8M1MA<=u37cvlE03?bFnNqIeOwGr z&0^7SEa;fT@a&IIfCkQ8>{X@_NDxG^bWYpEpBXuzRh2$ef1zH}4%QW|iK$VDGO)(M z_*l!aKE-BQcgEx$CIdhTbZ&brL*F?KwZXDduSXI!XxdlXv*R{%B-_}}EsOQtP8un; zo515lDm_%(zFPUR&oUXpO^z>sNtToW^vRjH8s2;WA^`zEy{?hO#W{&-+>ccao#8IX zIH5;S6jEoyo9nE6B>S1ty)VDt>~$~XI(d=}8Qxj1^*0~XE5?J|9+>yp#8X91C?AnA zN-wJy7Up?rLoL;D(v#IlrkpN;1x?m$7HZDITw z^6=Qy(vs5j(HWHLt4lzs?6v0)6RqbX{U&&OgkDgPQ2i$-VOf*}q->Wr;Ndol0lAk@ z>!U8r$V;bbiij#Pt*I-&CA7V);!G?(tg8N`#K#^omzZq@>rgkY_^k6)20Z17{_DMi z+cG&$xQ!&IP54RzXc6}!>L`{+Ml|mr1IVz@>=Cz4Ph+^*%@_!*c{yly#ni`6Ye-A8 z!xY!(ck_MN=V|o*Dg=@BIQ@4)Q-!>PhZKJPYpGssweU)QYsz_nNJ`Pl05&fgB8=jU z;-W2f{$T&(>eAq-h=l=Ct3LXT>NyOn^&UF}>_8&m9yw5AJoMXIf2ilS>AU)dF?0oh=IQGpTk!?%yCp2CcF_ zMX;M1>~aw)#LoI&ER24ebz%9g(DwoIRj7CQmI>E5>E2$!MYXwZoVPk~KMs8QbzGo# zUnD!7Iv`j%HE-S3a6{<*QD+Upq11cg!EXI5)xI?=!#GfWATT995)p2(gtmYwc!b1& zTy#D9LpM{2sQ7%2^x~ad-mmC~ZOT4QmluEsx^=MBFaG5x^U=D@oMZX0jU_l{o!0^( zaIs04krRV%gI-vFi-MzRx=0Z?epOWFQS-7WrM5 z^)8oG`YW>-NY%StYAy#fr%pNmN-;L9qa7!%EDGA8LfO>5>k%ZqYtKDlJlIOV0HYj}pq;UqA^keIZyZwh~Wk+!g&xpJ>$M(NojY;c;GvCb%I`anC#+8?WA* zpt-!_d|TLkL6P=B={JQ~f>NtxtMS<`k$vyVJto#v0Hyhrp2zED%324j)LmT3VeuBx zd*~_=&OeMO|9=<}>FqzN%8_vP^?xv;IU3+05~l~Ejr#M~k9Ryf%@c1Jl}lb_L(ls& zixno4&Y#6LRVH9bwI|Ll?^2uI@6}oJq~k(EFGj1>6H`;l7To2LU{r#d6=IfUWX}eJxyQBTahft?X&#F`Bw(JJ=ru|6>CqQ+ zmZMG~R-Sclw*6042(Y1qvKbvJMz%>70q_Ie-wn}Tk9+}qMr=sC6j*{F`K*eLTMZ~! zni$?{WUywNMep}#h0!YO74Z5Mjj;J1(#wV4fBH;xNuuW>Y#X9Vpy(SQ>LMOf0h z&IGLl51#4Uv~Q$&h-S8o7XPTpY8vgm_sEvtY&?TWw$jGI4mThv;|k+PduN>qNUl{a zO@96*;S}<^jyXt>-=9RhP){S8vKUgDGVv%xy#A#K__QrO$+x^>x{sC}r(kjMEg0g~ z(>fcT{$0C%4P<7W8tl4+m3-$OY~%!Ro>9G$L~6^{#lhiFQn*o)Y!;`<*0~A9sFcMo z&N~d^tD1}>d*$Qlj39J3*^eC(DQ0zrhhq7lH25LqE{$xtCegwwT;=_Ac$XN!tuJLD zpk}n-8{Qz7^`qCBGGg2nvJx#w!LuqzBLLC+35Um#?m~ZrVMt-Yu1^0bCBVARq~N1D z(F-Buop_t&S1)dnNnv8JS=*uuRKgo>)^!yz0M#{tr~d9G%yUWi5^o!`-rivb^5!sV z`fbJkpvcywf7rm=b3SqMKkZZW85?Z$uAU)UvzKs!BMUo8cxY>5g~H8qEtfyR!*Hi^ zrxKH>Rr-5vi01dd?eM@{#&uY+kSmt}Iw|Q?bYm<&j<IR(!LmC;)LSp zVG*oIyX}ti%T%+y;>rgFw)pMD)2YVq`J5MF``i0+O{+?8RSMmpcD@%^?KpE-cj$X5S&rR%2GwSfG zrhZE^mwM53Jb~FxJ#m3^+ia@uqbe9a@=TXA?|ZrlysXHkmD|ZEDR+L*{C-Z&k{KEv zs+(?A9p2oftFiWak>N#%oyA4)TVB6JAS)r&5IS9UVo>qpR&LOi?=CHVC=Tk@8RISf zEUcGg@o8{*F(ky|cscy+YE;^v-aAigsBkZ*S%0EBx zF_Iei*08yL6uK;**b8ys{qaMa3B~R~=)1GjSMJwW#9RP2Gw(LVE<4W5=F+;Eo{kKe z3oqKh20Fy}Y}s$6{q59+LsFVetp*){K^tt_UFMqi?3oZ_1QhEADEy`L5AFr!9^N*3h5@S*)Pp~vOEAZ@@3Li?AA+X#cro~+J`98ST~vMd=3 z)|61YK~paB4->vV^CwP!YuBUTZHMG(sntX@v27=2wPLMz&9&vCRyJt?86&QgFn+I0 zNqO_xkMLAM2IX!v{SHRA)f{@HR7JI}8Lrc?Y7`R47?pU0+ZMBLpH=EdjLu(=yo1TU z5uvKJ&!(l{JD?Zym2@Nw!sGq1JPBWX+(x)eqD+yv4CzKiybwCsSmNao+CeoelyrYF zd?hV{;!H^0!Kk+ICLRdu;E~ujn zRtK?P&@bmhlKrP4gxZ*cuaDm#t>yiIQpyy@3pS+dF!b}da%AavF(A3iyA2m--Mkh@ z@V+YgaD!~L<38X&tnd125ipBI(L%H^mV7kY(Gu!5gz8Oretba9f~WSz0V{v(r?%KT zMth-Je0K)0o4A(Fy8eci5rUd1m-!pcekc#!3BO3b>#xJ=FN=+oUS9=2Dm;Dgsl*d| z?07WZK8bq+U)t&lUDT}(8a2x@FJ__fd%+jv~QT$)%~oA8<@)Xo*6)ITc$>Vi<_zI{8dc%;?(GCl- z7d1IGx%;axwO;nA|25h6nG0`63y7TjdEIcEoX2lrQWijgOjgA7K1}m&z7-`V>97Jj zG?YV;Kl|kgW-^my!i`ODJ)J?6l^bvp<90oQw`@E=-p&QH49zl3$^Dx6o0iMBsif;7 z+N3!)gj({|@aGRtkvccP0h72c;c7yjnvb+2r=wimY#DD2h0P)W%{7N>zH^N)tF~p| z+o(2L6-SU+7TPXU9eEw-^or^vD8Dv?ewUz4l&{BhW$!(ah#Mc}eSaLKqt-tm|E`mo zRM^+7Swo%tK^;n@f%w%lrDrz!%@Q(a=SA>Y;9CC-4qOPcx-Qp0o#%bQi6GTFqmkNn zRpQll!~WBo)IQU00mV-lJ{%M%R`t;s-K4KX&64!IkHxLlan`@~6M7u^j{8t7_9RB* zce`#V=5wOrr(PU9BnWBvawulTjyKX;5(c#wFqepFXct3N$U++MrCrKu7}GQFugFHH z5)!gbR4V2~-OnVOwEoYw?&0uH3b?wQV1sD=QzVW5DUzqhH>CF;M-Ow}6`8(?J9($h zhsuW@-H}8&91oqb`dvhjS+HI(Q9n>8#OsR;108JDwA zMf9MN$)o-v1NHbbswR2T$63Z;09+OZE-YVT#ju9GJYjwh4x*{>_#k59j)J_8vpJ&c z*a)luQDG1|k&u|(IRa2ZQGjwcvhtz}yX@jH#xoRr6l$m}2nGjD-6A2WcG6y0I?Cz; z$hx2c;^GpG!s3JTxTI}K?abIu7k3z<+bU#%#&!NDGFd*f)R}!DULt(0k!W&6;v3lI zw`82?PJ1Fk*eathaZyCz%ggFxY~-q69i_iO^DcI?8tmqoGk2b|1atFMf@Bib2uym_ zDfEkLJl&pEf&h?_$j$D*lXJ;oW#T! zkV^@l2=azJ@nas#t{xA~W$_8z?VwCO%0K$Yn{FQ$`i!y-B$>1qtE(F=Ypv|E#8y_% zhq-$_c*YtwPQD`5dHqS?Eyr8i&Kp1}p;Va(6*U&_h!eT>={BiA_7Bl&*Q1|Jk8^3u z14HULJn>DCy^})xH<#}?@ShM*$F#JWPjSo4FB-6VH%@+IACyW3)R)y&WW*BTh%?z- zl?OEl?+b*06(YKY&Bak|x)ghzF&AfND^I&4_`31pg-#A1lc&WhQPfSbY zA*;=O7_FDUV-aO0TST*=EFvrcbRd;+$@n2|C6aNvV|}uxodW`szo+#5zW5%7-M-}w zVfSM`!)R)YcDH+a-spXZmiTMZj!WmhD!exJoaJfE4d~@U+r|Axyzo`Msin*yNI&fH zumipc-^Rpx+jJKx+3Ts@VKUJ3;|0|+`QF9rV2h!N@2d;bsmOCS*%dTt=;>-4pcLVs zC>vOS$VjaeN;Cs>ZE8u zS#3TVtIB6@e)Brn>L{F6^!0*s!QL@;L5XXy6%k}qWLRrDZ?{qU5sV! zsV`aKd%Z22>FNsXUa*M5?!iLB{%fYh3%03ub9?1`sOqlYN3-sKxO`KI{{->B$XX-f z;~`W`=uO>94%rfNQ!=%xg1-1Y)GR6I#a`J!YIjEttoX%>e5_+ZC@`As3ML<10qZmU zS(5c>yKubzE;VcQKaRd<_1iZB^mI`DT)+-W*!=%fz-<2&u-)Su9&SoQITdHq`Z#Kl zxVm7*jP4DO<>g%N^{Hr>(maLa+>Su(Qok_k=h(}XSk!XiN1XL`8kqVK#8z_j3)tao zmrFI;TY;e~EPs^B?!?nV`L-4=%TiZ-j~R! z>Kvdi#&zwaCnfsAvH4amPT84m&wolIAOs0B*ixyu1}BTw_1Ch#!@iu*qEDw@T{#|v z`oqKE?O|(crSfZOSU>!whn{ceDRO#5nebt91h|%jlw|Odp}8gwtMi<@Wq0udvj>8m zc}hBv=s-?tc`W~10id40DUw!Yf(O=a|02mkt2H{%MqTR{pF+OFbsMV#n^|6B-?gd! zEy~&sn(pR?6J&8eQK4gwoBx5dxS5_H1)HfbRzC|W=I4QDq1fmq3$EwB!sJ z@U)nMLSv_?k=GRB$-`UM@iVdAA|7W9A06;I?!=x#khhI%e82W}t6RhL@3k+2@NX=z zQw_~sQ7e0!Wcn_|b)V|2!t5@bg7L~n%zTs;_XLb|;e8P`G!EqgWoQ2cgMaUi6!}T` zdjRlg*;SY3->QVj80LMOzZ?m$i&O_44}~hm^&L@49k8#4+QY}g(9krqNi$iq zcsslUgzuqSpjL_@&!6iyZDXsgvK3DI9x*+Wsc#OC`xHVvZmC!tL*l6`6Pz z_Na7)FLZh28UgL(&ZLRCn24$%3NBWp6$o3oE#3Jm>%pNbQh(XwANr57_ z)gO?@#95<}l)*=VvHB`=j->HN`$WuxA1$C$Ki{r~+PfNIgCOqEA6oKfl++R_?+;s@ z(=wOBXiyYm-+FQe( zX%I%34nzx9%;Mf!&r;chL)2^OUptAR8CM&&EMD?+13YlUtA=C5?5t$bm-echi1zN60xY+F#p8M0KKeqT4?XyL!!C6Its44oUaCd*^jM^Ef z>Z3Oe4@I5%JW5}-8(Yy*Q;KikpbnqMx$sEd=njbF7qzEE*_b(O3Y#eTSHb?hB?zY8 z!*1o{uKy!IsNLuPiKiZNgx4obhE$oN{5)@NMqBC@y~JZ3SQx}5%+(KaQli8a`b>mA z7*bCvkH`f8&ACst-&n}x-S-R5Xe$p0;<X~5NI)f8(GK4onamqb$ULsSvCd};6K~jH^Z&+f)tnY2F8K=bKh-i3ENL0 zXVsQ_9|nC{y;Ca=BTRG|7f}%+&yp*6!4&R|vEc0;J&Nor=JMRj-(-Eq^oI%H+I&cO z^FkY#JiU&lhmg_`A4Y5r_o4n$P5TbRw`7{*vYF=n#Ki;Vf(2SH)Qqg&jx^JBpQ0#j zd}(Msbrgf2Y+tj1Yf&cjk@Q}VxKBEbbzpih{mrgKAMULH|6QtqMN8g9VizEm2*p+T zI~Ox(VcAFDwj$xt0iB^4`$a=u&$mX;hDQKG8U8dDf2e)iw+*v2_VU7KhGP~gD_9H~ z^dLW0QO@g$(`^tLwA4EGX(l@Q^@y>bBCd3t(y0fk`5<^n>e3&YFUEdgwUC=4*_@`{ zXg-C4M%$zq%L1OQkJSl`iRDpV3!p-zuJkaXq~V|;6X9BK>c%4om!&9UB?lKyuCpaeRSPsIKhUg687AtBw?h@@?NGp zzFLd-;qJ+YKI9D#(p3gS^7ggklbKT4S?P5e1=jTdC$_e;?}VinJ@JQY#UU1O8xrpj{8SrG7}){;7pv1=(LX7|px(5T z?jL77ORy(n4*xd`;97H4hQ0w8CueV~_Nva@YuPnya3vllm8Eah1~>Pn()1n|cE0;OV?Bt1va;ZYiT;sDPF)85 zTCT;7`t$C^FkS&?_7i){{vy0Y>{c2kc>Nt)OsH$7@gKUFo6SnfOP*X;hO ziJF}h1WmD^*&n6*NQ%GNF(m>r`JGq)U)bUhe&cvb8bM~Z>-Tc zxx8ZT216h#Wb?4M4-rgAj{7rze0vW^_Ow6)B8RCNSttu-`o2+=Sihl`uTxK{9uE@#O*1bt2$o{YcA;us?dB@A$Uvlvhoba-L8L;^*HW%{8pu+qk&Y!_eOF_*(p8q0&N_rG+lQTELrA0N*MTGUT&!cvn&I61ZU92`%gpu zgL(hpe|@vsTi2Q1venq06QW1VA=%RcWv~_75{;Pgjlc&3|qk6`&T+bze`g!%hi$5!hYV6af z8z7Qn)q(aE$AT?FAmhcyxaHTfwpWB7SLeW4yP2k(K5VHTN_T8^yU?LA?&Y(t!yz8G zkSD+lf7E-JNoDmu)(GiDrXRRGSljFD;BR!L0sf1-W+?|1M>78T=sT#TTOyX9*#yp% zp*1nF$CtIs_mw-W&KavJL9Y0ntFyY#j#3cN8!)oHz7ylkY14d22|={8KvE5T1*KHB z$PBt#GM~)VDu2r0q^F(X^uOio`9_PnOYA?=_w8CWY)uwgA9C9;c`Wa;sIz1>2M}HC zO3+tHu57LtW&A{+#8b%kqig&9rWyUg$L`-GlzD|=o7S~T#L5q9C;S!+8ki=CCzI|8>pT zqEsEfh2_Wk7Q{L77j|G*eWwjBy_WdmCcV4jT1N9X`duKKDN}yS?l(y=%^mUAueWhp z``JWAL5A^Mvk871uq(D?=;vcR;W*Zk-2DJ-!DvczO$qE zahzu^{SZA4THh`)!~L$Ir{Eg@R)D7(>6NoSX9mDI)t$zv+HQYQbRtcbWGLxgy9L2Q zve){*o=86_ql0vBv5Lu4=YPIhWZ9MZT8j`d51GVRM37>?Fe+E=XUf$4odjjgm)ymg zX3V{Oi1oQI8!Yg<-%gZDj100n%6+71Bi~y*OMcSKOuSFJF(kIisIFV)aW1Qlug+X{ z%GTKpe|!KvrzG^`(GC!NSKUk;fA7y|^0p-_jTO-=b=mr^npWT8cvEjn{|gA4|Ig)3OOftb(mfcRuCj7Ig+5v^vn*!he9$c$tD*R?PO#o)} zRkYR1CjN zaG;5@aAIl$H}Pbq8Z7z7&cL3V)^FI_qqlu9i8LfB(B;fkvyu>$N^9@few&!;B$gWM zEknC{5>Z+a#iZi-;;m4o$l8bUu}Z_m<51gjNl#X7$;S1IEJ#+qh3E#L*Pnd?y(phH z?z;A=@9D2DNd>;xBc;D|y`nHEm76*V$%T42@-sva)BytWixk|kA+?B!Z?%kJ(Q`pZ zgI1RI8-vU{H4<#3GNLcyaVDy_}P`&oOIn#Ep`XdhC( zxucd9AKB%mQ6Q=;_Aj>=uc4F(=ev`M@78{5u}U`OI~LumxN44XT~!c@obzu!#?Iy8 zEdb;(2~H`59Kn6Fau$pRl>SKMZvmzp~uck9JZk1pTiB9;K zrjczx>`ax9Vg19Ql9RnOq>m2wn)a&PY>H2~{E!=ed41C)!TZfR4uuLqyPd?+ z?b4gq47Qe>EGTl4Y?Rg-#4WxOdf{_ec1KHmS_1cWn=r;p|f7K--d5mx7Ra>9On0IxFT{%3~ zb&o!Fi1}Tg(ms8)>awli;Y!2Yr**h67>Mpk!^a0dbG;Bz{iK`SO0wkusWvzKE9A@FKWOpIQ$dBJP=zI()B}P_`M3OaE)s#D80LM|vxI?AG)@d)uJ5 z$NLe8{ZyW~Ag^rH&MsDd3J!4o&=1FaXp%e zKA*(lw&avi*pT5$bKL>UM5<00lIFsNuAs$x@Rrz@(sFH1>gdL7DQrXy5G$8_wq3ZA zZj=EIP`jgP+Fu#S{ZuUMT7QRJZ@LS@Ho#v%CO~l^_pq9x5e;&lzGO1Hba4=&WBnLrdiW^rU#;qPP~0s95H(LlAI7yk0bNVuB06fgC8Tst@xtMj$M_96+oUqar5+TSv9I6U(#m8@~bRIsmm&|^LPR>xw-a&)vL=`^~=h9#)-%wh5%;V4tr?Ee_PhcNLc zrvAJ2<5QRad|b(qT8UHfCE^q79uOCzX@AE8s+yq)z;y?6P^QMX?CbyfZO557Uc4jQ6yIs2LO$?_XBcEUZykB?RSOFL#Vz#G8g*x;*TF} z;8f{*xmulri1s>vr3SSbeZvb&`#an`aH{=1kWF85_c?S%+)JtU>g1$6XUeagqI^vVaSrmP@&+0K=m*eTOgAT}X3i zSqS0>M;U`c6PESyJI+BK!xn}LqYlzr+Mgs#Q)t#x9Vsm;gS7B3Az%*tWt431+c!q= z7d~7UJ0q*z4sDonOyWuI!%;*t`_{FMnOj1)311VM%()A2D}bPS2*_o>pmfgwtV8*2 zSp`8~scjNN;gGO7KEpKI8*~WvJ8;L&wgHqbGF?~VC*CVNmg;pB;frC8!CRl5O}jgV zAm^-~h|^t902voILo&}xd96O2^+(IZIQbSTK%4!+Vbg!n#dFV1!n_`x{cq0aQ#$=h zMbl_jie=hH96Cl7XYF>R#~DOX@)=STCt=lzK#V_G6gMyM%ER_2Og~eb3aoNXzITmb zSpqO&8~ezoGL-&c+e>w_am^q-{j1LJE;Q=NkA7+!&8u}a!t)sqyT?TBUlBJGHR7*iqB4lRcaEFttN-S{6di_rfBRlJPWQ%mI;Zxpc3 zhkZ>)hVTIzZa@p0Hr1^h_An~(Jq$n)C(^CIC@0pcWksjYRDo_TU3ob6?tOzmsmRp+O;R_tAp;j+U^apuKVt41#HeE2<-eC#YtL8JhU2%y?SKmheuxSho#`( z_PWmRPTrz|p=`W%V4LY#VD>$@FfJtPNOKo?WqneAiV$3x-?H5)oetr1t;en-63o@6 z_r!6-V7LlQy_OHBaY3~I62}sU911Rzx<5xM9h$cE6b=n>;BjQt4oy%e%u->RS(t?} zY}Hom0)~Q9>;$u#Fe1zAys?e=dNC0uL{IPq%4QzFaf-aACg@ZNgnF0W7w`TWjLymco2n`uL? zld702i`|q)_%G}pfqLia{q-QTHt&kHD(F8^?B6?*{byA7(<|KE{Kq+?Mm!IBr~PS$ z<_EU9v9$vN<~8Q@RBzG}=l-Z4I(RLG-8?H>L1z_1g@w*jO#4@tY<&RcT15cz2_ImvoA=%F~?;EfQ$vEXfS zkCt$>#ZfJVbSs{>pJJTalpPK72d@7;@2I%%_Z?}DeIR+oJHVS(cFi`pRl^(c*&UhC ze9!v(C%vSIfql4U616!uip$M*L(Arvx=n+7OxS`gd6NWLwnWy)!PUbiABlv_dJ!+o zpXH{X<&Iv_Xi!+g!>#*>ZnM#m1Osi6*NQx4=g^Tdgb^TnbJKwQW#vQ~1t$l_c}9*VU%>%7uAJD1ScM|Hg#P zkn5*P6}@m*uB>)Gb3UU;i+M%p2?en_{^&VK0?=xw~d zg&yXO#SGD(S_jD{Or$a-S^HEq@0csyPMIw@^24-g&VE?YCM}d}vD>J?llrI`U9(GO z(gqJE@I4k{-s`h$a&%07hn)bn2xq}3>x70X53j@zhB&ZAT2WTo+P5BDIFMX?5p+k! zt=~g7l~C;tqk&p_RN~8<^sw8%>E0td5MrY=qs9FSbuDRl3YDkB9N`Y1;M04;cOQRs zobGjaU!N?8{}|@NAR84*qYK$yOpPwuyWg5_zz2)nVnM)ov!fj^P_t=Q^k@>$dxji> zTDR97rY{B63f!vnL?`l{FbTrXD&0plEoVIcr?sx6(FUMHea|Y#PyZ!ktOQ8YwQTvB zqr|#Y^MIkuETY2DMxs{w)yx^J>ltkYy9YkIGf= zPDD=p3ptfi-2ZH=ChoJ)4HZ<)#Y(ZL-^S%g7pO2*&+kN0i3m>^lr8M?mJ&&1i*kGS zjWG>PC7Ts$kee8Ok&{JxnJ1yMNy*8)c&J zHbP`%(pQd}K{g6ND`FQPN5j>tk){6o{u3KP9UK+CW)4|;&@1QQ;*7$uaWbmoW5Y&! zV|c=4yRFDzQDE$`d&}*h&{zi7NMgMTCCBbCL`H(C}a-v0YIZ+{@6LKXji0Y*B3p@L7!-#Dr<3)Ha%}=*@Nfr3JON>^0S!m4ZZItsNXl@W(!P z_MT|)a&|(N^-*z4_m$tlkwrreloEJU`KMb!q-QFp#haZg5For@Z{U}v4-^v+d4P(E z^IzST7KVJtBy+#Ym0hc7YzLCD*!bJ0$d8k&1SEpyzq3kTRqr+Hw;+TVOLhLo`gGm* zFVtuGTHz1XKR1+zCE@kPB;p;VUrxes7aPieNP0fGG$~Ou+j{m6L0HI+VZMW?{nyt9 zcZmZU8$#sU)tqpk&>;0g7tO|mbHyGFv3G3XNzEr)!$ieln&lFz1O-TKfxP(XPkj_TS?y*;f}&(2PI zm4c->&7b;`09w**j1~G7Em));4Y@R}rJDGwW9}VNEm}0HvCX*@8FDsUo~$#k(L5m% z_%Hd9b9p5t8Va{PU+2Tfmep|p!s0x!d z`&9afn*4`?g!B>sfW(ScDOm*gIMQbv5uCO;VUK6KbtCe5$UFx4b~D^8$m2&BrpmYSe~d$-&_O#2YsL^uO? zxXG3}>s7*_u2kp8yzPN!xBxQPKrS|szBt6Ri}b!88kf`R^$ga9y9dMBVqEGQ7or}3 ztyCLK@vBpG$Pf(Vq9W$w>fzMYw)R1>dS|_Yf4_uCaZ+_Q)F?xqUS-9BGqtk5p1y(+ zg7)Ib;Dk<4sOB#LrPhW8x<#Tgu7%+X%?T%-t7jn`A9k za5OOT{h!x8D*8FQvwb|tLa^bP4m=)v`=w1AwP^7CHYK6ltViu6lz%7N+lcVBd6 z-Yz@Yo?m-tn6b$fr*-%)OiwI*eI336OI{L5{JpQZ)T4CkYxb&ytu}C=iGj}orQ{%4 zv)LQ)h|x46a|XNeDF3MH-@px={}6LofMpkG2=_<}=W3Zfb-lT&5mQMkwz!0`%f`dk z4P}pdCIHsFMvib_nS(^u7z+1{e0Vm+?Db!Lk@=gSZ;*v^684qV=?_3Ik-gv=5pZg= zx6+D(IEKNh+sm;W_HUy%R8S^Iz6wQO%lwAxP@yjaxl)v>#HDr|sM}w1%&lU&eJ(y=WDj zO5p>1xjW-B!4qt`9~KA4faWoBwt4T?;`|L44+_{*i1u(~Ozc-%@7Upb44U;_>b?{3 z2hDC1E_fW#40prZ#Gt+r8E^jJ_3V6C`6g4yFK=wRB@w?3E@FG%^`DakP1L z-MuWX6eq?0^&uYs^?LISu`ox?qE$GK2frv?-tRfncd5vNk@3|Wdx;5Uq2+hBf8Z}L zSC#z;{F(=}NTH7KT0Il>OhQUHd`Fx;q^wSZ)!}t22)V*fGCo>DIVJ%`F3k|p3e??9 zv^Bg5ddMN9@O0p~cizK~@Xz>P`SvSXd(J=S6aV>N)`ow2E{!?bA}{1jI)gC9Z0=*z znj9Co!pjNYTAaJg!Zu2kwfOI`R2LUqLK>nX2|tKOBO5H!$ke6TYP+3OL?0J<-i5v6 zd^EiV7{qGY_9rT`u0%K!&hh^|-nv!v1;sKi;O{R~H>nqn-~cCzmHAWgK6g;s2YuW ztVfke<31Jz&6L#(o`GYq6T~}sST&b&fP(2LM_1wS?>u|dXumFq1o|#;kW?cU;QNE7OsUGr)f4dj~POVXa|5;8@MhFAL~MJMBm`Txh%R|dryF3s-Z?jB$X?u!O@ zcY-?v5ANl9$8cY%a(+g!|g5-K{TGxjrKFV%iyL6AY}!@EFJu>*u;IV!H?QRnk?( zGkO-2Sw9_y*PPI8NVN24BBH+>_&?Mesv0e7xlm<4P7Lg>K)Vh_aT9xc!z&JXf%tL{ zn3p_~>ff-C>W=h(J0EozSbcb@H#L7L&^*`tuG7c6qi~&2vK~` z^#7a&Z~o=^Yh&m5N+0@kp5FspW?QGY_7n1B1o3UZM>H*gh$}xF+-HIXzIEJCXn?Hm zvn6cE!Y#+yQ(gH9l#yk7vcBe)8k&XmA8Y5|#*n)8U83^#A_# zCH^eF8Lk$WhE)3%z#yR5sW{LMNOe{qy*Y0vV6o!Q^)-nrxO({e}3 zY$u&N(D;h~(B+<@DL|jw*)rYx_a=-oe*_5}j2{IWg+X#v41(y_6S~UABhL=bn-nT- zTgLh4;pj?|!bx>fbV7d1w z-k;g{p8xlL-1G!duh_R_(_KYfzgMin$7vdjhC%`jIC#LRj&|SVb|oC;Idj7J{j}?q zs8kf}7ny@-ZDf$i&*r)e?KPrfWmy-^Dahlqg$e06yho3bz8p0&9F*exgZ!ZE2WuGO zp7Lo8o;tEr#p6)!M$8sSZy;%1TboK5O}1UeSGy#(<~*ZN)Lnibm;a*5tPRcb>(=)W zIqL6k%r>7eBl~~Bi3vnaUT~RV2-2LYuk~j)+L$6lt#Q_s?6Q7XY#E}Y*_SYb*dM;G zq>ra!zSA{McWkZd?{l|>qxe<2&Oy`nUm){PR_P;5frMJ9^I|tue4}Ga2g~A zPV3fHR;`4(-WOc(2z4SZ{%T|T=NUZ%{`(!!+VyHXQ%U4K*>@?iw>sN+$zFXq>I!?h zf!VZH(`n1UXugc9BS^2yG-)Ed7b!UiUnbu`=2WN zFT9k=J}Bg?^pl;Ne^xagO~$tm?rv(C{qS!uD!{~a?ZY7})F!=I&Vf1dPOfo+B?201 zfNl+ufkr)!Vlb$4L?j%=WHXmMowieIzf);+-Nu$|MPns%{#A5{TwWU{F|;Qj&#T0- zS#@-Ko#pt#>`z}^701BvbkYXPAL=GB#3zV?P|dN?*TH~Zj#Z!h=_wAoi@H@)J8%Af86`4wLrVi84%^Ik#KJe_V zG1p{BdK^G%OCkgfF_XV1(D0pG8IPaN;DQiIzCEe9*aLFvj-sI{(^v781pTjs>n>dE zXW;Yw5UT^*jvyN6))&jdOduu=Dt$)o<1zz)=FOZnMTUDP%o;*i#r=n0azLQuoa`aT zUD@OKgKaOU-%%2;cxl#yP^nBc;D%co0z(@CQ*D>%C$o*rTrP7SBt2iFC2?U_D|L%= z&Z@>0qnB+PMsF2$Z+z#v);T*XZi0jJ2rzn;ewhar9uG_FoUFo3SH-4_ogfpQv~Jxh zL()cziK%hAZ#efo!>|6n&2~TKN!*SXbsp@sp`=gRqqt~A_HIXrgDXt!_Y~?Tz@Y+d z!DAg8h3C9encc%}z8;Jly7HA=nB$;K=Ss+~Gc9HzREN4RUK|^d03wnslACt<8-$#* zG>Oq$ywd14C8(RypHv-~iU#06+_nQ1+tB)zEtWExQJ=olcg}X9>KtzJ>+t{iIMauU z+T=yD17mkFn_2hg6U}XBu|X7mdTU=z4XQUB87%SBNZCKQtNnj)r}vLRnP{UN%l`*? zuz3DwX|FVz0oi#n4r1y36~x~&&wBPwm-$V}8pk^F9t&MsVJ;`6K3R>eCFcCrrb&<^FyQ?F2&9rHMk}!Ta>^4k}(`ciKyt8 zU5jhB{H2^qF`*{9qX8`r41$v^xi%t9w=VTOU>32hn0oW2s|rl_op`2vcIFtH%?(fILk6}NSTfr%b$!dgNSR}@3KLW34 zxHKfWaOnS+zJOQ03`{udg{lX%8YK!$Hu-UWgL$1%BD zhL@FK$(^of$;}$0s6;|7V^%3ZNBKfqAF9u(FOS!Q>mP?o?EuN6^|ynD+wh9ivKpqw zr@K+P+9{OaAy8U?S1=yD=$zLxTRXFp%dCfP?5>}8c(Qcz2}ICdeHjwwLx=yx#Rup` zjsIU4fKLDaRDM@^^vVCJ{PdtY-E4OBMiP$|YGaJCUR&hFzgd6z`qPO%bc#I9lnc_h zq=p6k1i9OSPd75DB$`Ex%amoVh1=Rwm5q$$(-*Qex)>W@mR}ul+ai?8MOEdg z8){ZlHR$@bDG9CN^kDyP3JeaXT3$4`syn-?l9jTQ9gL30?k12qR%$(~A7s#`D9A!^ z_DX13mz&t}xkzKSSiMz3&{Mwj|p`)IAne{pd=>=sZA3PY*@&b8a{tE;PNL3*NeHDP?jWW;vRcyUBJkuS3xt)4;l5(Np z@5p&Bqmw}oFp=MBFcE-Wqo#x0x{U!2Q=|$38wm<*z@!GW`mtm9QJr^^Fhv#EbYk1G z5&FzhUQ5CPe-gy;iZBSaRKv1vP)=Ir%GvuV^{cS?5`}zLA=$}mI0^L04K!~EGJar% z-S_RE$EdquG4w83H)WI0WGF}qb%_oX2(3Cfapbv>wn|jo?L5wZLFVIyC%8-b+!Kw) z3N5tvyjAw66-})}!iZiU~b?0L{l$-49%PBq*uF&f@>&}KLtc!mQbGhG@` zy`T9Z9qMF9W=~k;^b$o6Eb5KhsI_>BhTYLonAgx+W9a9nhBDoTilS_D`;U{k(#nNm(TNVb)?`1=u!Vn&vny*5#skI?{AGoPmzJrEM`% zrXFxu2Cc1A!845`MQ)T^_eWrF!s6Mb2hN1H4M@})>-nSbW2L%7H`7S43>`6iLbwx7WtbpEVe&0IY3 zNXeBZQ#4@&j(?$-rLiW%yc-W2dj?iKmH+i)a9fa%?nTLlD^Sf>%|nZC_u@^QRB8&s z!+kmB*ZQ?eTBQXC7cr)P4R9I;n%6$YK?$l$Xos$y^8|1^d*At+mS(XJ*>D*WzpE>% zEL%Kg=q`G3ZFdGlZ=|Q8oqos}m;}RKs|1p2YX_}XHowxVC^?J1PcU@ssww)E`rcSP z5(0=$u8CG*A~K@-rc%t?fjiauyYeW=f2Ho2!-cjm|CBe>h{9+WU~DDzO)m2tR!2mm z`~Od5cfldqT^!oV21$@XkU>l-LUB&M^!dIfYt^(9(?vB#6z_|=G?wcAX3!rf2-0#_ z@v6Om{VqeJ|qv@{o;(06Dds7ObOv!ew)*z3>|*Gm%K&!&h- zt5S{OsnU0)pJYXP*3I&o@mP|G|{^gI}q;t(a<{oVZ zE;J~cMdCuSai&c0Z#2d8s+e<6E=~qC!?iS#3B>yHgz}cUzj^7vujRScBI4enWPy6(CHuFn1TKF719^kqyBT99#8p~)o;|7G-uqIJGTj3r9PWdI!TQMurI8jnA|2@rUtL*#ps&VlB{8`;m9mAY2s!U zMBKdfH{GmF+$|x+?gqB(m%9qkDlN$eHqNjfg+P;N5PBw}KIM|_LeKU*kCvq$pINbQ zyk7N_5Z$6_d*&K=p*o`4i@MA@9#n2{atO8yKyof3Qs3o;R2Um&k&$(43vOg4|9QXb zHbl1H(Tew;q|h^qq9t4W?q^ZV;s zH8{e8*%MN=CoOixq=oTn&?!PljHYQ_T!>P>M?-F!dYqzjjm0-+;Z$gRBrd)Pc zo)MyBznnch(Sf!W6{z;mwdg@ZHjc! zU@Zf=aNxW0dH18**FYse_}4EEg*^@RL~{+LC8@xwF;>LhC#PSx1_3OavRn9_MQ zBOm2U;TC5zo{hh5Jl9%&(SE= z3nH9^!Eu}{aX}bYe~8Kw(qER)UpC{REVtrIrW_xeC9tLm;!yt+K6<1~-7VS4v3NfJ zo-uDe`m{7auu=_r@=#SG!2x<3dx_$kqBi}b#trl|EJd6{pu^}p$8jn&`US;1hPK4W zlLmsSd@`z90mb1L@084iBn0{=ZsfYk+0+(w<$lZ5n94HaB;Jn-pL$zdhMxaCj{4|? z?{v(fwArN=E1h=-!k~R@%qTrVFVXB-%6K80ESL1h(_?|Mt>O2&hWkIE8h4{)4>wqM zeq_J2hA+8TXuBg>Z1td#cK4CXlm$5}qoJ$4%k#@0AyQcJaN8E;$H@dwRU|QU5&$jD z7yu)VEZ4p3Jm~V%;*uHahFv1Vmp~*{NJbbqcP>b9T8wRr%;fdGSA`_&Pz%rfh`eC3 z1wE2uh#KD#pH;V<7sS35s-66w@&^#CV&LEOU<({Kh_qZG_M;@O?#;|Z(uXwP}K{}NTT!F?ez3nMK6|v44N*y|sY=$T0z7QfxL{B+C zrzHrd@HNk%=!Qw2ypNlrXgud-O*V&f^T$Y%%S$W1$QJ>lArQfA8lcP@!U;BlRe}z? z`^znRbYL*21wYgMYC+0iKD+xl<1rhYH%gK-Y<5V)iT9>?u9; z?1K!IU0CI%A$>905`}o3D1c%b8gsVe!J^C7NZPYDPNnB7~n@pdmHgoRvW!l zApd{CazHfa5B|GhIcnLzB>s`c?Vxs$E6OA4bFLk7)X+y81Pyc-hiPFIVh)0`!rD*D z85OrgiJju>HEsx)wPm==v@$}P)PzV|!$7!7Tubaaqp+y_P>^G7SF9s?_@SmOUa4on zoc4K2v!y45?xzAdq({(aHI$rY%#lDkp?OZ{2UEk8BkvNlHQy08)iG%n0|9eaAv&UDr_WquryFS#<35k)6ma_4vstf<9-En26|0`By9v=PO5ZH37hJKz&ACCX zgl$kGCk#dQY$`l^oGb`vzcTIPUAEj{GhHVK7+V^meq|kT@8di2PnNnHWI|Y0)@TRs zR_0(La905{>*rtrLa5dHmSrg59{}^+$fRzbQn;}#;>gr8n8b#L5TS?WLyTavOKv-q9zvP^ z+N!qd($Cs+bSb~I`abX}Kf)oKzqr!xbpUNP9Muop9})a_jX~!&JEgJI^hDZ$Pmt?c zvSNQjwo6rVv2_AYU?jGr8fqlFdJc!D`zC$#N1g-<=AQJjZs650$+pU&mB2yk=m;Ut zgLLVX$f8yu{l*1;-q~yBB1P~C-my(3L}&mjksxCEn-unBDTZ2Slci)e59fZTjF6|5p($NoeY;|Z z@cF-OPDnQ{u|IIqds~Ew5Dy&>-A#=QO+w4vIZF-lJWLg8tW5CmU;zqI4m_$QXfc2e z1+u>F)pEiS*U}|oWZ>}u1KK=}c}a*=!gdX#l=VWKJEiAy2*?>@#OEjI87KdUL5@ky z&HhEBjW172;{QxV5PoeEKT(5cwk>hx5v0-F=!S!;hi?9UU!#tbM=lFSF3{4_8fuqe zq@G@nbed67OS3|J=AHF_mr!Yr`Tl;{&zGRvaaE92PyeV}V6Dj^mwP6W<5d4Gx8@Li zcp!=sq>ZgH_(?-|agr@+pkmP@DMRl7t!+QSQhi;^Z)4;hwLwM#uz}prgaRQS!`WM+ z;IBD@BmO=Ts~OcLZ3-qi?XUHKlN$lceo%qw4;afjMU|a>Z)h}f9hJI<@q$oDbfHpC>m95xR>Ak~NAS^C$xiVVz2gXd&{QNXdtTr9M)wo*-5s+D#^ zT(sudrTXO=qLg{N5c?pBAh)?w2-<8dj)%wXV8iil$HBxPQRLy!2+8~79inqyxW;aA zO6NPbm;(|v)$W&q;oReN9)*C#|oEMz>R7MBVJ|H3Xp2TGD2LFDAeZV&>K zdf^znKWshg-+pek#abXip-Pg^|6r`L`k3x~muq+sF;UtSC$d+X!c2I2D|pxu1CQ88 z8UFpQAFkN0>N~H~Ic=-dqV2ADTlaBRKxe&w~!nL20%?`E;uCvKcNh(5PAr_U7y7 zJ7%V%pXvaOZXJlfP_lOPNn9<5G*1EjfI<3^+kF=fzMb`YQYkWhAJmt2eL?07AhQ#;g*&~AiTSTF(4(4fT7O0YTXXt8Ig$vI!7RD= zm8}_L`PndRJzRL+VF);(8=bZ0k0Zn79*Y7t)OeIqEyufXyWWE5JbfP!Az*Azeot)V zTkv%J@%Q8ByS;7&oSw^V^tB(ezlCsNc;9986E>wPrA7Eq_OLa%fFwd!^sLc?6lot@ zRM(phFvu^DVR$YH4aBPkvT!_l!@X^NNiHbO^*SKx@tcu}-qwKTy&rEDy; zE&w(dnfl0muG+j&7X@sUjwF|-7sydalkIK2%A^p`{Z(woJd---GxTWG_Z=fuD;IQG z88x->yVQQtsy&r^yc)8qsODc>w|S7tiRNU5w8@@XdW(@S)B?qit)(3|My+L$?W>+z z$DPu)*N;A7jm0?XV-<1Bbw=`FwGhOdk}R-9s!_=*MUmNPg~GjTizUeYkr3?7xeZsQ z57Xm#=zxpAT9~rJLWR!81;imWK}k6XH#3Ic8$E1ZaeVHtJLeQ{U4_SUsx?eh!nD9< zTQj`zbVj`zgz}pJF}_q(wX??WRv_8jtc^J}0L4nFMu3#$VT{ z?aO*AXeOG)$giS_(uqnh`)33_>E+216B-JGSk#t_r4;y^eiD}FvSNReP$!C3Wj4ZP z`y@j=Mk(@asy`FmYDHG2ve|fatr#-$&`+{-E_;Vc`~9M?=JH$9sNQj*4`4jh;7INS z&+`k#T8uIEOCjnXl)8fR+;F1`9vG?PR)1!{`g13rNu5~aA;pXkn#8Gj{6|4c;87mv zvI8+*6WQ>Z1v^T7$d~eazY{ptO{ibZmXCiS*5P1lbt-iZrDXy!&zEE?CAn#@gU&9~ zXn&5}55+5^M#1+id9**p9fz+5-uFkBV~5u%wK{Gghn(1Ei*?iP0Gc|ib$!(THu$^~ z|Cpxl;-1R{|MI@gzy5yJqkEf0jj-l?JLgg_gq*?;ItjU)c=bleIZ20n|LlMnFo+Pu12sBsKA}Ku-Fr3b71{t9oMR4VvTJcJ$+FaN3-fj;%?=DnDN_P zj+0UNuj4?U*2^6klDreo-w&GB7M(HE{(tyaTqKU%QC`TiB05^m6{wbQ#|D*Lr{>h`j#1n z5K#>u<<0Nk`|OIf+7$ig+Q%?(K8Ck0LtbJ1KHtJrA{=c+#`(dt>pJ)n?4EZRCsAz8 z=j=-S{z$2{7u9goy_gXIATS&LYt{Dj~4opYk1n@~zrTdy)+p`L0^7^Yr( z+nUXj5US-!cYjQk;(4;q*sTqqtV)MWyRJo8SV>iJL^~t%0{8iluLlFo+k>| z(@S{kCEExuF%%5vqnNnwGV#CnYD#AJ2q_4~XIsgj-$AOJi7i~HLsWe7)1*S9eHM-%{I~t8 zNbildPlVlFq;sjFQ9(KhTX{bc)XS`!*A}XCZrxBWmN9C5Zt@jROkE9;zYI+2P}ROg z7Hc_R3>D##Z9XUFI9I`Pk5CqNklUe>_QiKxFwgwz^HgvX3jOxvuFe%YgR%PS9gK29$3J z%7488SSa+{zvuV!l`m8oy}|4_SuNNam^^-JYg%6E`|z;l=98H0UWZ+cbyROcn@Y^* zqc6XcEe9OnAr8__2+4H6uXmOp^?b*T&r=T zHh)adraZ2GZuni6(P`J7m@HP##afK#=9+T{ygBRNebQ*kYAMn{7i*I8trYtl8|PYbpHHJx2oo4-^6g-eAULydBv@utv-Q+LzGr0fYJ>gx}(da$Wfev zigZK2b_l%D@}e28t9G^k6aQ;*oDj#**Vnm9{cPfl8fD}ONAqQxrrAegZ-iECtt9Tf zHCLCpj%dS4K@$E523(TN!#G0)0fn1F@`(G922`;*!iAZ|^FR(H@=IvKCil-ir@bie z!c{C*Tc`?9TMp?2wCmM`GTYCwINbL1p9Md)oLzDlJ+9X7-_J#N0}iu%#)Aj` zG5Kb^5RVt$<)C-y@fw8T#Kf>$kKCgMrK3O=$IorEIM{*uG(shi#>5;|0N-^X66Y^m{v*!Q zk56>h3)>NU-|AA!Rq2pc!PqYlxRaV&>Ucln1u+9Cc+k0Mz5t!M;^s7AUxq+n?I-tHvY@?F|sArA7Q`}>j&KOf2I9<+&4_&bo_RTX0T zMS3#Xi1;(Mgd@RBS%0iAN6dQ^6Y_*h2Fd5c$~%(H|N8ugOI7IY=|@GFe|o9zxWy={ z4DowNrp2AY#7R^a)gCBdc<2$PrNLx#Jp=2EEQ5QipGMe-Z|EIvW9PFftjHs4IAi*`hn0Q#F?bu2^Oc9qN?Eip03%)L~(6L_XPm=BkmU`3CbttCQx_mow}Q zf!1icYFP&*SrOZQaoD#v0r(-^SB~ZjXP&qiY30gC6HLZeY9XjuwlE#za#c510&q|> zz1RQap6>oJphdW+-@gA-ExAIwc`kpeD%_W4i$x1%YN0DuHEhc6GAUJjLct~6xrUH$ zZO;*cfu4?riZ=yw$0@Y8AR)Gpk!DAd8U-ga zL3=E_9z-rK|DFs8uz;s0Tfg_3$DI|qgJ>Y%wh0)6tH1mNfdVEt$)c9)Cd*^h@Y7$N z8Me%<`SPpOQa2hnCP2>w8+q!9Y_+$BVz%Y>80!bh{(oWLLsr}OW;5RS*6*h-+OcdqQQNx z5GK0IhV9RPTtMW{z2T?FX10jcNpN7A>o*+z_FPqr-!*vlgV_yHU$cKthpRRRHzzx{ zgQ`8+TF8t}W)9T$0PC{Kb{!FkJ)B$(KL^i?YQ2qNiP&}$r7pCh9s7|q)J?S0$QpKo& z^$5S?d zt*}bcvnn8Zop&B9<5atP`c)oUD!dYIxG#-Twt%HfwdI3NbU{FIcVsBG6qnd+id=8B z-V!zh;BHQ)^>D0r?NsVuTQOhqkhK|sG z${!fT^8;^5<`YE3wAmoFVCSU!46?ZU5+Q(KNEx0fM|jU^8PPL*B*0~*rD9O2v)sfN z%(P$&vzY$1kCA6DAe+cRxid7;sJuM~c-2cHvVW}hd_rseRJpD@#;d6f)3Us-y0O~!&dvR*-0AD)e2SREJbB1?*Bj)Q!)9B#m4EJ401hw3ev zmWsEn_yFx;hEN$|reO8%Qs+!&oGBG1XY zC=n>NZi67ROU>$N)V3fa$`;IPwk%vC!+;P^AhenQczk=4Jl1?YFIVd3yY!5G{o20H zD!j(oI67iUll!SL_#zJx?2?CkUm4!?Vwq~t@`h=OCp84cZSuOoxk}(qkp16^P+tY= zDU-ds1x)+WckwR?v*H80;Cksy!E`v@<%z--_!>yi`t;=oAC{GJ(2M+fl7x+Ym^8=X z&?XK1E|b!0;bh0Uj0oSA4L{)JarJxK_)u0fi&v}0x+;F{+&(u_+SOYX*{@zI8o-e56yPR-(59A%KT7`~3jioX$!F~tz0-xr`< zYqFI#s3E@0dH&Y>B0(naCw+`E!0`-`RrJIA-9mBvr54QYQ2 zfxPcg_yM&V-FL|Ylfgcr7uzobyl`JG3L0A^bfHg;PwOh?I4g*{DCj%5+qR|Jf739I z$J#=eGBzI7CMMRmz?}}<)R`0Ktu3TXfQk+yW`v(c-F&F0(;NgDx@0*Shxh!<@hqLb zr__ifEij}u$#;+`%dLWp`^kn}=Q9X#FIIb5ipkK$r@n7W%zqpk5*(g%#gH-{oJSrc z)(Of}`O=^3q`~^(3el9_J=%QeezAA5Y*|{6Y7$;B% zn*Wl9`iV$p;Kn82sCEf@kOu9y7*#(Cr|noqjIN7X<((m1+3fnR7$Z+dg>!@V$e-)C z7D-X5$F_rlLvT~OB%m957@hK>C~8(%(&H0ZJ5mS+AC{jlaUgIJz8RWV=ot z<5`};NN>#A0;V8v!lTc$TEcwEjo2(?$|=pggvq8VzgkII%QCl77}$YxejaWqBDeDsS&a5DRqW@-g1*| zdSDlr@rr=W`Xw3q#hpI2Ts%t@_m<8|Ty_-FX-w&a-1mJf{rKFsDu2doX&0LGEG1s( zBKuuUi%5A7Y8W_q?87_rDR~9HjUQXE$%iJo3SwBhL(p(z>114*tBt3{6=~YUvqse> zTP64RMXDXUdC7ya*~;d|GT&o~2q)A(g79DPXTwzo5dN#&{xfst7y^*cYPbnWgrP&P z61UjKE4u^&n^R4C$EOX$P#)B6eMofV2SOrfM)~&Q8e7EUtpQGRV zNzFf4s%TSMF}ic_czC8AMm&b{g3?C;VJ%kV(mMJ8?@E%GwwO4P;B0nuZumpj(2Sr) zapgthv&Z)e9OGuF_SkhjHq5)+*5g7R^^}X`)%Id>aWPpy@HFmQ(>uDk4kDUX>S?a>aAR3M72ov55h}LPzN9jkSCnbv4#?)QG4|g zp)(0|;8(&$^zxjn%#3K#XUyHOmCt*Qtc0l|A9Gu1p63K&01mhkm#%&)_(0MbXaK#5 zB?grss$-cc3(D0W1E|&Jce$Y={ht|9>J5JcrSCL(M&LRdQ=jx*K%&^#hQSUH@~B*p z^|U)D;qq?97|2$)NeyWfe$b#2rhY%o<}0AK&QnfzAdOj{2086N4}1HAvMwuOqFrZ> zKS_Hvhn35Z7_QixHRCy+VlE6(m!xy7_S>`>C(7m<4(3gAaTAF|NP{D?v{}PtLLm9M zf>unmu3L_)H{|YCTEm&GR2UrgQuMd^H|NQh&Xw($^`0~c0F5EAZT(krWIga-W!4IK zUapZ&s+!JpajadR+7} z6>%=!w&zsuTxB+;x>JZo$aC0C$MX#skox^BO#2i+PCI|r35(yvN%}8u$(u4QzANgAd06kR7q=wMy5S5>vC9fEIOu4HCG5YMRe=uzGQ;!aGYIBC zy!FCA-dYWp+(EbHh(>xZ&r_&dNfL1dyN9q4PAQq%^5X0-~f)JxC}dH8D0WvF<64f zne~Xsdj|VNwX@W&Zq43RZQw^{y7uIY^sLB%xj@=2+(9UlMF5d3?XAngy*N)C;U_Q5 zr(A_#LTHSLKc{f{r91;kuO?MQ;g)*dQY)BB@AIrjXvPvm!?S6+g$d_GL8`*c>Rxbe z=v{~4@`z9p{Fh6np5mhs3E>gfbfH$oDsCfkUr~;ufYp#6GLC@~LzKYj=ifp>^Lt12 z*20MC^_X;Zq-eg0ualNZ=BNl5b+Ac@O8G|7`Q-%HivgPBW2Jx4sw5wn%bw;56`9|n ze3sc!qXsd)94MYh%FTkqWLrB{OQ(Xz7fN{z*U+`lFVDf;?7ok}oY$QIS-flJ7c{=M z3XVpIUTbF^0zaFfoV2g+xJ*qvxOT{RMeg;G?S0?eI}P>jrF>qo8g8m{Q7k77$}Wh8 zL|L3B{*I4eQ8h^&po5j`oI9`s4wZd(98PX@{vp0=KKZcK@;uJ?q9tG!H4V2_bi;6XjVCBF4B)!Sewpe_2pQcGhZHCP`peNCo`Dl zw13=s=SsS~nf~n8G%Y_iidz~zOONVoY@niKDlY|PY3|XDh9+K9a4-vMU0#9B-IUVBi75zPlkM1;Snni z&n^3NW27vTrnI!qY3Qkea((JY7Fy3kv|UIerxC({jroT-`K1#)I@^c^boEODsOH7k z-uH{#toK3I!H`Vzu>BAFP`z%${$YzdJnl#Yo~?PHVdI!5Y};AsEu+Q?)kFWV5nA34 zMcgPck_UiiX)V`0AXO1B5KKU2L*&N`=~y2e@+_UX;I~eQ5|oBd771+~o{%IKiIL5C zY{ZzpgEm;9iSk2F1qQZ|3m;83o*B26^uUIioCE^F<8NA-U$RBKpOja3C8s6SS_kYR zJWd2b+(N9(vO#&t^S9mEvYa#p&|Uak5(N%C?Fw@Z^<%d0t5Dhj2;GdST}|z*y4ft~ou9ITTGbm8*wSoh9%OE6Hy4 zu3QtheDh`|ykbi(6QaR4Moal6`^~f=n3eg)FL`tehr3McC z=6TW0l}atCU>(ZaIIg0bD^VX+|Kx{Wa)mRD;;#eaI; zOpqqd5}6}6f=O?+EeEu*5eD0fHDS@rNj&x0G+&|akQU0D3Ou;~A)?vhw5&1Ii-1UZ z=?yoVlW=vOqLhSX8ej8s_3K*49S)$kxqB1ebUYh1V(cMPg_0l9U%9B>h?pGH0j@YaWp-`ZWwW~9@i7n5wzUvJg#s$ki^_U+(z|48tzB{sLl4&!%A@YJgY zG%5>~YJ_;iph-1Ca$7LQa~ZsO(I%%F9uiK8vy#A4!=jxeGH+nV90V5}GZcHQ73Bb& z#dgQ)=H>5r>0APVi_gCySdfH`5f}k@U>zY z5Y|rw_-#$QRR3l!bh%9XXp9DP_h*`P#7`w;XO*|(85`vk8o%$XW#x)QN90cA*X5K0 zvi7UCHbb9S3ZY_*8+L&20D8_smyZ3!-7**{B47U;KUyVOLQj6FCv)K9o6HH4~s?NW}6gX>u)nh6{Q3v}v>V1{6Wt9T;1g{-4?^cg_9z zxY%dL@y8AExsX072?2|Ad4$%c=AdtNr58%7I4zvGv_};sf9j8o;W?^@coZlo=NWY4 z=WfKD3;GJLEEj_`>Ys}_yc6u~VkPuW2pFZ|UXb?NK&s)q3E;rR)9Ws2UqYaCY5WnT5!si0 zue5YHA+GRNzkgRJ0cWM{bXNV;8sh=$ArPCZjOgFEsyD5Bejh9cUQ8-~C=BVC$a8iF ze%t2>Z*P1r@Y3g`Azm)SwuU*N*KS4C(p-e;8i5ejaA>O{=+KeW#!&nrnjVkS7TVsQ zr_#AB5K&@90{5H$%jai}Y^NGo{-iDJaoB6PPDo5x#_$#ILwDl1bM`6>V~aJ#^Qb;$!(x*zOt3KH=uU2J5N z0@J29nTjBMy?em?!VEa8rNBCOt1-FgiqRY+ ztJU9eM&ej*M{W0c&0=27G66(QIIZ{UT-k=|K^MibWugMSi{BQ!ftcV)>BbZwpxLmMRj%8Y7*SUq?C3mC8Q zw3#qfrYJLgJB+Dkxp=bA-fKljV70yOD{wF^6)im|1?{o5R;A)P&O}qUalD^6nZ5Ku zvgfn>?}+TbjRLX{p@NENJJ~w_Ayl;I^WQj+R=u?zxm3VW$7{GzOoV?~#4kr% z<^g6VRy$Osaj(#N_^;OF<*$nRtYd{Y7Y1n6Bs7*AAwHrYCDFSl%2Yb+wL}$;8HcGm z7=E+I$uXJFXE)ZoYD!?XzOO&^>7ArquHSV*{Xa~7^IxW2*Y}wxYqD#y?arpAn#p!& zo^0E;ZQC{3_GH_(>+QOq=X&nq4EAcPXDq)u`JnYNyK7u+*@WE+$9 zk;V-mjWXqc0%P3LcAa1TyJ%ZDlLhfmw|V()u1!pUFy<_HcP`(yV24L2bbdZ5a)}s! zQ(cqxY&&%x`D-qWo=_Ybyz974VXc}6d2m+-GI_MINm1igDC)(zT+>d4%B+FMP5@5_=Jsr0yE@loIqOYc)+J| zWEX-bVSYY=|Mq%!B;Hplvoh{5H&`;JrSM3^rIJ9Jv|Ppk|8X~m;VdyNxaRQ)LQG1l zm(n{kSjn3-ltrJ?<)RWjC@M;Vc;6Yl-Xa}<;D`17COHXHUM&~D%}r1REckQR$xQlw z;%#ILiY$)TSY$N1zyK06dk)Z|YeBEef+CyNQRi0>pd|so;|LdsxR3Nks-nJFO@e+P ze}i_W9kj2yV<~#s^!C(I+%FXIH8WQBi{)1ICC}qDof^DL)J#}#3ZO1F;dbB;3dM@ zMf<{g&VBx!8j~>mr#peV0FX&tBq1aWjC=akfim?Z^#(Of$MKbC>936;Qs*sDTn~wV z^+RkX;|*{?NDlHd`WIKZ2?KP>iv6Q|`R99-M4hU7QbnRRTEM3TGZv>4&;7=w3ql|t zjt9VP2C*_QP9O|m(38ubl{c^{f#ypIxlfGB1iop5guMe^VhlD`3myIR2cLxEp#;LV ze?+8`4I0EA_)0k+0aC7^hX`g+&F_{N+0hu9iz)E5(ZyIhYFdyC8= zSFs7R)uT2@SE(fb-RXcN(B2}cXJxeLBRA){=k7fnxy~DpGVH~;8}0E7_-S@*a8)f+ zd9&rKd}#i5EjJ3eFD<~~z5Ae3djgFTuEp6WDCBQUX+6e!tO#wqWI_l_A*(S)JxOa7 z6-$;Gha&+2;cW-L%fShWX)FfvwSYccB>z45_xq&8&!N$zj4p2erg3l3aE!hvz8HE< zal9mdvA0f~MF85PKcC@MBAE}fSbQ0tWDZU>iXbJi{p7@tK@>o^s_nProe=CqOvr*h zKa%b$^L zwX_Tab!#z6k(b{q)LvThc^=( z7}Zi~0%1wGHG`C|0CRXk^&bCTXdB&HZ*KSQaD8MAhc8|Le1*n6Qmvm_AACsR87bvz z@=e*&!7D=SNZm9!6Bz43hYdA+XLDc1ckZT&x_+vTUrGP&Q+ z?stq&Na^x;{X2C>K|)RI`e27~S_iZn*U2{Ro-t~rcJRvGCMvLXTOynZM8VDbr@$q7Lx z0+q&@O!^8_YW(~22$C>~XIsM@eyVpxQI?wXo!2T=~wlg9fq zJBE(0fsFDi4N3YM?nALXLB;hlC;dOKso*QRk%@nMPrxZUwmSD|3j{E{hF%48j9Xm6 z&5Y$cV&4Gq`7BE@xzud*e)8eU6MCVjgm{&){8GRe-)VW|UViS8Ad*@MeL+K5T`6=z;r`+>CGgQ$}|Md?c}+D0(?(#l|l%VEja0ue17 z>RD&ug*~d990D)5v#+-?>#x#VZh^@aT%Y;HA#Jdn>$9Z?Cni{1%aic5t$pHXl*<;B zPnh(2;ab;{3`e~>(F3Fat24{^lxTm5oL9-EY=8W0Vpi^}fO%%kf`Hbc;ANo4^p*Nh) z-0pyPX_4pD0NB6A7mEyr@H`=0AE_py!Q#L!a5l51L0KZ!NM(U8r`Ya#^LH2kBLuX} zQ*!=T+kuQKmHr#hqKE^9OB{`>uSoQ8quBJ(TW3>$XS2ic`0p4ipz+TbyR^-j{~xUQ z=F95aW)3DK&-;8LTm#P`1Uh_shO*`~Zr1mL)lq|tfG|w#8%wt7ab*|E->z1Sqgkdt zzOq%ahK!eS`?aciN~__4S(owVdm=R7azYG9((8G!Mn6GZGat)y=>vJGIkoBiTDBfu6)A`H5tGD|^E@%ZKM8V`eeU;|Qj!A1(0M~oYs(Wq8bYwMAOpwvyd}8)P zv;v7k{)^!`fqQ6<_B-)q_hbh8s3EoR1?V`>+aIpu1YYgNk&W(CO@nLcDvid1b~ltR zY@5^wF2glqMyya5;(XYg4AA+B(s>pVNoL7S+IC}iyeh=!FxhXT>oV;8=eyy)$8y+e zblfRe_%E_axUW%8#SPLL%RG9N`I^SpT$Z6S5>HOvM#kas9wwvgf9(Szw=Ri zAGca&ReGcgQ_wWYb5{3M($F6fD#{Dhi8!fY#5&-51L@kW+AFFD7tg02?9-1TP_BJd2$LM@ z7a&QX6{wMyF>$u_F%zFXL%vf#8ZiNujZch5zVomX)pd;JS00r%##TJDTnKlXzx44i z_ZWi=zU_BZfukAzxPq1a>5VF;6VL}(jNuX$Td=`k`r=&q*giUO6;bK(kf?W#MU0(a z2lvh6>a{`rkQeiDD_@f;&}k3H80BzkIkq4ypjCct^!JI9umkHb%#xA?On8{M5s&&8 zwQHtRC8XHxk!j(J+?@byE^%OkLZkrd$yu}0lnaQ|AL&r&=cn&vyTX@^i9s`-)sQH! z)AW!BiXOlVnVS=mnvb0)D&4Cg##l3H2Nm<{=M+aT<)i&kN9c^sk_)1Ozmjp;P3&?fNcx@rvU(C+K_Vasvvw(&_9?!6^Cw z8fwsw$eKcu^YDNV3B49!RphrH0eaYp<>v3u@SxZG$e%V94!@I)#?S8By66WB+ufvf zE}BPH%>cG-u&Q>W56BOeOUmB-6I+e+xc;=-Gcc2QV0QJ>Ks2@@5zw4@JI|=I*0}v* zsYb7u)yB$e_wDiRyzWl%zxMY}NG|6eeLO6bV==)$D9Jq;ij~P69CM=$l@W%lN_^Y( zjj1V4lxDN0s$sSN2nPgT>}cC`QYq3gmE;q|bFHm^RDbqR;|_+|f!GW+?psMh(i~x( zQ#f=T!XjHBRorBU8vB`agR4FU66!$Y5}$j%AUnp197xf=40uA-EuG|$Tbx+#jXu2K z&E4QO2e18n45Qs$1ZeT1dER=B-c%r+=t5rS0k2{x+ZX18mZ7T2kNRC(?E@+vSsKm@ zu=xWuzRDy3>T!sA*a^`Z*5V0KBC3)edbZ9~|0-~lk~7$S{jgi7pXpjTjf#~cV;Rh5DJQRS#O@r827V;T+Bf?P`4 zWvc=Q$D&+3!<9|JektSgL#EF_EjFy1C0&%@J5YXAA+nmoB$-rjkZ#>|e(FtCElYB9 zG>zqB$Ym;wG_=C;mP-0A)u8@0b$6*!WbB(^!Y&3aI_bV~M1IRTYIjgaIhG4`1X(2- z#d}HJuVLURLlu6ki}^R=>B|5&G4MwS>!7GDlTT{M70+0Q^E_7S-N0_VFI)*Fw=@1K zqIJnej^OF=tsG2yvo)F~G1hiNn9G6d+qp`dFpU1*McN}$PSvdfO6pQ7eU!k8bjvJ8&1#|r>LO|IW~_DYx8PXwde_@&9fGqQQO6LIVs&UfgvUi`S8Gu2 zG@aQcp?~7wA_fCxGd|mDr^-~^q%P510zqwNEr&^Z| z^&~$+c8DF#t0>GaIoro@9+LjqSD`Y_FKDDv!Mn!seJm;e z^q9OtYzR$|LI7z6QE#eV(bNkv^0C>aslN3{v;CQByJ$@cAFI&HhEC31<9q+{PH2+Q zC4c@EoHxVsSLF8v2|%(&roM#Nscx%C2zghk6_MUCb4VAqwVio^-yhp)?px9w0=HaP z?A`TyH^_}?H*FMTKd25MgRobYMHE3 zA33eXB53p%(OA=N&4XnhIe0wp_APcV7pftI+~5>orWNkhiCoxWD^>ud>ZZYJ5__l zaerZ&r_@`rtljbKkMFxIT3&wbVGCKoV5(-5K%^UsH27y&{vn%tj7(dM?W9t6c4|S7 zx8__II0Tja`V5?lTvy;BQU7UPb^*7vtxS;=rRb zL~kJFI&RTnNK<6&yoMHMkBXH3x!J^0rhr~k-Y>_64ytp{VgCVlN>9+dpq}QU)IrHe zUK8}rXnvYmJ5&lM<=H3L3{rD0O#5x%wnwFd!{aTf zqwEzp6-E5^2vn0PqNJQTsp>2xIyLjNN1mLxBi?$me@l&|4QcFfw0J%TK2G*GWxmgR zoOfnP%Q&D2cjlgZ++N+PcwJW&5q+c)NqSxR5lI5yXMi{{gs6`_q@U(^wdm?_RZx&+ zOmLyylg{q+-A7O|YuJp0htbsxs~;jeA0JhUGroUwZ|&+a5~-ETl8J$AH!% zXM|zuXQ`!b-U_wcO?V@lD8_RiM*=** z#DKREhl0n`(YiLn^HvSk8-q(zKQtRH5+_)U+&14}#KyUpM9YBp={=+;gY_$ecVLV0 zN)-l|Xwwqu28bEznG0iw(QXrGoR`@~RoQw=jfTy^RwH&nyjp&GVc)iv_ zzP;$B^&x`XrK~523G8dOO|xi_rk-sl?L<=6H7VwU=J!Yq*3a?Wd-fy`%SwE%F~rpE zvK{$;oZR}j2F2D&x`TJY3L?oObtUItO|`=eaac&dT{QT7a}*5ijsGSMU>CcnGr4V^RUXMT`0r$E;0{FXXS!Fqkf4y@EiMAQX`wFXv{sz2V_K`kQUF7yT zF|{5vE{j7aw_sd0x?Ga`s4yOziA~b~pamnhxpmJwn6j`W#m^rz%i#povZ#+qdMJY+Qt=FwBc5y7THdstD$y`1F@78rlDFbpPS$SpF&7 zaUmymWq0G+Pp!~Po?D#nbw|&4W;4I*lswnG@sVvkuljkPNjlOdAcwAiixYRi7d(On zm&eVVo0*xJqy2Hb8HsKFjnxdx)jtASSP?|KRbDq(MO7XzNrfA)gCA%1G)xy&@4Hb& zA1_&Nbw?X-!<{ac`T{)fBBFw2BFZ?;e_&IJW3BLaL?;5|C%6sin- zO8L~^sed4SbqaesR-s$(o3n2cLecohd9X09bnS%HyPFVC6CsX~!!rk=l<3548pR9< zapP&}k{GF9#pI24f$PA5TPjlD24^eo$rHz_Y<1(&X)XEhi7hiT4cbU~b2nmueWOMN zR?$r>wESRe$y0S~lo1-~r!xK+?8T%g-@hZ250IG>OA}Z$p~$8t_75kwcdXM) zhz3^2j9EB%{aEBcKEj%%gI&*{AkB`2EAbWovhw?ubJ}vHc<%0U;tl^ zL6FRyY(0WJyrfWpFn=9Hnko1QBpigK5>+2YvAa)xpGkrCa)wE{|5d51R{yndukutwsgLkv-QobL)M^AiyAB(nz5q!aGQo01rM?Ux_>gh&v2@G$ zF{z#5Xyi(qhJF7!i7vSMO%Q44N5a9hTF7oM>U2VEAkJZOpV>g}Bc9B4>=OI#uU}E( z4<-ZU4|{suvLnCqmoIf%jfeH9JJdOeJUv?Oo-+cDZAtHjEf}aG= zqdDs1`Nl`a(OWB#bm#lahd~R8?3o|3z;)DGlD2ENn2Joj!UWLsdSPa-%h;BEkbJl>ld?Mjb?mXHv61n9^l=N6X|h^N z_bex?{&@L#p1;iloAqb}Blw$z4Hj9yK9`;~pBi;nm)RdiesbU;`KZcP14&k+T59MG zTiD#UJs~xEzdib@%1RM6jg?y&8YQCW!d6$@?IowUu*#EU9JZ@vQHkl*IGr?+Q=MQz zjxPb6v+lSM?5|?R1#TwmE0iQ?(G^dr)sAXPHEiB;1eXsI7o@YuYrOp;Dw9Ldvi1Y@ z=_M7kCR#uTy}mL;s(??x`Xd@aE$*2MX62n_kYhiDDmTl*VAekOVgJ^*Nn@y=NF@R8 z3qW&`5|r1%LNl;$96|WcFU5Z#sBwKJ|1o()@9KjGI}RQ!LK0Pzjc($3#vbz5fJLKc z@8*@ku7jPHj9Y1AR1d(Djup92`sJVzuhBlpsSq%8AoK1W2h+3;-Giexo*tq)6B{W* zBYpRRi;vTSIC6w3>T~)=Ku&nA^`%$WuB=<-m@dwjQ2dYLg-faq#klM)gQ<5FZw^y;C8N zOu*>}-TfW=qUHd4sFp#d?Pf{sOBt_bVwL8} z5E!Z7!M0p^EEdxQtk&9?8`9oPA3ni*Q-pww3s)HS2CD3C{eg1`KP-)Goxzfq%#z3c zO75dJVj5hM@e78NZb$BPaOmc#i+7rd?x8i(xbQf=O3#aHw;rorrMRF0mf-Cis9u?6 zE%~sofz;P?w{IJdTepnwO;~I}z6mcVU9BB@$a-`Mu3n?x#@IW+zxfW=8nhpiIqXWw zWKpTWX_qEyWt0UK#5d*iCg!ob8~6UT$qxMB-8|V_4g+SKcfOU)RJ;*6;^%SwmsEce z+uR-1e!u>>ekvot%?kSBe&^Q7@wV*sq%Gz3()7`NJF?)V`~3Lsca(>GA$4GscGQn` zE@|ZY=IH(HWv1Qjp$Hi$pC-te$@tJ6L?m_5?&S3Rv%YD=)2QX8JLuC#dtr8v z?l=eACVakyGdU2FWoSlV^L8}(?)p3|vw>ReR7m7n^TP1XnWU{UbGxk4!SXh6@wR@O z(RtH;ROR)mGV|i~wlLYt6fWQihPo+&LbNs`{WX*OU@ivpaiqO#y6TN;LL2TFa zmmoMxA&!4`hT)gm_=2EX6@*_-I0VK3|{R7*-zZN+!%OE%xHyh6bypn{%9EIH5VQA)zQL1HHq{PCU_ zFf$vdg5Tc?$Ey7zgBI&nWO>gihHLX=*gCZoQ-3yQ{q7CRZjx!}o{?8M3axlj-NMeY zDCkb@N#x)Dv7?mZ946YXbxOnLjl(#p)4@ErS_yJKCpE@#>E~0Vb4fD;}?Hl;B!1#vt6b(ik5Zo?y>ufJgoFK%vqTDUL$Uj#NbUX zSn=4>bCFDPcZcydY$M0nRWqgHoH#2Y&Y5vV(wgAQc`KS#D#G_(#<6G=WALTL!xwpD z47n}zLf)_Zv`D3CMs}rO89{L-)*IU1ngT!mAiNiA_hNawwtBm_KbTu6blPYy%djKrv*h$K1v5W>;S9n7L(rQwtrP!Hiw#mU44<&A<8Cr5(R!C;&V3! zT)z7`#O|5@n*{*V7)19~NT;dT2mfgDHWlIuOdum4bB}7OCKHKk3uKDDJ8))E0~p_nu*CP zOfO?h!)05>MJ|XvI|Tck0|VTY1}gGQX}x({X7#Vkgm&(ssiXj<8wu*GF?Op_)4Nk0 zdkHv;z?af2dd=3fvLw5U)|Gt(paWGgkHwS9n;KL!>hXyEavDx};j+hxgB%Ak03&k9 z)s?q_CiYCgKhb#;Hj4BXS9mW|KLOa@_D9+m%d5z~IlH3pWwAGXJEE}Vn zFwndmqlX0W?`(~9`2K{c`h5>>13dtPf&2lXnlIkLTvwdW=ypLe(-=kkZ)Kx=vtY;I zHuPnp2;Wa%xyXdRFSz?lvO zg4C%!&Va8sN7}F2op^jL32$D-#JmRXh zr@f;l&yR;9?dSIgsK0M}x9=+u`EH>7qqtK_F?Fx&xU6FpzRzTrN00{~x8Jl6c#a4H zTQ*TX29I9}W9%x=HzPSQL~R2=?u&?tHPP|>FbY(8E3IvSW@Krs*$pyv)8ge5nPj<7 ztN9L*8F!A)duc~#u^1Wkcws6tk~{3gn?R8tN8Eq5DVIaUEa zUZ~^+9BP=ePnJ0Gq1uo8VoCbagh0#jGq5a4yK%t%>43ptC;9m-<4V z`gF-Tqd8UsjLuO~2b2PS{Lzebh46_PR;*NN-(!^^YqrK|-zjB!c*WciP6BHJXVh2) z9F5>52O~1e;s1m-nMDS^NO?#GL=q5d-aTYbwqPMn)j%K#{t{fhk7V$%-91gcks#cp z1#Kr@=`SR%s`|ocJzmnuHzNV#OO0-f#%o)ZXSU7sinvcacnud=t6Dyec9-0nX=fxK zPuJ{1xw{DT^CGcdIhcyDEpG>;^isNtd^r18i8BU_*MDJ=WFr-ant|o({%H7-*K`0j zcDBe*X%DgJ?fD_q53o5ppvN zuTPHgX3jU4Gv9yC1>ue)G$s7aeskdMtoP`Q$n!-gd|H>2n(E5I!&R$wj6DipoBekj zj@g1{gwjI4to3f)Fp&xC5jwW_0Rx{$HZ;L$988*$934oJwp==cpqR6@D1eo)PEGf+vE{{hmo-1 zej_mxRtoVKtn_LJ8GwuuL16XZ@OqaS30VtY3HXx$;PoVb!Y-SK$G^HnCighKor=ov z?5?bFU=GxM+Xq*e{xBz4ZPj2)+gbHc>KU>K_)+>Gfpxy*C$=&^azEJ#mx% zDcZz-xQV5$QY6x{>HEcK|BSiBDNE*dgZ7rhObUw>$6d3u#;}l6*04xr23s;a2^TFU zh1*jhUW2{*SKWd!ce2*@U}xo;0P2^GBkwwSI*^*718s%5WE=4cAi&;1Fja|z$&c~d zQ89rw^!_b>Uei}h!GpZY#hQy0P5@jMGr~}|WYTw9<-FONm2I#JhES$me1&1~fHCX2LcLm=wcL_X*w*lMS7g=!NqcoWmF`J1WMiXgC6b4MK8WCm&Ehkj>)V0eZ6Ln!BGU+tqatV8{7a zydaQ3-*9jhgk`_J3-9HMT?@UpTlON?dN4(#JbhAofrVFp_K3{iKuzHvuzLZ1a%8}M zN=iV1SLc29_wZm!O?h1@Q~rt|&b3rZlAkH5{2cF9YQS)~Co7{TYd+I=4yIE#@jgF@ zL9{Q?MT5uDTvE}3w%0f@0i#dxPU*#`bE$Rz+zWx&Y2Rpa zZ9#61l|L<#!0z?Z$BEH9qN&j0v4H}QFD;TNmJ)p164besB+>RXkW`4iUP{5!wH^{V zT#J5@y1p7ZmU3Gc7L{S|?Sh}wFQBu|`0-pNv+;QEREWI(zI403DDt2=wnjNUob|d( z37!guQ*V7&$&L9+=c@-|G4f!pqo#e3rnovstPkF>PgJ@z&eX_!iX=S#C1#W`tQCe& zFx{A)23!g4eDVR6P`f5gb`*MID^xDkS~mnGZo+0LOV@!Vn2#3;7Ing zXnM-W@<;KWwn<=s^~IOaV*z%=IvC+^0bq)W6z*U;Iz^7A0|B}{AFfWn6S18f zZ^9fV@04PJ2F!bLhveXL)HJ4TCgD`y$|AMwL!}Tu=Pa{)Cm?_i=?e-nei=S$Zms~> z?3ZsWi_l+;m?GW<(WCRyJ+IsT0M-Fc*=7$ISccl(wlp`A&G8}0igam%h?1Kd9Gaxf z>@R3vJ$~ak+%yI@PwA2V^?CeWup=XotZOqORApvKN3kchnQaVQ>kEPp)uL8dg`nex zw?2<|k@N!JUA-37;IE2W3pzEmvy7Jh=mz{WB93qgJolc($Ba_)v8Pf@cW`N}Q?Mk9 zM%IZO1rQTwcX1P$7&1r`Qo8$oJqB0 zrb?!ixg(ANKT%U41aXjxA~_ux8(QWfB|~3hs^uRLfPDLBQHmD{vlpq7{Zm%<%uaPXCa?S>&#hKBs338|fWy z+8;AVqZ`kSj@>mnsR)%|&Nlvc>^?S5mS%&iVNDHo(pK_HPXps8o+mWfcvgBI7jLbu zWqV>X5I%-OHeWHlqmo3wLf2qW!2m-xEUtJHh?en<=G9;;_#av5cVRd!u20ewmjy`#Il zH%Blu(L<7}U&9%Z^we#9OBn3!_aM@8X2RS&W*#kyKupK2gRKj{)tqy+xOtrsvbzVp z#1Bi??9?9cg!%&lxZ|($1jW6n{H(Szzth;jFj{EVQ*&lhX?P=31WJPW2q=dE>ouTx z`@k=07^vkkB&6=ZE)0)USD4i)wR7&+=vxd>%m&pOct?2~@DDym!k=S`LXS9`8f}YU zO!NTu=N$s8-R3abWn-Dk3dcb?PUk^}7VuN&Y42NBB*^Vp_@s22K_IyiwSpAtlyT?f z(y*b;w2GeH_Yr^5bNks#qPRoL6nnP1LSt%jz}Nsg63>8X*Y0l4C0ZmtjVL&aleY~X zzlH=B_vG2im7|8&oka82q> zgN|6%-3B;{@BsMrrh3qhLY(n4_i6pt%DJhhbFy{7sL!aCcwtf;j+XBNJG@fA6bG9A zH<#pGJ)dChOSRVJ94L*;Rzlz3bSWu=1%G&BlpNL&DJm#R$^HyhNK-%W4OCMP)CP{0*{8jz5)wi*aMs-N0BdP}2}!#=1Fn0+r&9aD}o zn{8g&k8a05F{_K$y?Wq`#>)Q*_&+85`2VO{CrN@QOW`7G-Xl6cTEW{u86B_tC+mn0 z_q-R!V)x2`#f*@hGEOVaEX(yaYGTQ!h%`^szLdE$d?5DpRU%yYa&4uBT9+ zzPC4ov?mC2P-PIl)-ldyKA$=Lt(6SBlRW<^-!qqe98v^B} znEHx-^!V!Kaj~P!cvD{aMntu#?(!H~Zjcxk?9q-~Vg4d$U>QoF9g&6hL)#R_zh;@5 zbsPhms4+wGM&hmnr>4Oqv0~qoHqro}o?X_AK!$KW>_aLOW?)|uT_T_45JX(Id(hnQy`#1m*)TtCkH7E^5Hf+iNr5%j^b=>QD<=z}j!a^nT$M)AIFK;cv5Ln9|xnS^4 zb4^&J;}zK7r`*-EXjUqf+U+AJq`-dotRtUWd=9zsN&*f=DFpZ!Q|>Xj+)*4C5K}{P zf`1B+C+pD;i^e4__oyxR+6>PaCFECOFELm}(9xeOaWQr7WpT+R@}?VjHo!h)@{zIG zS!Sv^Ls~bF3k=u;Jd;8p8h8@7J#x0Vpj(2G>6XsDRb$Sm= z@F(yg%SY?_BdeX$tI^`u`SX3s`D36b|6zzF`&z851Pd{lL@joBK))maDF|X^@jI7! zkeC0Lcjy=3718FGEHho;ZiO@hhI$%C{6vxRk|EVm0cSJKss z$`+@J(vgv|kr5@cjM7y#rHQp#egE%Ada1UFsn6x$1%o9^R#%Oqtlyg-Ru{b9C72ugxm3Q9(;^B8 z?9q4JSgilLXY2!W)dI~!_n}QkY%A)4Q(Ks zpcxcf+c_fZ-!o%fj31pna11(~TV=Z69b{=esJEEv%ypIeC_$7#gJdDfY|f!D?rL+| zuY^0@ZXmoijX12_w;RTdyjIfEQ(Zfro)@n{z-HFO z#`#z!{#{KWvr9Hrm~`Arwri7e^nF|9q^6eFd-NgC2P6;xVPj&Gx{6FRdD~dhzWRv_ zc!i!e>2(yu`Eh#jwsxsyRR*0|)%D_6j3)k;9U_@lxVQqy zxsdBGqI02Tj~NHork)SFKt9XLL_Mj4rAsiYwXmFv_vKPgoODK_%CBxgyg#g2^|ZmQ zd~i+1q<+Kx+pU*yle1k?YBcq_ktH}fTW!(QmabR3d`DBm?@X4Mn!YFz&Ol_YXWPU% ztl`;yNhWQWn|baT-?Bkz1G2~*1ixhHqWmxpXo`rhy;Jpvy4Z9*tVcfj7(;nDV5IL$ zVvvz20-MJXNzatd$2L(id)cc@29*L^W3>pX8XebF(dvbzxE<&lilA+f7!+_V7EL6i zTa>^hv?4PgX6F7fya3avPZ(;bd=+;t5K9xmvhWSGpbN>&HLxiBvfMl2iDJcoXg}53 zH)m8)4q6!+tR&ZLyNq;BG*2wZan7gL2(*1IA_Oioy>No{LFe++$fkGbi>+7&tfxy6}XNmcR!aH z*GMK+ouu;0G1gnPA7Gw%!l^xZGAe{OT($+{<#vHcyHVJNNt*$1wT#b}1vS=KIWXImP`3={-_x}zG04#p?FGCdAGjc+F3&o`t9PAulS>ew#tSF8p#SV4A{%6>IE%!Si3 ztR$iRLV139?v$hsT7O|it>yDR@@Ja5p{lMqaSm7l06|=A7?V$_;vom*>P7U_$@Q$D zB3{dN2~bP7ku||~XJ=e%GPp&7^m=f=4+&xKd{TyA&vo;+)&sQP4 zVn8yBNlQ2)W5ft9UAX1V`}>soQ4VwJ4gjOHijf(b|F(V=_s7)RPuTbDq+u znRw7y0c-J1X5UUMzB7evu@d|6AtzRW44+JKc4)?Jm9s(uC$Uv?4&SByo>LM@CPMv{ zL{xD19^YO1HKe1O*NrT(_ceLkp5o)|yDgC0j)kv$%35@ctd`P^!yzhj7-}wjq51pL zgb-l?9Qg7pI5_BHlJWu3EL#MCF+RTpM<1r`=Yh0>21Qk9mg|x>?1Hg;uI8^KxEha; zad4t$5)(Fz40%Y0Bi4a7W?$MgoQ467b1qdpqUx(d%*l!7^eUZk1w}0H>`}3u;@<+J z9ztW!SNtT}4m>N{4(N=Gl@>GhG580H3l22je?O1>O}tOnXgjFnkKV4+HoRWNUANg? zI;c@lMT0lBUKSnz9^f9JiR#`WcGknDcw|L#R$ZIq05jWr-|aTm)Ah1jUji5{GhYW5 zn5X!$5$28mdxPAq5z7afkt^$>*hLa+-*1V+btiJdL>ULUac9|#xr^;^%3emfja?oe z<)p>$e#}0ooqd3b&p+u-;=8S8{rLK#(!~M&)&abm`exCPjL|L{}gmnDTI=fRW0IW|3QLOFRN* zjM=7H*whzmjL+u>tOm*!Czfb3RcNn*{P$P33E!bphQR!u3!?=7Gx-=kcFP7Z%RcOH zt|8jap=Dc55uJVqa@VtEKFH~GqwIvWNqqBKdbF$+-XFA3n!*MSNOh(C#4=jI|rK2NRTyV z`%#}PcOp#_`XUBWr{an5EWyr;CW!>@b6Qi(PQzf0i6gvH)SbOliHzWOUvspX{0uA7 z#Mx&{25H^>Y7)p|$<*o>G;+WVb0$0`NQAKb`=OJ3AYB6^x`|jMSGmojy1h*;p{B)i zBH)M*ZgUi?oY(o1(SMQ0XeVv|pT!Cja57nw>8V;P|ex zg`N~9R-VJ4i#9+bAK@;_04yCWN-QabNdd$`5Q$h$ON|=KcC{a{mpXOgP$2lKQ&2| zSN$A_RA?&XSK@-ua$-8-GL{= zWdq<5$w=-j$$&psuo-xXF5XeZ^b?{=`*00O^VNWSumSAS2iN0p`V4k-K8_S5RNk6 z4;0Qfip_k;n`af@F&xuxBcY+Jlo#4XlNmeeZ)=ReI*5}(b zpX|CwwJ6rDqSvJ;Qm>{oX?(Xg`>6QlRPNf@$7`k)l7;1)Y_;~MK_ulVc zc-C{){+)ex#K2@d`akXYI=blWOrWOL3}+P9&ly$BYqRD=8?sr3K|3K=ATW$KIzW9gE# zjWD-_m=#xV6sFtUDpS068XpHuC5Th!mi4&F-u?furL6|QHI^K*8S?E%Uu-@=*XO*^#upL$D4n6s z-eZx}8un^zeQK_LJkyqZo%s4Kbryg-T9*(mVyy4e+^oNTgar24;VKalHiI$BYG0bS zI^EA=0EH-LX-hWU{d+yIf|`cKussK0n%6i``pknn1m%4KPT%~3TZF-AVFmwdWKW?3 z1@QmxMnyCWz5^decgtvg+1jC0p^)30G zdzFeAk<^S(a^+~U)|TYzyxVm6g+Dx~r6bOi0fQd)(#Rq;d53I`P}GMJ>Mod}pUjE>~F? zR1wA*QP>zlE#i~c;zDNrn*|Bo<)=v-N_<_1z@?~Z4sD4g6z2>x#E4lSW7Xa7$i0hT zVCKFpAc0`5Q%~017bWG>*JV#+m9YqxOGn&oquMHJMUBGFV39YQBQ9#Gv-g$0qM)8G z$DOq&*}H>~Fc}SS_Xkoohh$$Z<%6Bwhyi;P^{o#gDYr+L6}^b!4Fy&ih>NU1kGNCb zY3NwN_c8fv#VPe%+AIBtEp$UaB1$%n!E&`&@&z~!d*Tt``%hARL%UFdEA;Y%@y`h;VHz>8*aESutg-TWWI;~y(8hp7Uyf5~!cs2B@|)20 zWx5}ar69*os{y%39UQoY&HBqtU8pu@gs*YQ019T25*JVP&l@5O59gg{#qY#@45i=& ztT&Y#!*Kk-V!Q9=&st5GHwk(-*bkHX`RnfImVBpY(KvF#Ib>5|;>NjMeB&t%WK)~_1sKfgvc#PL)XV&Ag-s~XtRu2L)}vIC)G26Ql@`$f*Y;}f z$Nkbu#caXFOqF@&C=V8`c4Mx~w+lLL=YrgGbg;_ek=Xcgd)Gt0Y_HAdV!uD$lzHy;D1Es&Pbqwwjo_}YX2yC=YWC+oO3EXzYVb&NFI7$=TfTl|D0717vLZ5&y5k!? zw!?_`*MJL8TJ}LSMLb`^SUAdG8dXhgH*+hiq5%hEKaXcWaJUJenfDDeqJck)3q zWgE89kiuknC!vDwD|A8b+1!dvnj`i|md`kTBEcT75;3qYbT-zTB?L^0wo|^%PhPr0 z-RTw>;eXz&*ktdMm?4MkiQQmL@lc;odbb)~4}1v?DCxlT@R8%yUMJ_Q@6d&%6m?@q zyeKd*5AS%0oML%Mp`v~*0=xciQ+18LcJ#zmIGnuAUztVoA*9xEc}?}nuubNOGmIVZ z@8^Nw-QSvMuHanruPU`)BXHWeE@e=td|*8Q}4PCDm*o?Oi^A8xR zZQnYc^6OF+dRGvE>R=W-2%zhhN|@IWV;y5`XptPI^^1L>-5h_RO!F@C7AOR z@7I1y=QXbRvFZ$lzef$Bm-X?&_gI=1z}GknyIgOHp3-&LZhZqU3RKPg+#Jd2I2&4~ z61tGiYgVy)buMt;h;7W;5|A%Z+E6jGD(Hh~&!ES?rA#-eY=jGS;Y4)?TorTRkKo5_`Rw6zj^Y(JJw7Mmd7^EE>9b^f|h|EGDy7C+s^|C0tNqg@ye-+G+)B?vJK^LQ)Z) zdyi&*FjgDiTfN7%jK+>TtM30WdfHP51~|@lFw1tNdZ+01F6b-I4FW_0u~Ob!Ki87a zIS*YnJY=X77y1I-KjVPDLayTVSry5O9$3& zVD9;HTlB{XA31K5f9ekyfAn2%$yZffMt_!yRp$`(&?Hr{o_iZ{mGp0o+HL->I@H12 zGAx>{nQG$Y+HahMW2;!EmYW^`WsyWYNw?VdT+ZHlV-oFrPui&h9%L3BdTgVr8D(Wl z#bb6qX4g9Swj~zqjC-{OR0J~AOKaTaMdJ-N&Zap=`47`ixyS>W{4y?QxOh4>g1?d5 zZS~jHj2my~!HR3;<(fwGxA4RaaNhM>;KkwNabt+MVb;}!cLMFGk)4My_^JIg7&-_lc@4J!U?JE*$LUo>Xw~s#xTj{ zP=~W2S;?`y?Pk)*cB}BbG$Bw|m;<3M8~*P0DUk%zsbPR%j0pV zYXSb;NPL!T8n&pP9T;Hb`40UqVc{%&f`Q+@C1wy=gh1ICR(8L>xL6@hohf5x@YRPU z41>P0bEqStdV_!9Y;GBwxYhF)qtSvE8|C2n=-Rc<1*5O?6XBr-hm7XSpZEjwKhTBH z{txxASGK!>c|MKt81dT-$gtmk+iCn6xW17cm%-y|Z z6-w>0oH%zREjS%nKl>rHGZs;Kov_0|<(__I6lHn6z&Rjv%5`D#HhScRFcCcb`_dSz zLtmk1AIHclw7>1uS8|H1c~NoC`8?|P_m<+tiNSL7A4cy7%Jg6-=u(+4m0L-p7xZt0 z{2+M0H?N-N0#S`1-tFH02o80Hw-Yj!srVKe2?Jlo<)SDJN_e zEW;{5nmAp?9QAF?A^Av+!=JhMroZu>Wy??8`64(`+X&z7FZ*|S>R7s8*-aGu)3Rn? zp(c+hHxrHKMyL%Cp@f0|x>E@SR<-TMXi$|*ihE*ueB3@88$kb^?aYMU$LHp}^ErGl z_i(^5uoMj1zsc@@EEal-D=peUOnmy_6jrZ<;ad=kQ1CRMUajESq2eP>HQ8=hk=%;c z7RQmoO3(d-6_L%x+C&Gae*fwdAP-`*Zk-=AtNgGsag-gw7kA{!3vglY>2V5l(H!s~ z&GOJ?>McFl?QHA7jEi;OYA#6o zvb#Hy4>ORLXt79Ztpu}&8VH^IA^F5K9iAyz``|5Irc)z(@1JZR>5FV9q^!;S;T!Vv zJu{~}Dh`_lY(lM$Eo(v!SOCwBuflY;fgIIYv2*MwrFo+?7CLJ2Nfl7e$5o3_Qgdc2 zv4`Ir^p!jFJN+QcE0LV)L_GVh?JjpB3J*9xWApj2wgeToDELvu5P^dS#aAAW*Liax zsPJ{ypL9I`4!K2oxY>{lN_!=X^PzY9OhWgM{Rg~ws@rRAk zV&Th(pSv(I%qU60Q`P*8pm&PgE}!?yvx8;svfQAITO{sS3tZ`|rp*>47lyBmBsZbr z^oZtxp{im{&jWJKzwnjBVxr-%R_66sm@Z%}sr4;#vv(mDOfw~B ztJvghd{n+SII;W(4x%o|m7$V5AJ!1Bw=&eDf{`;*e^QF+&gB%glB9rRHjZMSwiRuB z&lDeqMn!Hj{HWazk9X#}UMM_Mmo`Qr&$aK7K4o4?m(>j9oc>v95@}!4wU5%5;>$)p zrQaegeYSd`WJOn~_4c#UIAn)k|FwOm^niOj>{b$rjivHi0(r=y>#}C^QSG-!9Rs-A z|LBqdbQ{Vt{zbRasr2eFbJ)|cl`Fe0E^^D+W#T9Hv*#W2{D{C`&!|PGlwGVj%`zat zgp~`-`Gy;_UP$o7@-rhKG7&WmLDpQM7Nl3f{UEwwdLx`KNWZgz0tP>-6K%!BMln;g zap^bZsACYj!^tf8K5q@0=8Iu#PQ5dVcEEZiM~xdAlfHeQ|JJ3=T&ZC4B(6jSmj@If zdN}9K*=F!7_tX6YkZXEDaaRyV+e%Y5+rPyt-Xm4_-!*D|+`}{pbTj(oQweF#)Z;{jDKxO7N>i8db zTb&K!GBE*oY-Xev@p<2l;~M||Fm8o?(mlid*rbRGq2T`XiMqP5i~IJuqA+Y~-8_|i zuuc8!J<8L1Fk@pw4j&v*fCeeHmeqVn5od^V6>CsNn#@YJ>n!|tv@lFp(i~2-eo_~oCZ`_}6 z?4IJ+3q1yLCEE9C6$DvQWl*0V_-({y2%T3u)17nER{<8gf!+DtqsoEAqYuhbRL36- zaF#l!>?CQNZ)>rJowpV~4}c8x_}lMo?zWhtoO19oDBQ@jJJ89EU?4@JFpe=HBc}VH zYHQ)gt(;Zw^XHq(|2kv-H`Kh$4BdagCWGsoJ#6iMBqJl|Y4Q1E7?t_!Lp@8fe7^lN zoHwYZEMl`byQ1Se#lX4?IVa81{7=zFiZ5?n!wJZlniMDSMjLooS_Om%?0*eb$q+3)JX6w{GalO#O@AH?N>&NR%h5?zHSCUC-M}ajnwesO! zpXBV_gC$HI3*6UIC6Gg3!EnL?<-K2Hkk=u|gez3u8GVn-g;@#caP?rO4COlnAEQFr zGT-B7YETEb(SGafwbMmjupg4-a4CDPmwc4KP_m(`VItVPc=C z6QYn^He;~Knnubtn5RLVv|HSXC@k8H=wQxm9o7itl@XrfCIzbIy1Wmyl*dHxVT9}x z-xBnvRl7+`Sa*KR=b?4!OrSEwN&^w89Q(>gHb~QI+w;!U1jY*x0{fQYoDqCE6FTM= zFiIDeb*%8BPo_`@2Xv!W59*OKT~QzEr&{}f<}n)X;{zyp-M}7g#6SPR8YQ*Hn;_ii z=snvyXO++9FX1#>vjB)5nG5*$5w^|6@%OZrA+Ie^zQI@r`AY|o5A?0ykgg+8jO8?V zI;{a&JJ-Ql%%u4YaMQlH@!d`;W#kvWDqA$@w-ollx2CNRv{6kRyecod;^CJi_r5EW zU{>N>?kGcClL^$1F&yCDzY}-aQXN3|X zOyi=$fb$=ptzojT>cH%7>ht9u&)V${1q&JWEFnv{U`Ev>-?$hla!gDHx`@O+e=~LFz0l2xw7lK(ky-VMj@i6fGyUIe(2)(DJF6GNDeTy;uv$0U zsK5*1In1gfRT+2G?e4l4I7_>i!TNA?%>iv+@qWzlt>mvb{cpL#e}<*0=szb_`4=z$ zI{nj4PRx9!6yLSRDH{M)3rlG!Q642Fh*M~PY>d5u9eM8K)f@;8*55^1kN_%Z0vMuE zvcN+`7KrKJ#T)Vu?oIKXU7~c_TbcIPXFZ_PmFJ)Tmc^ESJdF}_aBw)#IY!jG1?v}?r|FxQ4Wj8Jp{H>EhX%gTf zZ;R|cH`*=KXILx@GWo!Zi+>{g;bQv86`VG$Rh7TVye?`94nS8cit!m4#5kc!K(i>< z0jtft1&<{~U9;BidAgmqO8wiVkI6e%bL+NkiR?|*WXII6%h~ais~Dy!nv`|lm_2JF z?z~A6oRQUi^$GX)L9 zk>u*hF^%!wbhd)v1k@-zOcHp(S&8ByN0;*0tMY<$Sb;*~QN_}aF`<_LRZ`H37l z;5Ll+;?wZifDb)2?Tdi|G$g7j zRWj{bA(;XT&(vTf^A?edDz2x$?%{uDBZxT2P9^orH_5_Qe(yhcV`?5SmN4B?aa`RG zv-?8sM zD%cVkox2P-{fGuH48`l_>6+qKEr=g1D2067% zPfkFm&pPZcf64+Yr zPJyXzS)K$&KMoq89e`vC2D9&IQ^Kq--jK9f7qZcDfpwC?jDPQe*ijI^6lV~9=e(QlU1b>~-n{fzF@In6C_=PD**$tdm4dR=mTu@fnSV<<} zi#UMbN=jLj|HWn>DYw;2=O1i5r>@;55$?Y?c^pi=6Af1&aTuhG1cZ>KWj&}$qY0rf z_)tH&%=E@d9E${7d`Von|HMn65@$BEir=GYdM|c1TuZTgCm^($wTC5_1!45O@)%Z} zZ$5ABGgdgP?CfdUxUbg+?oMeY8745{V;B)-JC$}xDCLs=Ys$UGrq-GqxJU63rdH}B zG6n^}c4&Njb0wLMS4;WXHp0hDa54TB7kvHWpNDu<1+H&K`+Z;vZT@5wN2K{ZPqFKd zJlT42$maVQi$hI!X9n+|g*cLSxOU6>Li1(H^iPm_0tKRWXN8J%<);V1u`+t}xo-RT@pYE*twBR-IsePQ>oePI9=^%5;g zJ9#+2D2OZ+Bs3{}3qB;8%Qj9c2MbsmM%A7=LKJgH2#M|W*b**j)Puah7D?0Y#q`;s zwW!v)<-8ey4mY;D_R*no&vuwtar}tb^m}q2;HoxxdFs~`D2J!xa}zG6UzF=bUy#Ag zg~5B^%|%zeu8FI}Mfd5&>I3a~aky%d!%GCK z^Ie9lW~?|yd20!`*}pc@dUaKqMI!82X6u+wv#leMzYv*(Z6CXB{#+cvCZAMM2S7eI z=PTaJ+WTBh)pjz{i^c0(=TeR(hT(su(NE9cEPLaOHCydd6Jq7F32x(JxCU)5?1Z<& zs@PUs2J6YQN^X=scnmJGRAW)+yv=N@V~ZOTLL6w#4z|{=aY+bQ{sSE|XSTEOv)KgA z=TiSG+Lyx?eY(BURjzg{`m*Yf7s>N+7ClbA{piwBMPWl;tEA&y3 zgVQj1U}jw)v-$1&D|Nrq^9;Mksn|h=?kh{B^TdKSm~4^;DbGQ@5~HH&6Q{Aj9XX$r z08;VBSv?xZe$faFppw!uL?S>o)huj0!^r|Lo?_N`{`$U}AGRai40Yo78sHIpx-fNm zR%aqpFC3)Nd&Hr7-J!2VFu8qxD{`^?V@vz9MSJ!CP|~mdv%a9n-0}qpU;1?Voa2g| z!|N-~g;72UZ4z1Q`wtHWg_?OVP%~!E@DQd2e=vGG{dR91{?y(&L29Gxv7?J&cAAN@ z*1oE+UR(=L$+kd@=*PcLF3xMY)>bg?k34R_rs!j%U!%v?a2>wHLrDwe7h3FtRF6c> z>(G^(4d+7!F!mrM1?|T%>}?TVj;_kZy;CUyr}&Ee#U+ zcV5W&A{Z&1D9Bs&O;xem)LGVbV)qQ69uavIorT!R^!-UeW`={R^tAR$f6?f>XJf*R0Cy5+fhf58R9% zsm(gl-l(st9|hr2lh%}5D_~_#a~>w7&d1T;!G0CJSVHV3vyRDaI2QA!!_t@e-mM&w z%sE7^-lFjykJvDV9+2cJjlfJDn0?<9(*|nt&VPGAQVYCCpQTN()G84U3_cT)?bPWn zX|12%B*ZT}-8Gx5>E_b36{CbsF8kgOjaT%D1KOl4mfl01Gz4O9md99aK3=1g4|{9X z87Duv7v!b+vGX;zkznc8wqPut9Z`LB{KAGX%EjG>T9o02aGW3pq=j}4Y9dVaeG4Lb zerYWht-n!ROwT#}hc{@!>3I8wv(rnHPwjibho}jtU347qhV&hY4)IQFm1uv?f z@DC_iY1`5A_B;IAgSg-RCkp^W(7>ng!#&6(Q3grQz;*$NwTYPq;lou94GSUF|M8U1 z85&F*dAThA(1**LwF5l#L_2xobGSJ~-?f!-ST`s5zPSwKNx!ycbPps@F}i=eZC+8} z$$5nF@^(JOs>7QFgZ`s{`EMx#2&fV51Uk66F%!NnWZgi!0)iW+-Fve*&CMl}yv8kR zoDxki&1{jq!H!eKamjZ73+6uYH+2fIGZs&xh zdz^Nb)0kQ}x5P#t+DEB%Z)>DO#O>K(i;tfG-dz#?>aCqL02|StWPh)~1GRtr`YqiuJR$S#@DkzdJTKl&9z5|Pzf!6h zPeOR*()-Zw)g@*ySW|SkuqwV?Ccm_SI&M(XislHFiS8!hwzq7J(_{@3c_vcHHfD!F z@Dw!wlhOvNqCt}VxL1Jod^dSD?|WLG(b##`TM9@%dq~P(Afb;YpCX4fc_+o|l)XX^ za!3^9P@dbFl6-{_A(GNb_{y0CoIzN*f6RSdyFI6)e3OX3 z)8%d0X@Ai8WbzZf9|IrdeV~NLO$JVHO#@etglvqy{kP89uX`w-cNdoDLY?sYA6qN# z1Xd0IGdQjP8JyO;n}t2!qhde1wl%}xo?MsGYobmnD`$|a3Z@hdao1*i(fgwW6H0bx zlcd7;(R#@21^h}Nhi{+7P*P>T?s&Y)>h{_6^xqyTZmO*{;m@}5tgW5T$aY-xifQob zwrD_a4>CoS3UnE5; zKro;WRcdPlh_0*Lqf7rTkyn{$X|yIAH!0Ez^||5Ea|}#{<2fAU+>XMENa`f%rpOxE zZ8H;q)MNlpObc};BOybWg@XF%=W@@E)A!v(ruUDoHda8vsuX(t`s9@qEq^XDbi@?7T1MuOksNB{g;9yrnP)7WFb;59TT5+3>lv!-x$AJ zjuClPY)m9~%g=A_rsT?j;!)-;^J9bjNxQ?`ToD|1G&yQG3QJqV@H4%8;~|nLO?WZ{ zUEc#U_pbPVp&ZY%T_Tp}#|YA^x5*!pGi+QcwTz_`^e?m+XsosA%=Yyvo$dX|4mQJG zd=U|@erxxWZerf?IrrK20oAVEb=dbG>Y<~jP(TbPdWFVRB2|djLWv@dHW9Y@iOsg^ zL#vgtLoB)hzx+MDSH^9A^X_N1cIr5%<{tmn8$WqG)i=?U>67V}HqkvtB z?4=i$5*-L8XGd~UY+6^|C6c1nLH0W$KjuY=hrkIXi#J1M>_{M#sH>-LYyQmt$Q3+JaG~1oT;8v-a1xen*PdPq4MS zjEzpHt~lmG0NE%UwHtDgi=OqgzzJGl9UZS>X{E%9NG#D&;MGSxdd*np>@pu$95|x! zGaJn}+7w9=wwPRBgtfuR(Ot_F@ydFI*z~7+vd!gujadFzFJwWJ{O+1e(P0CR8Mgi| zgVk}&_P$muJyE^8ESI$7+){y+v=gKaT;Y(Qnd4N5eT(VTr#W^2EAt#fo6baD-iQT5?aqI7&XFLVl_Ui@;N=-;NG(15kk`!u4(#B%b8`KR`az0%MIMKV<_It4_vw%8_F1qhikCOt57Rlbt`xv)hAaZGz$KA)xZRfS2 zL>0w;<2ED+F3=ekR2X}hW!$wV!gh#|9%%FX>J$~vQd}>^$3P&qfj?svtWXrLC3x5( z7H!N_>LU4y>L_eiRh}@P22ZhBAWk84!560pIptm8rx3jotiMZn=l#9B&6JdI(xbB@ z)LQtZ;e)y_f|Pgk;Y)j00xUKOxPuY1_3(cFF*roX!|_G(QvLLH9E=OM!6&pCoWM*- zG2ycN?iRO~(ZtCic-Dc8UTLCh+^2PSh6G{gU-<)hOVzNi!edVI`^lhLptvIY)#Dys zFEP1omL0V=hWkhIHAg0QGpB>0%BKi@{zKYgY&{)&{WL!kK@H{}#&RE^j+2h|KCzC7 zAmey4K!Bv~|J(g*ieI?q#^ShGrz-+kAvm;|49)JWMX5Ji)?`(2tgr;Qr=aJ@?7~=0-_1~NFSI$v zA4laVUYrSE@e#4{Om4qeK^gxiXv~`FPP8=lwjQd>gLy;_FgUcLQuTaE)Qo!aNZqID zpnrLgb+yvTO*fPdM|Rsi*{+g#r+NLDtTFjPt^YP%RgSgWQ8~pVHay!|w+2l6kNFHs zkcI|zrQ!=UQ(^~zscpS&1cyHG&3G^;trf9=w)v`GlV|Sf3dh<<`wRYd&kt9>C3aVstm(A6}cD= z=bf+5S=(ugY)x8K-3YXo5Wg%>J@2RR`!DtXrbl8NE_j=QoUM6yHUuwRCThI zr5=!|)fEIr-wudjnGiJ@UO49POr^A{e*^O*LG+B)?wJf`!*|ij;OyyBB=Sbt)P+&8 z;g#b7B}UnDK=vr&?L(#*AlnhY2g`2&FScu3s^B}jdJp*O^;TAKYHqgw@E(#}EFX3_ zB1z*`YqB+yz$)vXqV|ieec?PwX8fcaTc(S~d_Qg%EcI zFZC4Hg=`8`jDAEP{u|tWql5(I%*ZnIWI?1`Pr1?Rm1S`{d4_c-rP<5rqN{ieV^J|D z(tQ89%`p-{K>)p@f|a)qw$UKjO8lMlP9=%ug4+~I`?8Njw;7||--eFY_Iz4qv+h^H zl6Zy6)5lg!ADit=bbO%nwi3Oc*Ay93-_*u^s+Uh%z};vOb|avyCO@b}!R>&`{lZ6_ z20&>&yL6WJM%YDa3K*tO77OR=*5D_Zm0Pxnr%hY}V3ltM{mW99NP3d$U#{ZU@Xf-x zX&7f8=@@@G6g^>(ZgVxdPs!L{pK}J8C6Bu2XB_zpPhkvCiRKB)n(Mr)@y2^?wvNj6 z&UKhJulx<&Np4pD6ZEE-ONaFF*F49zVg(1BzwJOe{4wRXokpS49>Far zrj46tazwsR<~{V}%kF)NG5cVFLSe;(CvfqL^p`aaiFY^u0_0wCC|C$b5Rc<98d=uZ z?Bdhb9LwKMyNdlY`dFYNCJ`paV2h%vhqe<3j`XWHP^fOsd8Q|Q{i;_9t8ItBx5T7& z#Tg+Nh3pV=+RV~hMa+6pL0y3A`Wv6s`x`nAU2M3J{%-!(cT+qf#DwUKprJE5@)sCs zzpSd?2w(d%eo9#fn0~Hz@J2RQf;8Ka-g97e7v6Q;=>O*&S7BinE_Qf*gVCD_sXoot zGRDOv+d-wgu;~2OIvqZ`JDQ_!aVVmb`tMKC|4F1Lx-2ujhFW@5yiXtBTrALLG(3{p z)zdSfT?VUlVbHKSXK^fY_9D?pF-<*jnzs#y_jBcwMq8ci(Xrh(yu7N)x}$RgSlGe* z*unO3r4C0vg40}o(&n28f{0KBn|N2^2_>bH|E*Cn`d94bd0S6vam`hf#qvzl3VsFf~Y9zL2*l&w1 zMxTv3tF$C?r1HQYND0@(K}=dhOj02=-yG3NXrtLTN&cwLHRO+t)G?4L_Ty#jr4QS# z6SbXXFK@|4EJX(}Wn=qNc8gJ@-DHex>uoJGF~xRQT5cUC)m`0u-U>`KYnOdcxZ6T; zlwy}KJyhP)iQTysKxgcLax-Z=e$&GhHj4g$=+CcmWuO}j4TYCbKcWtv<}u-kAs&)pStvK#;vSiZ77Vy zA)D3-m*UrKp+H)%yg;^toXXx+7Rhm@zH5EJj|h?z*F=7rXM4I7Vgbrk`Yt~*NKUq!U9tb6l__)8>=NZ{s(c06buOAcRMFL zd#7w(;ZTbaiW_)C5aV8ua1HvP6VJ)4mdvW(z(zDBAcIAhz^FsJ39H6IChgBnfV{0>$T(< zQ_5mLMVBO}piMo)4JO9huzq5!49=@0SzVey`s!@xbMk2a7DaeG+x@thTWJ_6U@cK= zZAf{}-H|HJE6$SiO3O14HA_}wiyzI_uh?cgIa)1exJ-%bB6+;C1-K`3eCYE(j-Al| zY&Eho_#HQ`zD!b|P*D{ug-FGEGqY{6$YT&J^%C0bFNf*fk7(%lU(_?CW67O*J`>(o zw~xPi`3!(wVDE{oMuOvT-+NZh+ZI1L1;aOcXu6hwfiK0@D;pcw>|l1_6r0-{dAf+{ z64_o#WaE#sK@wqkmsXCLwskbzP)7`+4WE$toGq51`@UxFIobxrY(9NM{&G}teQQWW z&5Tb#{Mpe(MM}4!`?*pCDXEwj*FyW<@Z*spJ@)c5T9mWrT;=^(a*W8ywcbO&p5TO} zS8b{R$^3R%u2z$Wm+@9w&h#$Ge-HAbz8TPAFPL~sfG8TY{*!a=1$!ixH^rJ5+jgw` z@GUh^NSL6I>FW?#hvwK{L`Kanv2|D2fjxjbSj(8=R+72Np}1IpKqEC;<1uz9t?o-K z5EX+ZdHUS7LGd}vXm~RsX!2umetP4|Gdtc)!aUKPeudb^;1KBff#;4{_AAM+RF7zz zG0`lhlTeP49lRgdvG!=W>QRm-X0Nl_euhPaIDEIGi&RZ(-%k?TErr}+y)o$PtM)@(0T|e#|noLwO1) z)BKH9Hiiq)yH|%6c6(KE=GqcAQF8Cr4eheVp4|SM5IU?$F0bv(-};5lqUbuxtL}|$ z*ljeV!f~lF?Dzx2Ni77-H^9+05G5bBsMs<>ef?#Se;DE*JCW-$6Q5c0J7N zQ>_lDw(JdyQfzMur1##A`UlKe7{lPkPD;~X_-l~kn5Q94{8DUG8u8yFBf4wW8jV7Xi%9M4$+3<;Zw9II324%Utdn;NDMMR?R-(%{a$pUH79SOi`BQ@tohg&mkp#;&f1$_uVO0%7=?> zX6UD}lPd|`F(3C+2G6%(ngZiPKp^h>QTp$hhiaqSwdI*1*yKG5ntHB4!>i;{5%HNNa5ChD8_|Iz^|N8N>8Qig&$U=w8BeqT*7!zAhjRT&%@gjM;vv%9yH8g)MD zCHdhh#g1ltX}NkQSllgpI#O^;@hd09O{LXGGR5aN8_YOfP1qQZ_Ac|?-Q_`9(I3Du zn5xUXoBBO@-&st6!mrW{%!EIAIyz>?#BC2Fh`R~vlm>Fne?(s6Fs{80ovVKL@FI~$ z$C6+Q)br36Lu%&t*(o?#s=3C1#-F`}jI+i(0Zj3dAAWcK;vasBSfDoo-IP8Wp-84% zUoW$^~v` z?j$KTRrwRVerNIuHjj5J!`$uvLoc(|{ukbyAv&+`{p`=*2I2R<29Oi|<@#x0eO@rb zv|)_nHKOm%?i=sM%6q;kwCz~UgRLHZO_EP8w3lt(7gP*&<6le;2#1;iqV0>BQn~jn z98VWEzGCLA^o}yp{}s@8t{KvoN@oNp@10PGndOA?2B9nt0;+-xF|C0co+5nLb@foD zRDy22sC_Z51EW5=Y^kr9!Ppdr+S~f!=xq<=I!)uFv%4U>_Kdpa z98Z;hRyRbJU4<24Lc7*SPZjHN$exxTTY?;_vSCDu{pj32R^6BrjTTtD*9J}=#r?$i zO#8SMlL89uiK1d;H_VMxyw#y0zB%y0dry*dbFo87c|F4F+8$_Y5Q(#GDJMpdN+=bB zL!HW3uLf!mHzSUos|QQ>2$p^lp92SfD#Y5<{Lwo))PMz|zWDBA=LdvKrHRYmHMOB? zu`c3V>t6(&I#c^Skd_81^P2ihS`Y9>#u?R{061j92=@q?TL0)t|5^TF|?Up3*fV&Jb--=y<9Ps_<)pMucC z&RnS)G=y~z42I&Ea^LjR@%5nnsyvNcGY(3j%o#^-5_FRNV=wKfrHCTQjhXduU!TME z&@jmY=0B(>S2R!yW3l6&QC7<)f{vSAcZ?;>Q><#&DoNhPj6(xEb%(Y0uEU8BvpdFL zh_W~cU;Gp7+M^s>Q0O*(7td(*%$$l*D2NXZc)a~P-dXqZE_?jHciDgKF5g-LP~u-& z3hbPo$?4_Ufs=8&P&;5YxlYS75JeKud4Sido)1rLx)Ou*oR+XYpJ1Rx{p&*~QR<^DO z`#w&666+HYgL{k0!ATMjHOA z|Mz;ZDHr9W-K|@+oBQbHsje}Y#-g1XpWC~OZmbOlrT*61p-dr;`9M>ZE`8Z@E{8{>L17tJ&<@9pr5KEP&na2=!au)({_%8m*4)*@l~jrnV1 zkB)nbZ+kTC1lVR--gf8S1HRHjzc^dz72S}MNH;1G2qBp?akiRz3p{JX=9??ZZBykezZ^k zbSzUQYR(dq`p2Lct5`GY2Cw@1zHzZ%iG#<+x8Y(d-C$=^Zc5#f$}mL7?0nhdEx{Dr zbZHz+P(4c+zl@yDgC54C|LO4`eNHpmB7qzhvGB|%x>AkscAiN@9sUZEDz~i;EMoY5 z%XBZ}G{mdx{!^G-9r3l?E!1R5-XkSMB-A#q5?I_SD0P0;_BCui>JQU)apJK z(Jc(LlMz*%i5gA1wv(~H=G;*V+>LpOW*XUjx_)dQ-Kl<{6mGpJUS8YH4gY^ky=6mO z;j*oZyK6&mg1ZN3EVx^+;2wfopm8UJ#@*fB-QC@xaS!gA%i8;_bM7CQ-)dI9qiQ_k zCBQhAhi3XZkWXa(+u{AnOHyBvs3aN2_GZZYWN7ssc3JPj!2(++@9h6uO@16+emqs? z5J^zl-*_R0fC*r{*i;K(OF@v>J>Er)`=oKS=S2r1KRi#DjJR_M z$0RKEo-0g;fz68aBz82gnLA(huxf#LWbar_6WtY)=wJIaiWK)K$+rya_&)k0F^qFc zK17{X67fl5!hxmcLgw?BqR`Ah>4?C_BH&dtv;jxItaQrV_pGEb4IV0su*y6>a|r}v z)^OLS5RYm0hu`Wy_ni+Tl&4H8j-&h$493~{EO6?VGG!mu(Azc|MoIqSjz%uwQB4jz z3mmm@j89?tHr0v=PRV@730E8FCUQ_6d*nK4%6hr}9Q})TA>r>9ZQa1B2Z9+Lj%$&k zddXc$>lSxA=u;Gv6OUTb#jYC!kj`<;{9_IeXz zpV@?Yxobj91^*YKF$rsq#wV6CCIo0XYoc<)$`f(cP=Up?ubl`I;P^q|YO$=`Jy{Ot zJ9eapPUnjX8_{!{#fz+g!u_hGXvb@(hWV%>*W)`%1rqc>qkCEch9@{wQ{jd(oT>@G z1S3A<@&}WlZS)5Qvq9A(BYu?-hWbY@=A3rTY=&`3UC}lVs$1r(|7Q`PT8s3mH=c$~ zyJDfQN4?x9zktiUaTX2S3S#r_H_2EJIEa7|k^R+iv<`IdAxzqg)}Q>jIpujA6Op*0*bza_Tvq_7O84qm;-{Wy0)Y%5Mp1R?DkJ=H?1NgmdD^ znms#oR5lBHJ{adwGM)XiDV+p+lzKrO(~pbzWb^waWyHHmb{!EL572j}W_k9-HDk{0 zkjcj$;wrPgl?=Bd&M5x+ZE_p3_rWOfQ0&MWi~3WmZvKWf^6aM=0bgpoL^al~T{5-U zi`QKF69hYuzPOQ5mDm0IL5HDXlL8U3PTv2XDYwrPYYQD3){s=xbFFIj-Zv74zYKh z{#bHBI$qqkt{2!Xt1A&PdFQoYSsyw*pYg=W5qQm=vH+M4&0gR0YVI8bO_2RUnu(YB zp-Qn+$Xu20^u)+cT^?QPdoBk{>R3A#u!_nJJo-RtWwv24QDG$r!b8flmiB_nKV^Uu zoQ4se;>y!j+8=#H9CpfJ@VT5<0N4~IL~ZtU5kTE(j1x22G<71ij(kNt3CAuw9FM6Z zx2&3}gL>R9f*Zl+@5H53ym*!nJc5=7V~`QswYCb{W$0FitWl6xj`w;ZAQoTkF*Vn)=;dCtRW=0H5+8kZN3(nOwipANeb*YXZSm2N-JX_U$tp>TAoAWq# zkFe0O$fTRX@7=>y!B@x)YCFmkaI*aG9;xrox(U>_H#mlrDK_L(K9OWlJ9OWu|=nUP4u%xq39Oc$f*%3~bzVBi2_X-LIo8pwZKC`EuqS z5;v^Rd~RV*e`#}&^HFnD-PFk$NyaGYH6>$Upx++Gny=+lb4;D#@zn&>q|kLVvJ8{= z-TaJT5mycYft2hkDC&Y1ntJn@5l=rAJsvv);W5E|4kYR}~% zK9V1hENF5M$7avdhAIwLFY>;1YLmpgYiijy^slHT{qKQ2XCq~RLkJ{&y6C*~NE^o zbY|kMstIBP6m<5l?(o*h^55=gJu~K{P1j-0FJ>@a*ZC$-8S(%TPQ(*rI~)f%>geC2 zt};FU_*Zm{trtzi>7G&`VyGF7*dW+}osmJJ@2v5UhB9N@tMT-bb?6$#CsAb2vIHvzag1rKZ!U7rB?8aCb?(P9>Il%hb+! zUAg&GZzwza0ijiOSXD$nG?Rj>=R#tSE^J51-beSGY%Lpp=PZ;s=;4 zQyek<3Dyrk8yT|ol4WuN!!-;tg@|hfqZW2jLam;NGl#mW8y`NMtWkOWo@ZWD+zZ`% zrKoL}A>~_mqui>1STCG6nTq%pvpS?2W>TlPs5`veJ*35obWnMyI(Bj$$#{~897ErD zLuJRL-6eR4w6tGJ1U5);l-`(TNZFv#5Ff02Dy8DS-&+GIbM3Cd$WlCOoBNZ-VLR9|V~ghH_c?f)+25Pw<11>~ zlyti#fBw@NrB(kn)Y<#+1e3QmCtYQK-u}#EG?b?N*1ZYw+C6;dR&f9NO5qgdwy_T% zny9j?dJk<|Wp;Y=^kwiC`b=&GEp!mh%Jkn5Nn+$NlV~9Fyi5#5cDdr`ml9fz(Oe0@c$$4veum zW;b?jH4=kPGPLC71|}|l_aKc~Ff7fT;bytBkh!rEEwDc<>az0nxFep&6@jigD70@U{W7njoYU|X_RlNtR9w_?`nIygsm;?_uGrQ; zW?qr`w>UBKi_Y`oaDlfwF?G1B0mn|BPgwez|nC*m;^6d*ub+6Ou%KTa04}$ZWKUjjaHWTEXf2x#uwxO@+Kw7Z&F~Z&4Pa#U9Mb_^x6j-y03Q8GfmKqD4)H1I=KjY zDiD|Z9V8mmB`?wgs~l*Q81eI{7eF_q>pnVi6Him&wr$*DS=B{c)nV_QMgzZsJ6Nw~AjRdNVtC#up75!sjT<@RGNRN)%i6I| z;qcou&Z3@NaCn2Wq$ct4c=#`kPXju{^w>I^H(oWvU?HmlI*~!B4RqCBUM} zwdYj|%fHM~vR?7jk>G7E)@`NX+ANjC!0!xNR9D%KnA9i2ykrQ?Bv3iQEWaiC6HDr* z(RdR9Fv|Luc?xpq&WqhkamX2&A2-#;`E#)O0cZPdfH$LN)83T4D%+~fLAV$8V@X69 z>3t=<87(hSo>7)oRO1qrdCX7W4(&tU`xe`jm#VIW*IyB1E&{j6N>B3wyd^yD)ScAb zw;3hU`)=F=$RWREv%;UwOJ^gmeaslfLPG*89uf4e_}1-v@W*s{I`y4epRe}CuX~>Y z_5^c9JFVGI<)f{bC>qbk9^~1HM5GN6#eYzuod1r^gv#J16C;YP3I7d?1YQi=4|EMm7@Y^=+z!WjkjSxDomIys-#_8Y2x0!bsmna6vo%lyf7=V0WyCs) z0%j{yqGHy1?++PI;kSaW&Zo($*S3#|&4+xjO*t3yxY($Et|E3|47q3b)6W)P)X1w@ zZef0&!t+~7nYZ(EnT^@1|La$7|KIYNQFoIq9ISlU^lb*Ey&bNzO+u%Iuox3h?3@k$ z{zjcHFT&GqmF?M|>5Soo^P4Bgs$CHDY{qP9p4G~%>}myt!0rwtg@D}HZ-p*J;UAA8 z7QMJ1K_}KeRw0gP4rpqbwGZhCox4LAn54_})PYrieYqe2it!%Aanwc-KsfS|H_=ej zW$+VxbE}DP8A+jTkm-D26YEM7p(?8X+xb%zKPVF3TMVLy3wtJ~+6g&>^X zv|hKW^Jar6Zi?z%^t`PH)9?SNR{a@4ZNFoQX>p&LEbuYK)cx*7#=pU$wu!>FWyZhk zy{AL9ksG#&`h>{%*PF#^+t3lySLK@{VeV6|B4v#HE=#x9jUPa5LLkCX($-!FI= zBTEC$D`;GbDFO|4wDKAs$RgfZhLqdU6Szv+=tOdUD;NHFgc_g1ZAs0J6k0PJC0vty zc_E)rn`kk32lD{UW`7j29CSA^_`xKQsU}h(IHMFx&&1(rYxJ#p9cH1pti@nKlnGn0q%7QQ&a-e z>F{ror`7?Oe|&K_>dbzoMq(~J<=Wbl@%6KnUwC_*N>^f^B?-}UpB4~ zTv-C;ac|zT|CvbjEcT_Hl%#PKzt}xT{v>(mVEumV7Rd9B<+|4E3EKaGk7jMHn}ieP zft2r{?d0JnDpeE}simId2U%dFy=+u*ur)|0&$Ttd@4|E|py(=MWgt&!4}0)1n4}(k z$+L1Urtp*@cisYY(kNG8fP^Be%GltHNzil@)_GFIY}~7y@)Qy_WmP0S^cR{w&{>F7 z-+Vh61>vc%H6M@vF_P?qYIQS9efEeap0eK^$zQ#_v*!xflH_}I+t{`i8WkVE@7Cxq zvZtfxN|F-lVEq93ABmF>sw-n2unW}Kb&e1pud|)+#f$flZCHANLTb)2OtmzF+OH=j zHk99Y4qj*I_y_? zd;o);*?2ovZrO3|unMovgUrhlt>&FZiVBsyK|;QMJS0y}YOH zV#_+VlNTD6^c0|-5LaY74Sq@!?_Itc@qhc!zpo9c=7Z!>#6=c$S~KCE^}nyOQ6*Ie z$ODUmhU%1vsErjYecE;-0u;0W2a#9lyM5sXqs>Pp@zN_58TLh4V``aC;hsbT#TQ=w zW~PWp+~ih!4~Ckp4)OQvrXM!AWleEilWTACUCRAiWwYkD|B3jhm^38@nd*^9RV{uq zIac2;m|1_o7Do-q-i>?U09Vg+Rksga)3Y7CkJr=d?jti4QwKhiEifIuoNT_cMgi8Z ztwwAkjKqd60Lrjq;@NFY$ej}egdstz?F0hjXV}Mg!m|c{7Ht_n}*<)-`M*J z0@oy0Tw=!8rf%pBpY|S|QM@uNUIXC75AUI~ML0h!PfH9Ek!tQID`aK*^>-f=$EWOM z?YoGJgouyx@|V3ou=aXRsTY+m(><3b0px_N1}wYZHF`R5d%VP-OEIRuQLurb&BNEnC^__PwFHCNgoC==l#6 z?Ej%cC+Yvkx=eEdE%FcZ-{irI&(1?#6-glGprXgD_r0fxx@Qx|iO0V;L>+_gbS+M^ zjDrk_n95Tdo5NzEeWZs09{Tf?$b|zlqO=>fX!@vR5R0U4Qs1Bt_lV;MYem=-u2PEY zq4Wmt8+wq(E`RDQ;K)d2*O1o}R&S6Skr%^#tXflkI@-D$Ogf|+<@GTig77+iY@sR} z+s@B@DS24$*cD6*1#Bs$-2P;qr*NALnS0oP4gQs$k!h>sj09i4bg7@?A2rS{Z76`3 z{;n@j+!S|MyL2B^gaFYMxZ%obX`dstFZreR>pW$EzI=qK9_<s*B!~u zKjX)AAgeV_^|{wa@~9oOHz1ZfuiGr zq9nvO-ETK+z#1!CA>xX=(H(u@;Ixy=HN{{I_3RKpZRhO(jfHXi)gso6gtq>7)!@ zL6~DY22QbgbKiwLIn;@YP3T!NzcD^gXq0IO@`vn8xE@XfR?PNJ@(6`(CT!T$+t!r5 z&$d0H-ZKmhBmhNHz;eD?OSe;=BmTMl5yLU}7+RyX6k_N zFrI^2SfymJ&mOfX)}T0}#^zuyIKcm?Cq^h7NUkdUc6ryoKvLP~cJsIKWlhN9?;$1$ z@ZZt*H-ScpkhZ^}Ua0!&_j@x!_gQl?zuN)V!gsK~zBiZFU7^aSZxb|Qx@;WJE5g3b zS9^=7i_>HoH+gK3U-u#p!t-NXx@{DBZ>8uiZ(fbFl_meBYq+QU=ibI3x9FnN?n1~N zYpMYele|WHJ#WHR2*Pf*G4SO;3@ht-kB--}2_RA9rJlD!eIGNIT*z^X2fIjwz@zN4 za8$sj2ZYcs!A{J5FK`^OMl(6$g_V7XF#TN6Gr`G*k*Qo#MEgN3v=M*#u&4)~I%z~$ z5V3P@-u7!s2k^@-_@l#?0M_FDbLpZoNb0zu`O9_lvhuiZ7Ok11+;91d$Do+S*W=Bf z7}?F|+AhdiTO&d@o;;QF*iM~}FWL;>cpfXa+r(hWGmOu5DmHk=Z7mTL=eU9=$$w{< zFL#(GbEfe#?o$CaiOqI88oOH@F-9aA?Lms;)yZd}MTn**p?QRS(m5i1|42 zUNrp)Gv!Sj`kg@ZJ;75(B5|ldFE7cdZYfqJ?^4J;!^*p_#CJezJ^|GSxMDJ%l=`@n?`J&QColaTmE~q`q`{n1mJ= zmLd$AF8;0>bNHiLOsq|bPdWAnbuK+pM9)WmQ3s|khyUhwR4>N;s4UWpdPW^?Z$#Y0WIqiwbZD^cY z*B)k1tS@g@LS+w)oot%=q@T$YwA)$v)3bq+L?YUoRPHp_KB46hg04C`&=RfQwJQ?b zUUUgp*XF3b(E2|6PspGc)QP7dK#aQXjQ}rSeqWMZ@CQP^SV>olPQwQzQt@}WF`qlH zb$F7B;ZVI~ve$eEBMqJqGQ_#%<~UqcNrRYKq_Z{9GIdkM_i^ik5m~i&)dp(g2Dm+Wx`mMF;8EQ7Da$=WoRXFA;bPO2T@`^f)B@AA+mj?OBQVUM(PK~8 z1q@c=03YigKwJksmiWh~u@0gY#gk#_(9wu5xX*IqPUNC|D zs8Pau)_Fnlx&;wEQ8d^Cg1htxq6%`@<72HZvp0LoWErwW&{xb5yWuUF2qyVHz(~pz z`@@8d< zd_W4^@~f$t>a;o*dOJj5LEAA=r0@`UWR*g(1Z0@~$=CFKepIlz%=c|$6|bb%t){&m z*T#b)X;A5Gz?t@^{7+I0St+ipA^db9f%cgdQf-{m18t@~S~FW=smdGKvbtlk<40Qy=j(HtT4B7>^2?;V=;9s9cHKU@MYg3qK6h!(%gSNg@$2X0pUCe zE)KUvs=R*Mmx9RN>&%{@%mrKDpj>iStM0QtPy|<$iA$rE&cL zo=MZ!G%r}Ng7x9Z0I}%$=6al+9iUBwKl}UU(p2~Wrl|43HpX+x0>YmfZS(r}?lRY% z{u0G)HifI|!B4FC_MX~`aQ|fiq+w*7C1LjPKEjri;@C z@*=>TW|{g*O~7(VR}ti8E%V}s?2~o-ovZjXt`5&xrG^fh%gs2xkFS<}+R(7n%BU;iIdi>V zX?bY1zM!6x_c{7dGVJ6FZeW}4%$Edz4rQ#RJv(|7=&miFWqNFidq>xm#L(>!|h=1 z-Q5u>VqjoArKTL_D-tfOD&C=Sv$9;% z)#^FaYmAs^use*sG?S<+O1nJ@t1_9))t!5CvOzY7`8fVvssY|10icn)ueX1%#llAM z9N8d+IPI+^A(9)oxMA#~YHt~RuHR;+GajZiS}<}qEiBwGzW#=5T5Zb2bkmJnpd6&k z-@dFA4u(6jvonaLw9{R)=8u!@>X);?84jGWlf-3uvl9qbu0|04*{3(TamX#I^GiBu z?Q#~ce^y*Wh#~>quclZlC45bwfFpg_2oEs{7S}u02MFgtHI+N2;bMZz+#G;Rj4(>I z`}y63Meg-?)=u~)tvWcW`>!)i~QCGCrYyQF|E}W9+n=RcK*A$OUb>=sqjbeR{ zq&XcxMXv#rC&FiMVP$+ZLWWu><&a|*2cUDb!xyV+$D>5Ccs|Sa*3T2ipb*E0P4n4)gZKfL_uejvcEL9fjN5_TUEP5vuDaI|PX>NcIXF=>L#~%h z$2>l07zSf|ZJU0hMSP8(+U60g_8^-c-?v@U+*Xe@1#77OxR*Xb^2_E*f`7yUHhWLdcrB3@IQ`WC&6-Y* z>&i6ECV^urm_WUgy7MnBQlVUWL{pu!tT_o}jP2+nzP)9QKzY^eZIFeC@NVox%u8XX zqG|IK;&Y6+QQ-!`xyKU@BW`v*)qI$hXY*FbU9kUmVnie}(?x(NK-rKile(|Mx&_{S zzA0fYtWcX{(D{mTez^l*-9%yq*1AVwTFwPb$1o|3jQ*L*R_s_}PN1u-rq?$&_3<}- zO2?bY#C$f!R`iEhzd0wY0lfNNFi94)2k9Sh=@V%P&MdI}a8Ox4Et@6xJr=^NKYC2l z_bjVOm$$B)>?ahVJArw?QNsvmXxXTsJ&Nt#;;GisB79>#c!MM8RgqSYpat~aG}<3h zRmcR>)cBk~Vn)8s8p3~jp&0*1O@y5AMT)FlqdgeyVoRZn_v=6ms{ULwZFZ`j3~vFU zya5!SM&h%A!4?b3Fh}L5Fu_nwCoL|fOxV$JkgMsVr$2nt9$-$jbM@k|GyC12Frky6 zej7+c;P;Sw=PGw=wa{n<8-;R0TJ6)lA6u!H>A3#}Kb?@qyXerFj?S0PMQ4g?IT0MA zBqd0G8AV4bC13*4dCNHLu#I3v`n=yZaRj* zmzHvjoOpK?=#bOZhkxFm4vl19vaMCQ<8hX!OVEl3tyQgho}@>_C&Cyz3d3S__P5_~!orIklF)T z@BEuP>wHP4yo3OAH%X)fPY~0(r3B?9_qZiEa15XSDm^TcD>#p-jJjm~PwVQ=tMDKB z^6*>87fsb`9!h)}LfJ+3Gcq4Jon*)6Q6OF{!mlQxqI62ndsd3SeQTNO#I~R}Wkk{! zBpFBAW85#0D26IdI<5Ud%p4CGQ-d(sD9fF>!zx)LB1X;>NWib z^L)WXF?86Bsj|5MT)iJvMUGJ^pHW>shd>_0WDecZ(~C$MAVkuyUc*$tgI@N~nCt1= zm0#9@*{dT--}&S04F@GVcRqCOFLCxLSqkW0?IA6*Vz(v9?rY!F@DXN9*(G)YA*+T z1WD|(Us}gl2Br;uwjb^dH*NOvNi#!ZLpheR4YD3CYg^L;Jwr*=@T$;8e4j6-Boa_U zFKGt8 zzqDSRkU+l9{Sdt^WOD6MG{-(9cpA$&Ep|Ipx1Hk$n_(#}~n zXXX8FC6ar4LywX(7tw}h6C^ftEySpqy>^Gc$j>qr>;<;2OR(M;JrL|Qw~6x0`K7a_ zV_Ejvt@|Z3753B=%e|&%gUGbuBCbQR1ew=^gr^J06kpP~$Ft8@K;6yU zimFC<#J2gMVVjU{MTk5Fo{uK^vbJw>&vh>kD5(qdO{6uo%3qVz87p=jI2Mu^ejDf; zH`GdSoFEVE7FUeJM00g7H~s;e^%ZOeX!Gk+k^U0Rw^8$m1+E)~Q(V*0h}yQ+3aMJV zj$BLH#`tc{84DfC5gn!AfIw>C=r)UbfwZ!0SE{mRv69(V$YxC`2rb}#mr#^p6E^Be zTM@R*Y;I~o7scNQk(0X7^kmatJ+ag4D)@DI%78H7JqCJv@%_0vcNSOVukU@dmxpSA zz)V|JsttKe_#GTh2_kQ%>R(gk-(e&&T3w~gxZ}woXCx?Ee+#!5A#K<81I3Jum2uBt z4I}EsN6glgDqO-h3sGJo^&9NKe~M!Y>HnZ(hLm~`_M@i&biq|=1OiH^ooMPFj_|0W z0q8pTdtc{lP1k3?z@ZPg8l+9xIA_A+?S4zg-Q%w2J?as3uf7Ivvl6b9>miqB9bY=5 z!E7fWk|z#tVSJTjijgn*e0-A4>HDywBZ({x69}_w2_V|)c`S2W4i}4XypE?PcakE} z9gY4Jg)t~r>EA`9-Nb&9!jR!l8*rU1J}cR9Zc>c_pK zX2U&k98)gT^xe%0@tJ14V^DR^bAeCNO}TW!yY59IS3^I+vW@AJ!iH-g(&aY`h1CyZ z=5Ds{1OYdBHx!+6af9`J;q{^hn2mR~##QwO@zWkVBuLE8ipKPlwtH6rl0F%t5XL1L zCHj8iXcK#Re^gRQYkB!Plpe!QDk48AeBqe1J6P5;o*3*TS>=w(@E)$22wD$WK88ZO zM%*lfM5wLBO6e-cl$0nB9szb`jms7e(Dk;lo!_>U-y1(nYSAC}m)RnBKtDpo&e9Xg zxI?MbD=87Q@mt9`(?Qzy(a4o93cW$O#>&xU;t&Bei@mwD$*DLF9p@HBG?&%0Y_@!- zUnGOPpWY)M2BdEW8b00U>dh=#MqTw9qYbe)QC*CFDTMO>#@fmB{QZ>k_Nu%-2E&x~ zMpUd=^)Hfvn(1T4QV75CcehgAmHC$bQ|XP0Pw83ZRZTwko*zrJld@-jqA1Zsja$+| zbL^P`t|3%R4>6jHQQ`w?BE5m1DE~VQCUakw%tAH({%BGq9%h(Q%MYCo8|Noe@44tY zfSy+kHCv(q^|M4_m>LGyjX32aYV1^h<7t7#6o55ni1Bb981u7H{cL^T9b~n1vVTd9 z0dBCGbAAJY8TI8eV&(|?VY3))o^JPOGTl4i*6UZsC3|Ph-2%iTmGtSf;&{O=pUs>@ z)hwK4@XOJb?a-5pO;~}cbB%k^I<7qMaDFW(Tnxiw%lLO+;CU@tbbVM@ywLmK4#La; zckJ3=w~MzXtHF#(?Kwb}HpP{D=RF!qV}Z<2>ntJ#}kWN~AC*o)v= z(NVEWKa==5s-7~&AJs>*o@#4a33%!DrM7EQtTOW*Nm|@zVRQ)o)S@$I9rp*fao3Yq z{#5&|+T&Q=O(aL0qaLgA4|iCj;lI;&$5m8ZY}`$AhT!#qQ@y4z#NXeM6N5WWTw5aJ zBHMp!@mJJ&5!2x@hgdOIph*c2xtrY@2u$Z=v|ienxz;r&l;am+q^3qIzfRy$!-nvh z&0aw_8o=2xBZ!$Xqf%!yX%=9J6EeVhNwOWO5Y%EIsNj2pdlan~IEuGz7`{K&<>ZFY zvgU#`pEiyf?xrc2bIEz!I_BQnLT-#$ry~u9(DT}^Ncm)azaRF|Z!VRscZEV{uzTw# z#<&qxeJjjR)@yByumkAT3pp0njU}1~>BQvF0k>zfcidPZf)IVQJ>FI$n;B2O(@kdx zDZ`%!RYzaSCs2)Bb0Clh}U1==&L zbbT#J#qn2KnPaj*LlZGeGF0ua>lxotIVj}Tzdte=nmc!o*^d;{?53wfNc`}_J24rm zHu(!)%8Mc$HBIqF^o))LVy;e-VUI8O@Rt>K3(=k3MOM2F zZdpc2NZvJ=^{OyJovoW2?VYo>B0hO-uk%rDx)=KRzgL;4_hKjMFsk-X_<#Dv6TM*$ zB1?WVz*hkCmi{|HQ)Ep4QInQ%vNu({p$5dJD4rC7XSAC z+^4CngiY&M967xsBqp3Ksh0GcC$It6f2x;!t+6Ov}K##bG|cr3~cbNIa%6xT5e2C-K6Ac|Te<#LrMvgy!x~NaU)_omOcvF{e!B6D&$qv3 z`%!!jsrY@_9-q`4o(Sy~XN?ymYk%C+v;KAV7v~-G6vs;q8!&|$`od0E^dk_TTkSp< zSH^M4^E^1)*(jRuj6~gInrf!|35_4@1ej}Xmzi@n78YYNGubYD9;6>K8AD}tF{-MY z$7 zkrU;dLLNw%OD#)sTcuas}n=9D#I1u+VmIDl1aUxNP3 zFRBjc>{C~_SqyQ4u?gxEwElkGrgC5zZ;lwre_Yt?N4+A59>JgZ6Ha@T%lU_4s%#d) zcGRX{J=0@$vJM>^lW`JlZgJ4u)>1!F)s9wtKqy z-SQS=dFvg3@&!|S_foK1{L?N=!Gl{NON5Pe`pEE(+vL}@vscC4SnNajx6)&l1aNRN zW~lfI(s|Ym<~aY}(Wcg(h6=8OM+Pdo;cm=@IJk9-*pRQ(^9y0A8hk1#2%=H!9Kuhi zw&{A&*^yI`ru?fcO~0wgbZyn5g-uM)B|OU&*>F(J2W#hvd8GS<9D`dJ#B8xH3tN_D z2smONUkSvR61d&Q6ru<{u=n!vuWE+OYL5wgDtaDc*_4H^=)DQPc=!9zn^ZtX+Df=`N~#UQuS%c z@$HF)7%P&yG&>(faoZSE%<(EuuzIj;J6d3JC6G8ork7qy^lh25HNR%VSp&g8POXh^ zS0NB5GED9x$4)&(7`}c_#gH0#&T4k#>+ia^iLS;rus)JpIr7hpHh|4r9v!0dFKeu5 zzbVPo$=%fmbhUZH;tw-BJh(@86!_5`0c5+TxJ)4hio=mM)7|uL;^aX_9^rhDinXS; z4}$XNWQ7Oie1yik;Ek;Bm#1P=#<>$6UkeyD`NN(2mT+ zvYwk+c*BwTv~6)n^tTGxow+@ybKc{(JS;;+1L029dqQWQzKz<%miR%`M2&-@#X(JF za$){63u7CFIa+e?kx(=Qw%^NZmT$znWr~~#ED8x7jO*pKljzuf2$T$3%x3<|u6bO_ zwc(F|f$FcOfx7|_Snf!~s8GNw;Lu=?$ndy{w{q@DSR{l+zYts93~3XFE3i*HfTj|} zIDUte+tIPI9`##Z6vQYcr%zeVz!*2rxgBQSskly+{M4kRwdJ#=ynzAI*ZQ_h@O1Cq9<`hm~T`p}R z)!FVi{#`-g{v%U(T)+0K4#xuZRv|hL48BUl$GAh7;!BVQ^$Z+mN2p?wzc)54C5t zH+pAxon-KS-)_ZOM%v%_3o}y)oD7w3QESdDILVN@WDG*w1N_Ew$S(|P(T4Z=3-=p` zk82e0(-N`Vay9 zd#xFz{Ioy4K67n#kjFEhbj;R%P}**uF7hr0seLY+kQ}~8F!HSO6=^J)8MX><>c-DN zglvxPudS@1OdrW>tw^&Ny`QDAVsk&=Dg;lC>R$3y8qO2fT>Q`dv^hNbV-#Y%OEs-1KQoA9_wrX`>p zHY#a(=s^iI&8qaoWk&u6$(< z-M($10Y7PbqN%IMw)(pRE87@=j?7B|hMEil^2#6x+_1Gh+z-TbztmS3WY^?mX>)aM zYP;H9Y851J-~FZ3Bn!(iQt0NOG2OqaL%V$TIqeo|X%X*$1nB%o=7m<#t>1CRKPsmo#iV4x^dAu9*K=D6C z=Q#;6u9k)SB))tO&?QQ;0PL|(4=ib2rH8}5t;~AJ4`P^1QtygG_m1#79VAPqeE=~{ zNiKG`h|G5}KXjulX#6$(FmWj~C*FSJ^6d=`kbSZ|pos<~FuIh#=a7=sWyixCC!zk8 zH~sX`^-xO*2n8GQ05EVvji&lisel(I3RbODNcCHO)MW1uJFF2WnwnXCR@hvb^E&@A zQG53hdL`YeBSLIfu0HU-9EfJd-eWZAoK|535S(5QzgdC$bJ&jv3Sjjx(Tm_nU>Qw6 zCCGHRa7ApYLW)G_(LfN0aHN~gov%I-0S{q#M4s!aEEfE`uf6468piIUg{W zg-Ti{_T(Wq|6*oC^@z4B+ULmFEZ3)7g1oCfyhjOF;WX^13@T&etK7_ub9Y%$Fy_M(ooV0+QLeodL0{O(fZONfO+Y|8TW71CtD+UoKVtF3h`Jy9~!vjUKX z(R9sbxX{z%YygqEGHbp11B1jL-FO>=4E6&MU9F0ffur=?SB<*^5iKt_q8-l@HviF@ zC~o6c`ZH-&x-3=dzbxnH^Sun&Eh4p4=U!Z4V14|>^TuhT%5#2^AbhEU8Wx~e&FJ_u z$Wd*vLiaV3V_p9S-KP=u2{e_i_)1W^x*9u4Q|wS*jI6;;%rIO|VI9yqql9Rp|DE2S z9F^+Y!x!E(C{5L&mfEZ%%*1iDZdRDI(+vGD~Heg^R!keV!`CzCXUIy z{Pj@=uK7sO_r!ZLj-ZB)`Ok=YWtsHUeO}tT&bPDB->MuRxCV*5p@PZ0+V_-9*e0we zs^Ego8>4OcW_lY`x5RN%p>%k{^nxHcpkMQk2B$_d={wVE;i{k^xb1uM>5;}3R%4rd zRS=Q&7c6pEJ+BhnJTQdEbELp=GK8;yWAYfwH;d!Y`9P*_|0?o;(p`FFIL<(oL-e=t z2`8FOdlta|(O>!P`vs%b5MVPtio15^!b+i^H(RCftUMLx*8USk$Dj0RL1u|j(s%~} zRG`vySXsM&*&c{v7j{@y$!ecSeDD^goDQChoy!g`H$I6uDoiUD3rK|?tpiiml7x4N zG7167i~Kr2H8n;YPlD-u_H%}zxj0PcXhl^v7c!mu7VJtsrQenC6EV26^MnIM$3-v9 zmmA4p&|2h>dwe^kz4pyt#tP#8*^J1{ip0P&Kg#S&y<7VAjI`7El5+!M1~`Dst;Z>A z*hiE+$M^AR4v~JT!1bK`J2zf`sS0lqD12D z!2BAopMIy8tmVL&>*+I%lQNl^E~nbIjbZDNkJXPsld@M?`5ioseXFvg0z^ zhr7g$LXE?pUOuDibb=eDY~Wifm;^sfo70*=9Tik9a5O?Q`L(;T+Mml#nS$WAjec-3 zWQDT+IES0P!JSf-qQN}~!Pbc%$~A@=mK2?yg3S}Y5?I#5Jq;@Oy#57F$SRp~7Zss3 zS00UJW^o@r;}p(c4AmY3Y`e7x-+1DJEB{#9&7ED4J!zGp#I~D#Xh)MtqBC~4 z;^%cW7nv(TKAljKsO{mmsh-A^@GWTZX7XqMr!!c_zMh@h zfV=5y!Qu1)C;YJ;skfF)hq2OzV~C{qVMvXn>j*i5QCTkVFUS1<$JJZ5#ThQ!y0{bE z2~HqrBOyrR?hxEPKyV9<1()CicXxMa8iz)MySoN=Kg>PX+UH#72fQEat?^XdW7H7U zSMSXD2UsZI7SK;>JaU0L)=o?n`T&F!KY1n&bwW24UAo*d(QU<(&12(~l=VVZ zdhHvxA;wW=r$pDRdnv^CrvLWO`ZkTkqws(7QIJ~;ltV8a=*1_-*SMaJ-IbGIiOv+Nt1 z*mK_8aFfG zVPk#QKi>N7A9GUu>`bC(V7Zot-ucm|Kk+-2t!e>q$N;bPj zYK6XsPAb*p6P8t=mSA!$!HCt`j4WT%K$<$HP(w)}n$?#PeP*p)tzowA`94)*xE`aH z8Nw0LllC`S7M7dd3zvUR*u0XGsqwRQHLh$8(Ji!o77zK zxp>a+;Ow)zZ4oeF@r@-NN4fC~VlLD8d`}t2+!p);I08VFm2j8OlPvxWh48O&vBBcN z+ma6~QW0E*n+5e0Wf~VbAato4;>cRM(Mkz^pp!yO`p`nbDC(~kR)Vcz%nOy6l}*8G z9MW4IBHM=OiS2+0Sj^}U$|<4hIBskws8hd^QO+~7f%~LmM?+lW z`yVFnsbQH0|6DR63PT|lLbtgORAyR{f-}bI`IHlsm$+P!KO#e!FLQuFP0r;P4hk$vIVNLRP40Y@yL%CydH72SEP8MmwTXL_xy(4&7U234a7)cT4)^hN z(CakSsAZ}BA+uT00j&5xj8Rv9@qeCA2ZC3vgf6$_6c)l)cW=3$2sv%7_qw^a_f8Gn zK_?;2KBgO{BS*J$MW5&&2YZV!EQyEBS9(-Ji%FrJaPfp>|G33JJA8%gez1Ts`_Wfj zgPaz*I`eaKb(w!zQA!ASd_LTZJutvHXAUr{>q(kzY}6s%RW}L|8AS|5=EVPDB;n1P zgh(HsPH!i@T35VcH;MEi|09wBMwqQ0B9cck0WEU<+7}^PT04qO3PD;j$8GTejj1MgOoQKh0nn?u|X=C#s#YDjoXM#SSeEJco=Ef%7KTdl@ z$!~-tP)^O#t_qM+m>eFo7O}<2$i+6KJYOk*rSr3Syw#lf-!ov?0wM{4QqBS*pQ=Z8 zS^jB9TF>qPwN;JKdA67Qf=wc@hGCd_O}XaE%4ch%Oj#H;s)Om!`?PnEKfFs_VuHZ| z8U@#9Te|$$W$e$q54bj)mBA$-ouVGW0EZA7OI^|{I`}mf2I;|y5l%@DTp}7U6?QLn zFBt_>*I}8YQ{kll#=X|Ru3uES*299+;we9dX?CuxVlJQ$lGmrrwk(#rhxS2NJKh^; zSV@*^;~QE>rJxVO%W8j}4VFJqCk~K@gwvDEB)K{Yhu*m)(iepT_CK2)faL+&oaeTfNsnkRvdK($ zht%O8xjR65?YyDQ89;h@G!n9lA3OP|PWBnbB+{F5+cRUNY9|kosw3O)VC4*Q^bIXM z()-JsyTL*Y4cUSJ5y?)h<2-NM!T%s4I?8p6z$YKL2N*q^niwSV%2%TKIzF6d(e~5< zkKz+Vb|P-61wNHGdU3k5T%TIGy#?=8*H+GE`8>8cxwfzfJvuE|j+qpo^9kQEkIRKr zdA;0yg3nCg3;r)u1au}%iFAosp%q@;`1-no1Wiz$H1}0Il5{#W`Cj@g(OrEl!Ooq2zgQ;C7ctV zL=LU2qx5#{rEr@!2kk_*7iWP+Da&9S)C|3dukK6wzrJ3)O}4)bV=217{{eUlVKw>E zL@Wz1d;pIoSmly1@z>O&7IiJd&JLs9vmjp?#GMC-W&l2%q)Iz~a7vs6f7hCh>RABvv-@pad5ek&z%u2SpJ zR05Ka&4o3BdKurj2Ge;9eaL3u=CBkG6tFuBz0V0$@w+-grIwYa=yu7%4ymH|QGtCR zmsomyzad->=dSk6mv{g!+xfuSRxMI=c8yw>yp9oJFRbCBK^K9rmX(29dvxn_GP zAGOv|w;gWE1~U0h)Vt;*-W@iJcAagd-d~9oH)kV1MZ9InD`C>`CLAoi1XGp6;<|vZd-fPUs(zY>- ziSJ(kwhl6TQKq|M$Fv428*t?8_HVXH@4CmhIYrz?8h98WnVUdDf;b(I;0bjWhjRj!)-M(k&{EYS< ziustQylkW7Mw|>xvL3}$mc^*|tm5pu%y|}v6J|8Fon46ZuNoeF8o+VcUJMeAvMZxt zzlv-R5gzl)vo&>?#^xLJ1yCzeQm;1CFO`-F z0f;cQO%1*YTx}#0h61Bj>kD24v%xv4PD(A6m6rsqE%hYGBv}0dq`mb_N z>)$rHitgeal##%On`);2gF1vET^C!vZ)d@$Pj5#yt6Fa(Z(y(Ele-=2=1rG1z9d4l#+fJneM>83w8 ztiywWtD1*XFdA}DA%>?WRZFPMgYJe#e>#!)9R51PqeM~Gg(&*<=hEr;DbscM> zohsvS2p?oq#-%&-f_2$J_dEw;o)b-p%gv_p-7LHALja;Q@bA1K`B<4Iy0K;{!pJ9E zLeKW-oI-Hl#~EUXjsj=Wk5Wbe?{W4p&Btd`YO)YM2ju!VHp22j^gu((^TrC|bysUu z^5oZNGi?N|^ROK%dN0v6BK3X)(>}^=s^L(SgCZ?5*9}qPtKU-(PsHEfRh-gAO7TyJ z);v|eFT2IWr;H1IIsINL7rlvsr-FlPYxALafJKYH=!=S9^yeGw zi_J9uWabusLj^p`F7?Duf(*F2?)f>VNj|w;-|51n`Rfp@`Ui_88vVn0=qi>=uE%zl zSIM3obN3Ii_y7rg4i(TI84HqD{}Dv-CV-2C-xi6rpc(R5crS0U6RHY!k`D!S<)2)+ z7yru2iSzpDs~F2*f2EBh+my(b0Sf$2=qU-6omAjG2TTA``n=L+vD4!&&B*JI>~fHqif7MA{&8ZiwR1u0#th_~k~& zsNF~MUF_)tG2Glg+=2zW-x>XQx(B6=l=njWlL30N}p3F^9%(P4H5 zR)i*9b!lbB;%P?&*|Fa*)*WnEsX$>Y6qYQHirM{?Qi2%I8-L~zeT>daxEIh^s??zt ztsFtW3yGp>j`|Ci;T^kDxXdBE1W9fp?E#3Y7_k=wvLSfQ?B>vk(D|(K)<7g{E8b7+ zLWsTL%DeKrCZWap1_`psxytx3FD)`+mp!?`l8RW2+H{j?@rXEjzswA`!EL*G-p09a zRAQ5#Un^H0(5`Ii#!kBNIv?!hjc8* z*>EW~^FEb8C4yxyG#$yW=JNvi2-ael45~yHE1SscS;%-X7~*Ae*WbJ6b>62F@)qIJ zpEhk;aidzJsW6jsbns}483c5C&NX1C-1y=MRObLi85Qv4G+YIBOg0nXC^P0}@a`AE ze1XS{1QQFGhy)l8^~)+~3-YJ!V$-NnZ-fBn=g4CnT}oqgOOM1~-3udJsAhW469Gb( ze2Za(A>6URvG80c;{9FNW*X%Yw6%`1{l8oS&^EHUQ{`~4z3*q1yZga$qdxG&OZoMu z3C2Q)(uKsloWFj`&1DdEj66E(?EG#!ZQaLed(oS3J3cGC%iYo6BnOfmS`mpMR-d1` zHa$I83!Q)|eU3j4Dw+JZc;b;LU@;Y-tUUWTw zKLmW@zi^uqCpr1qWI;S#u><|9xAwtP$H=0;9`l`rM>#zh<&Cs^dU{%`3U?=uPsaPZ za4#8$^+mt6ZaQ0fpw;1N>2z3OkkTI;W6h0t=DeeK8xx)qHby|`wF{Y|iHC;{IbwLs z$hJQa%g{Eyz4GdE@QiY0a`9*LKaS9ONWvon~WyJ7;m&==ryQC1AqbL^EQkjCF|=@!5gVauYhtX)*Uigg%uJ_sbRWbDs zX9#BlZif}>HPwWK%2n|gj3?_f$|&%nYj{(IjGphCJU*zjQe|jFd9slj2XnGvvm|Y( zoVA+h3y)<-JmY9Io!Cwnif?6`wlEODRz%GExyMC7%!UCShdI8F){sDMg{UScB`EL5 zgLU6bjgVFgp=&??XuGPN-Or&WY`}exdv`EW+@kETu;_Zs#8Vks z-bci@u$BmnwMGzMr?qyz@q9m7{fr~JxM2=p5Qq9ju*;Nd`$aTWM%O4J{IO3)`9hO| z1S2_JUCQAa|8FqBQa@NO6$xQq4EwI7oava5^f7mqR+oF!89?!f{_ZPc{smo6Zh8q6IW|8aLcQ@CS&i*EO2Uf{?9AE9pak1Y%i zFEgtJoRN^*6*Rmc?ft`0Vt6TO*Zs}#rhr*J)pV&qW7RM2{dppE%*Xn>A01s}3&s3L z<17(UG|{gzHNhF5InoBeEfM3m0tqxs`+XtVtH~1SaZZb5c#|X!WvlMfb}ThaP$Vy;e|t&6_8lf6~ozMc-b zx^D#APA~fCar*F6NM^q<;?i^08igV%Ja?ex1lx7%SMP^RcJGf44TiiYW>ODtW!7oo zL(f*W!kWn`TzSHl>%;G`VrU>03y-1xK;Db2U_VCoHA=EV$*j}JQUv%+!>^mj(WN$%|vgUGPB6uue6tIr*D8KG#K!3CmY_?rX;dVgr;y7QL|5+S8U zU#kEjxHqlYf9UG_%dB$pf1v%%%Sth>`z->tQjxCp4O98iE#vGI8`%kA>@Cx>w=S6VLHN1x}K%Ko5z7x=zKf-m_$zcr) zS63GMD_Q^0GM}iog(=Hv5(yL+B;skb$dnE9$ABlh8U{Ra?jc9QZkED1ZnW+z*&9_TucOT9P z+2#MOpWgptn{X6ffBNwe3H)-mcAE9#^)_f(XX4#U1%kW+ z&bfKyaqxBXLNTl)-Ts_54`qeZTT;@ca3J1nu^%)Wqj2O*5hXIC zxcUe@wOxqk7|#OzAh|w00MnCuty=3gH5VJLeTfesTz2GOF}?5QMOppm@hJE*gU7>E z=X1N%cw8oY^m=Xd26Y`<@wrJt9V&k{U;~)F}w8bNi_(#LH zH_N3PqU~&b-;cdMQDL9w=oW?d%e#v7ri9ALRp%lnwi!C^8Gxu_HK~5`TisZP;~|lH zH%=G{G&m_y_S9SAYyfOWvLZo|U~w;qHqzz@tZHW|(kn=;%kMk5!4#8$4hG z3tl<%qMnS-`hz#>WjphkhG0DKhHv8u#_mxbt-pkis3H)j7lC+CCHpa7iH_}Xl<)d4 z7Dgs!8THp0R^K|Oj;THh0YEJEZzy$?#syA#0<1ZPJAYubYB=T3n-zm8usHhbEraRM(KC;3}!XCxT?G%338o9o{#Y_pPK?x%Heq~@7|n1uvwRQF%X_!=ig%eA5DsQM#bhG?#TfTk0hHYU9vi>7}5*k&syfAID0AVR5CBbQh2}GwW#Zk62|C*FZMC*br^`*nL3roBJMR+C3dv`0ApbVkWKOu zH@1_ek|JaW#l-|yStLR()ux^P#94>*W;(K`M4pD~orCK&4vSYlT%f{AqSb_<#ZlQ%hdk z1|ks>@4GQ8g4dGQw8Tt+cFi?(tKW+Xc4d8IG*~3Ez$7Jy zc%nhX&C|sqwwr~*kp@$6wKqpxNNmDpiq3%8qSt_SRDU2a>4$Xq6>kE<^XUXpl z64n8pw5?#~MGv+Km97N@10#^P3((Kl(sNHpR|G&2gQ1v)zzN72VzkUpI9Li)s@=1{ zWpfdRP1vtu?rb{tUiZU?tFi6u5G|s{h9?tXPY5vxPSBX0`@(oFf_z7vSk7Wz5gtS@ z|ItnZj`)!r+;gS4NHJ+Wv{`)+zQ1n-JT>%ssA=mRb7<^+5pzAC%NM-u!P9uWhLin{EwzR9cz^Pj|B=Y^Plls-`xsE218u~9y9ZP^v zSY@tsjlUwi@MB0#jW_l_8rI(#(6X*kzDs7K>c!P!Zhr*kM%=waImS)RUo9F0{xyB) z-1@ynzk6}37f6M#^S@aDT7tkPeDQeJsx!z_hv0F?t?={RDjEA*mv_-}fq$D#m)Z#e zZPahZ?{^iQ+TNLzXq{21Q}q}lbt#7t7#;>ky*y}tC$k2y7H}NcRs6~?<+LIT5;aG| z!@c{HP+HL_?@_Lhz)W^#x)Nbt>pbkffM4`15J(OS=(232KQXr=#t(~su%H$;1}z&W z^e%Z=djVU|(0opAFgGO*RVaibo3TDu#I0SGElQWT3-~HR_Ghp#f^kMHcOn+Y%y2jy zUtbCr(=V#}A~bmGHyiu=;J#Y|9&bV0mu?$GbyOaP~?F6DlesJIGa#MMH!pFJA< z3l%9f7=1K=d()TpyHf1#=)nScg2P#PQ+283)L&jT*`= z!*dha%g5MY4~)^kn~2b>^TK*$OXfDFwo0_UXt<`0?mn}Y`}u`qO3{M+ZCc2ltN9SF zS;|C$@El3d2s7tQH)|sH%ilkwky}%x$9@`q62UrEAS==aF)VK@mO;-TjgM;Mz3_ke zwx2LLqhbHO*#{0-hV|4R#1dp>HxjD|A&950KR#A?-PVV$maivAa}3HAooC=F9AQ6n z`B5NA?d%Plu)i$16kS|)renAU+859Km)fCV!`#U(3oTbwv!Td95(2#p7!=#QwO6~2 zzpkv`43H%y-GaZaM-FxW{?3uiel|FLvOpQQur`%SlO{p#f|BuR!8X(&F&Fc!=?lr+ zf+_f2KN1h6JlCH0!$-^F)?|o=YLTzmD=6IFxlv?Txv-Jz87o&^CwdmXO_Qos6llq(ztH0)#&{h2gwm^0qYQtZvk@39K zeURoZ-!5x5oIuPv&3zAT)#H^_gQM9B64p1xreI(up>a2u*&G^|6=Ako65+Wf`MX@` z(7m|EBBfT;G8Id7P{p#B{E%}j*j?Qr$3-}~z;nE3@K5cPsR;0hC<$@xvG{AxyY*4Y zH*t1%Bcy`jU7~o=g-hXQbj+Knz{C5u#R6B@M4DKBIUwu4k{MI4V8{}5KaO-_{rGk5 zrGaK}od^(-x0E4@3O_zm5E1EnBd`!7=;FKvc^_IZh+_I?au3st`{m)z(vm~xX302{ z4C-(qHb*qnk6Vp%wj)I$d&KF{AKVs5^^yf|hXBVHv9*}G#E#n@hz_e7<2*hN;PZRv z!4R)|&I7q22zOXmyPMDhHE_kJ=}0~JF*fRU<8!E1AsveM?x9kW9!ChDqHtqAJdnCZ zZi<(s24%3^^x6ch^Y5Wzs%%(Klg{+7d-q~1WJ>U6MfUDh?~k~z0LXIK5e3$vSL2`E z(q)NR8~fFdqE_OAwYOX$*W0CQ|FD^J{Qp7)8@W?mmt5n(t93zj)-=+qI4eJ{gQ{cZ zBE9751FA^Ow&kntuw^f=v>dC;0-eC-+8?)E({oypKW()vm|5b{-ie$lj#U1M(f!98 zz16l$!{ymzjrS4yDH&4hGH1regNSPP9TFl#_ouX$J_#Hl?-tlz3d&zCzqXUc(%UQo zsiT_Wl*w-`f|ld;Z8*_9y~>;9D$XBRgB3l-efGb0%)N9Py;+VaH;2l@FTbXpD;OQN zKNyqk&E`B}XFHlPRd)>1EhFJfvGD4PU+l{-J;N6PdWli|qec#C3%;dwDPCgW!!L10+l~H2y@vrg| z$6CqE*^ypnaid+I50ZD#lAn*Jy8+D9+B(u4dXG>$(diSCB^O4 zX1h0@OIoRtxSxwqjv`T6Q4W+Ocbzm-=~sWPK5tfcStvHbj}l; zI@mGxUThFh+`4eIv{XhN`-3O_>Ictb%VJ8;mHNHt;Uhb`j;d=f3pEW!_(|ch_=g{c z1uP>pNb{qv!cSxe+H&q1IyV-F|5%Sui%Yc&5ANKB-JyDKi!z+|E^zFWXWXT@27e+M z7e@a9VFmVn?a~seA?C;@irjI%-J~_$y6~=XD`Y$ zP2eW3O;NTUF5(Dvoo|0kHo~Qc^8P*hz_a6jmvZ@y$<;0Rm4K`02TLxDXHjWK*PNy= zOc3k4(E$e;b`o*mIw#fab2zq>^ek4`)we>isJ4Fj8$uK_!WYrqQ{lefxeLC!8kT06 zmm1Pus6Xl?^Ruy++OF7OoVtQprT)^)`5|C(Z1Jb7OI=ltB*8{gzjjVqs5z+A1dc3Pb++ShDjfXWJ4(8oidEh3+>(np;oxd*Ea0 z?NZJ+P+g{8UgzJ2%oCmly@r&ty9f3~_e+~k__Ca)Kc>305hYU`Ou`cFURIgrid>{_ zMh<7;qu$s~tCE@?ty|nO{q$M$_B7w7i9c?q`3>d~-uMFtUNScIuo+q6o(+}+A|xr+ zo)079mn-fdx7UIZ<{2qWr038-eO|HEqYxGL3%RtaEHOo?pUj~kL;zVKrh5>E>$lQ> zF_!4B`(&Fw*K@QJRNoj>eYs$WwwjYqZ#uy&*dsNLv7JR!$Rf2FOoW)zm1r1_RhOIr zHPhb?#eN}Sr_K4GIbb#au~7BY%D`>7%`oUM1Vsu!0etHT2OZDb(C{&2)W|}f zo?{JQzkv_6r*QRql{|o(em|fJ-my6@uh^1&M(e07uj?TjxPudbwkHFfxgi;qbww+5 z>5x$DwNij3V~3eyvm2t(_ z`4Yqn>d9wFf-|BIb1+&+{O0v0QbL|R?>}L;HcDXbKK)tq?5e%T$-C|>eJq%dy-fMp!bXbUqeansnW4`=cdHF$z)Vcg zI{~^tIiTE$Q}2!*_`bRU`T`A#z)GRhjdfm_DarLP5mBVaFeW?3hB%@ZDM7n)5JM52 z=srUdT7rg%FXal#JN!G+TGMloHDefg0JB^ z!v9p}B>!aTA5Mt)6{;=}9Y|v-292=Sd3osfJ$JpEa_A(0nfCd=OB&MuENMdbRDXG6 zdYo0i7A$++{XH%1yt!IEx-vSSo1Aa_J8L98o9cWF*4z;s7$Ev-QL?SiI~IOrE@_He zKYRU~p=x0wB+kJBD}T+C(>AOyPI$6g(3L;Ub0>y}myEMhmnUf>* zx(V;Mu||7I$^v77_p?eM{q{$R=E~}(Ur*VukLD>)_uxV0Ogtq14i@i|rAA~H^yxE< z3c)Y__6$23yCkiT<_fc985Dj9yNGH8h~*1-j{z5YximzC=Oj*>_$&`jU{T&!- zrA0)hh7x7Etf(u@XZ8#GY0$Z>_`*6pXhJn>27Zur&=4Dq5EDY#2s87#ho>5-u!$M~ z`sC&IMI2G=)pbmt>_yzgyJNB zJ#qgCn6)RGD6_e!$ezKun0!gL>Lu1RFe;P5#r zkG{_H9A<{``kE3T$lSpgMaVYY|BhmWmW^;e0vr^Hg=fa2&2y&Ppjgh43=l5{=H^Hx zqaKlcy9x;NZC+mIv5CuPfNRiXs4~BC*EAWbasaM{BZ(;iIucesVDz`NO>8`ONFszV zmA9ITf2SPc!0s*jO+n{34oE{s9WF#aMpzxu;i%5mZ|Kj%pvo7D@hiJ98dXhBth&fZ zvi<@Qv zVs4V4JU($6!ldM8k<<0R_hpQ*Q^tpOB(a!4xYLwL_qAdcr&ttkv9wSzs4V$ngc0$W z`X^5B%`cEx$;lT<5DAmfr6ynPaw_6AJrJpt7d^Gpz!tvAU;A6IQBLjN`7`9mM6_mJ zz%E4gTxWi9l$hVWfn;~d%TKZ`GL17(mlNm8KaA#b_icyk(@UU(0utEUT#fs`cyy@P z|JlEQA}M`of3EwKd)<(AF1A0-aIJFr>RC?uyau2Ci8Rg-Zf4#l){|TBEE-Dxj_*x> zBOETmV(y?_(LojE{9E6dSizragxS^q)Ov1k!X5A{52I|EGn_wu}^7d>V}7R?aE zxv>fN$Bli+`YQv z@hFgEVm4!eiH=Jv=O%yHQLuJ@pIqjg}G12GrI{D4auV+?jE zT<|5*T7+-Z*JzC~5mWtaEAs@fj^&_LAStuR`-yjVM$)u{hKQWc3$zCIUqMjV7LGBe zxs2fpToWhD>OAhcP1d>~4smpOpwb44Fxwb~DWdJ!pS5&l7(yhz)E0wzzn?otm8c4b_4Xhwd{^M)G!PqUNPsNaM^v?il_izUxY3WD`s-I z*QZwwrHHTT>1?BCWdipPd}}KO9^0D*rWgopT}633^B=38jNit}@cj{wQAoT+rMYKs zUN#95CuiZ3w9kpPaVdm?hVjZhUo}((Z54YbJkU8xXX)uqalTxr*kiRCj#I;fL}oNx z_3cf|P;se)TIs|Jxjxj8!^aJsd8^;j?K$q5tjIL5WDa<^$W3z_D6|9UHcQ)Bs#_Bq zk5?x%nfbkx#x){3`ImA|WqFo$`TQni zRyCt}nR%S8G{rSVHJkYOn1DM#x^H<&XJ9bB4qND6#p2fXHOd%z4xPkz_2i}G;p$+D z4Q@J*?6{`%E%G|s)mwe44%uu2DPH`qO~>2w3xH%_sD1ntkNV*~OzofH<5#1zpIJUt zZI6lB^I8U-8!oH&Exox-HKrMQa~=*C4dMYjw zT%|C;1oFavL`V8GE^h2>h!MSO> z8r8g-cs>s>=)S!8%2RfXq#EBhMsu1abItRjufupwZp7qj%Wkd(Sb^oG?rtq?cx5iaNc`n@^Tz<49(aT-&W2Lh z4i>yQtVpk0Ko1LpPOw)V$AsSN`woL&2p4l~eTpwtp5J#22`!HHHrQk=q}i0EZtws` zbjYr!D*_7%ECho>p*1PWw#)HKp9|Rg-YQqwnchW1i3Y%K0;PSG8UZK`?}e(+Zb zUCEWvooD(L1Y_}1cqjg1KggW}!qJGJR5ltS47N)cLpbj&)h7qU!o+`MGY5(J&?}?~;1-iZDO1d>=HEz36 zr+Z%GOT5U=ps^vwf%^HyB!*BM=YW|3N(HrXn!|5r`3UNPp)3Eet0D)|C@HF#`mZd! z2|n-42X_{rUpk1$qG$k_VrG+cj$nlt_-(KaocmMlM!#@j(l?8Ljk~F>Wuk3KX|XH0 z@)zge{{4kck0+*tiABG}Jds$JR5qccx6&)YP+RZfXMC`AjBu1%+4F8m_g@w7* zKB)TBysM)>QzZa?E(**vE=cF=`6kUT`d$P@cEYule!B(Rv`?U8e7v*~;r znbW)mr)sA=U&+mdpIyYXJ5~AO$1z)q6r_IQcydqdMnC)xt}SfB!bKHv{J>CI6MVqCR-NHaNQ@PbxyJdP3)Kcph*gikv1 z4l-<>pf~wNZ>X}SsJ|`Lsfrl0Cpb6r?#sH4mIeQABsl2MqPUjY5~Tc@^|5N~5~lJ3 zXF3Gfy9i}{{lPkSm7mLpW&TScZy;+Ikp`wacWZr?1+*8jT%?^=$lR0 zkTEb!e!w8Dc0|1pf4~wH?p_wLVWZLW8*0pB3XzW-z+p(EeME5l{Cfl~De@_W$(qvN z>eNFmY*eEdWal=wTFMD4?&bD{H-{FkO$;RUe8U$P9J^%J{~TuUgJFmYt5>1>U{7gi=rSvIqh2i+ZcdK9%y^6i#-t<2aoq{ln zrd#A{*C`6?WU3IjJ%)RKECU0DK|zLbp!FOdhw@#(?>mNoPe&|L+SCi!@Jh3=lY61u z(@)wo5{ruu8>UN*TaJ?=Hd#hJ>Fj{oSd`y`(x^ym?VDnSMLUIA1h!L}P6eE2 zTQvX@*}w!^4|&9`{5of5pVOL^Zl^u$~gd| zk}OdssT)ob95O`u-KrRqQJr};FwH1348>2Cyt=lGVb86^TP4OTaj}E}c*V3dhT+(i zbTQtC)=FRE+Fq5DkEKg=LW!M&hXhU_BR;qWl4Z7lx)39~TEsqYhk2;dgftc=QiDs* zS?&W)m(n6Dl-uV{&J0i4jC@L$XMgUtA7{@J&VRHsAZ%!ArZ^R(=jWvNcn&UtcK!M% zs?;n~b3af?r$3kr2NBK zi@TxEP<$!n%dFAQ>dxyxny>xwNNffE$Ywdy3fgaG9J~rOtbT-?3Mo#wVW};!WQ&6X zoc=x9#FDAM$2L{hLXg;sAMEV1l}JVI(5cYL>8ZVo+H(pqhrMbi61<#XXM09mS(((y zBd`BgJeYj)Wn(`1p$3krQj}NX-bgyxgzp!m zp@sDaQ~h(AZUw1O2~!X+-G{A#P%760A>=ccH8obh(&@ssw_1@;Hd*w-mdlG&p^<|G zcCaI`2(%WzR2xbRk3Pn8{#f^u464J>?~zGhglxRzam!_ev&*dUw=({d+#o!x>Cew{ zROOStW((j!=1OkmT?U=?czuYO(6KXXn5@EZD!XeV!K|YWgpGeYx^g`Mgs26X1TZh1 zHY6IM{T4Fpo%A*$P?!o*s}@jkTRfL+e?+T>VPV2|Tl4T^j-g`J@4n->zL&;O+#sTA zun0Lr9c4gE^uRqNHZl$RVIk^6PYWdrSpP{N_BI-O0zd3YL62HANRDcStWe3*{Bx~Se>jUgY()n5NBRh5<9$CB|6xXYGB}S7tB2vW zgh`f$t25kHjsCMMAO4?Z9{~olXBRFFQtFyKwdYor_He^Ju!<@5!U+Rs;uG!(3kP4b zi4GFjVsqAoL$OhhOy;^RTxdT(M*W<26whb{wct?be|^JP!T-VH#V?431*2MCp~@^Q zNNw{SPbbPT8}S9%o|witUbl;uZC}?w+d@l!>d$*3ADZ_@6b6UXVPW!JEBzuzW-?Pf zHd`kiN=iR_&kQ7~A4CNX=a?8O{;MnS*Kf5FkX)8WJomFRH9xV2iscjH2u8u-6o_t1 zDZ%R6F&Yn-vn2uh8`C^2lE*^mlS&Iw@+?$wV=53X_>}Cwi&tNxv2Qza#d>rN>~{~T{H*Ka zbK?(G^W%b?@kYp&b9cNBi?O5xWG5fWic#hnhVTsuSuVoKJZ?l(U%6txwxDzuV!giFE=Prl{yw=F_I4Z#|Ve95c{KyUCUxF@GhUh5D zs9Z7!K(NXTaJerMxhObkkUrgDT%z%I1N+wdOq zpF5fJSN)-%Ui>yFY3L}omagt(+UR(hqbXU=OY~dwA#D9Tqwi9FZhw)KG7p;qYgSb3 zX;TzMm#LWju%~=ffc@HbQrPIxtzD#&ryIU^(S9~&MX38&+pL?1=mlQ$hfQL7yTfzX zw@Zo7$LLxeln)7i19`8u(BiV)#_oRCe?-KE*ofjfC84f9E8Ab*&;pg z*k;G>*tTukww>Jc-sgO$>elmntsigAni_MAv8=3CKvi~6mBGB)3|U-w;iNo0>v{vS zLUpw>%ZaIT%kv;fgl&lp{I)XRafhEu4Hk1dE0{S*kplqiN<@>e;{s16Y2DhT9b z8%2-1OiCvT)@etpFq6MUQ`zZ%0~MePo|MuPtz;&i4^3!{j1cFf`WvSaqD-lW&@vuM zgDk=xG+5EVo*~wb20sU+?lw1lH0Urf9Re96eFJ8^2F~T0AWT0%TPWCGj?nMqS8M+3 z^Rb9Xf$;p>;Y=KX2WMDYhe_fuL$98T6kJfAilT*I8{}IcYV*1FpGXsT8x`#7KkB`_3!7 z3eK`C+U|bv%w9hkRBYM0!{EPy$$*UK$vgNagv9JQqwQ3F09A!3GH0b}PMdNfhi6maF;DsY2_e<*u570>x&|!qZ{3cF zKkB=T8=oWX3&@${KzKCAHM-!GVCxeN@v1bY?)SHH!_0X7Ay7Qx4^tQ$w7v_(S?6Lf ze6N9=7G^XJi$Jvv%BuvdNqP9wn;4?U+WEI0)895oOgb#;3wweN&0!$wtMVVl5>gP| zdEwIts-w!4Fl|`QZdN;FjpfWod9gRbtW0(l5^)r_qdGcC_OiM*G*+$~T~r9IvPtx= z=_z_kOCGLmXH_4ikybdT=uNEUmnXg4-=qty!{v{w&s{ze(3}^;{sf_You$mJ zK5Q}81I$j$Ix_7H!Qy4Zqaj?r9U8BZ=6< z~YfjQk9DXCz(JZldNXjljLafz&0JNksd!}5f;*^(n?m)o@r z-RMzhCs&f0-0WCK)64%8u-7L`-`b{c_xyb&;Qz#e*8_fB+FDvpCd=P&mU+P*n>Rv} z(2<1KF}h}p|6Nd|4d5vuu!F(T3|cP&orR%XYI07pG5A&UVbL&(L@}!w9186v(Np7A z8Ymj0){|zkvyTQF3pVg>iW65ug%DmYA~TY6$I?R^T|%^7Yw5Mes>%E6?6*A6foiB zSDt7;1tzhl%b-fuW18hWsSm(7*In!@wdzIPVP-n$TaD^f>?as!*LB}EU7idE8Df*p zP>|{RrRtB9eDo7j1#N9w9)9ziGYwsp!Q@?H+=nXV4>LtQhb_@qU68$?oj_ORkChbE zVYeOEUy`0N!HD&Em`$Rtn?dD@1?`(!o19%FyTbD9b~RvK3X>5;geJxMYanhB7^r2b z&9kw^QM#_7zJiMO1sgK0@c5M2E~bDl@UI5wfQ=yh-ERbCK3(J*a9-j z)m*Y7W07P*@luoyL%#JKG#nTiSZ6DU{PM;=Vkt`jik{vQE8i- zdIy!wAKNo9ucGv#O+h0ps<&p_g&3P2W#9Xv$2%4qCOAu&b;u|*5OVoTOu(ezYSITDA8$F~_z zrzfBLJGZ<0IXtF`M`cYZgeXpa`AK`hRLNvd@EsznAau3Fg6BJ!3fq_PZ@TA3h@q#O z7J3ijZd#3W8|w4XH?|mX+_@|*1YGLNYH2?$H6%HU640riWxYRju5{$zJUrrb(Y6@N zbDWlccIvHAV)k*=&{q$b~6?Fxl+DcJsY9$Y=m zu@FqlOxsH$ek~q2eGaT($ld9#Mo?rfY@x3va1DB3kPb2$E%XI+t1P{LMQucP<^Tfr z(LxFK?FBgWZzQc0;~;w{n0%q_`zL0ng(Wp&W6PcdFTo4~&~bEoo?p&#sZpKnDVL5S zGXZ(5AZ#Qy_JD6sJ7H?{(Y3cQ2XIjzc{7MBZ9_O!ZM5c%m0^yet(=ojiDu!ATAW z$;F9ot?`sd9?%Z_cJPZi(!7(_vX8&rgA<+Yw{9+y518BgyiFNP;e3!gO#H&mzzc@m zeV#Uso?UD0^=lQj8<%X2wk~IDOKqlI_gY1`x}yU+JlFo;%nVFWJl#H?u~r}wb+)K? zDA$6E%3x*HhgyF}*l_cEPAL`igA5W^r@x9{K=Q0Q`wh-171f)AIMj>|_rm!Ud@R9b z9H<|EVV`s5Hs-j{^FZ?J;D#lOv#@SzVV%5soHYo-6&9D)w}f{BJOdHIT7!F2K6mQk zQZN5c)qeqK@9n#M&+~OkUjGZwOEu8+^z^6b(-u3q(4%UqxugW+#lQx-^Pb863nHc& z+9MhHP~8HhOs_#o#}~#(EDDjrsc4O<)EGCe%=S2Hp%HN(%CS+!#IoQ{)IXZZ)o63r z7S|IYUKa9pHm-X3@9l_nze{)yiRr%mRU%w5Pp^vtlHts|_0>y@cMH1;Z}W!QrO5TA zD#d*Efugz8)O31(X;4nrgWBa_1an?b|Hl0BQ*Carhmh#+S9XW1XFTc1Y&#DRaUD%r zTk#)j4^ty`b3{xmL;xB-lI|1QvnP_kvKqeox{iq7h6z0=ulGpW$YtqhBxL8-Q)YgV z%?T1#T$-vfd?}JismG;<%0%xZ6sxNWr@AUrG|;aRE)cnW_2h;eH*WtKby^gE1uX)C z#r~O2#o6c=%=bfJ0(YEfFqt``I}&JO{)TZTh9g5Md7So-dq?<3l@eoDM1UBMGmzKaJ(JJAdB240K)4?x|LM#&os@ZHGWhqKESGAiEGE|6&*hrqN z1Lgf!C}nOB{sy~FBq_=bm*A~v#lwX@NQ`sx?u5?9<)9QMcwT26^pcOq6O_zl>WjhG zG2XZ-Z#k5{2_rk7o{eEGcMp{P^}^3tOX~N0IMpIM?Bshth9NuE{kXY4E%x<%UeSAh zn$7iPa0_8%%Rl<-E7Y#Adl7_ew90$LHqzR?q{s?cN`^4_MwdO%v+K`16vjnmm zH}zq~QMnj;EHT_c!l*WsX@TtMsC4Comt55!0{#6|eX{?6qQwQ+3O z(o+)vZ~t<*NP4VJBe^Lmb{5b?uXp$=|8;BlxkG7OMvL&@_pZ;={o&KG_!^KFZ9IJ2 zecSzX0EqEyND}`I65vrgneUR-JOs)Wvy2OR-5r~AGRt#6kW&0uFD*{Wh5(=fNS>K} zDu|xS%(yABPb}5PECki@9$T!MaqyD3Q$r`O9MmRNM4_e1+3h^W!pPbgxU8YmFcwrx z@{od1mkd-gU-2mOUgVKTiX%&B|Edhg5p!FS7nrLWg;F%0y#fPW-R}7j1>tC=HD~Kh z4~(osXZ-yOPLKd3T#u3@bz!Q8h$|i1v2-!PtbfZ>Nv;=D^>e!A{*RUR4ABZz@i*J#$6uQZIW1DO}III@m8k<07 zb-{NYd25>h>faqfGJAP*DRiO;&Opk8otgd{Guzz)Z5-taQ()kF82x<1 zuO$fu1a!@Xzc%`OM@G%(fG+LIZThpWKhWNnuJMiZ7I5=7)r+cD;p^Ud?Pj!{9a-wMs=JUj}4c}H_3zEOp zQXERv1gp=y@4%?=?cavm=-J0t5yqT1i_1T22LI^)Gy~#$j^w8}0lPh`bbzQc(K)8c zvUuK-GazG#JS;SEC~WoFot*Z^*|Nt zdKrBAbT9V%T+UK(Riwj;^(g3ZK;$fwMZFeL+K$#^WJ$?tBHsOevUGSz6(OB7x#r7E zP@?1<%{n7BXENaLd^$j%TYbWshB|}d1}iWe)-cWSiMYy%kMZ{zCg6OfzT*qeHD(28 z$MI@EV@_~(B6P2g6S=U2*I2KQQ4JnKbeLMBi|_<8XUDE9Jq{4cIj4$UJXv_J9SUx> zrwLmxx?E^Za1HfP&+dW2MYO`7?+&+)E*v)kPS3FIx{e?@9edcuR0{*cQJ6vSlB{Yf z!_bprU2DQy=B&XiVyC%?5`xp#t*bmn`&ar(pio6*6(p_714WDsie5eDMl~> zn$ZnTro{tW77_Hj+mV7S>w4OygHzoeUXk!|>C1@m$F=g^I9Sjz9Zo=iRpm$-8iOZ{ zr-b{obW5_OWxOLihtd|~^*d`wyJJ4zcJE^LM9JBk6-!MZL`dhUXig~^WLmiMr+3fx z-mbmRGW)P96sN;76zvH^k~kE_mMiF(3mjV_n99-S=K$Ss_trfREr>MpOi?hM$#-co z7W#U}O9UlHOa5b@%C4tr-MT)du(m9cvufDva6RiNG=k4v`cBOe&NtW0WQc!{ZVB{# zMa$S-|37bA5`SATGt}Nwe`}e1c^Ne72vH0j~INP|XJov%_By!eVcTD+q%nIQe1RW2GDTuT(Q~xfSK3?-VOJCl31;gI# zGyvUgCTbr8G?W#pwSR%b-iC~&$GY`a@Zi1%O1J)yuqSx~@7Pc+M7QEX7%H;NkU+`^ zw`w>M9?b&!vf}Eq2Y;<%-O*846Fh;msYrwT5B!68bLJGy@G9@eSf;_lrt-Y~& z-stl(vR6{mU-e99h*0TX0`N8H2|P;t6OWQy%+oSn#8=>0l(t4O%BOq;b?fP3Va{LL zY(9n5F!uM2L;MMIToN<&;LN6Y@lV@l02737d4tZG{73%wP1D9jA)~=L)$#CE&QY@NwhAoI61vxI$Db5&(fv7!;6qZw*^Nat>_7hZHO#@&3 zKd)IIp*+(OgU5aB{s8b@nxDGw^sEnVK661T39@pbE}#;Nt;NFy9IpkkfO3D6fpUQ( zl7kxYVNWam>0BFd^|$mfOUJN22BT;O4N!hBs&_`Eua8zI6`n}Q!RP?Xf_K|d25tOp z+5=QFeTMAWy3`(nbZf?x-pNC)_xZ=xMYYU-a zX7EJ_1(yloW)0L`tX{`4Wg~vk!}9E#@j@MjzRrM0t6ts0H|C!5FQR5Md`I(&RE=3P zggC^L;nj%tnIGb{Y5jGbUI%vX`O#ASI^OyFeyd5T+(NE*74gto#H&z9fznuGvk<4H z7nu@3E5ODi>RsC0xc)Kzu&*s_-^xrFG?3)K%RLF&Zz(08uz^^+LMu?B>cB0A<3(sJ zF0Dna*J#VZ;9D4iJ_Ge$Gxh7%llf-gbY}GVMdlIBF0B1>iopX1OYYFP%SRGdG#f0f zNl*wJUd~h61hkM~S`h&}1&#HaJ;qyF;>(dK`fuuZP7J))%mm^W#|H3Cd7gh4#p506 z!A&}=p`&ZzecYVv^d8w8s2L&fB&qn6FLUTaw%5vImR7BcV^Fu>iaUPYvkRMZO%YU8 zh4I~}O!-ef{LYAzpfsGW_R5X0y5CXy z{B{Qw4Irx?hinUZM<_B}mVQKIXVu zw_&{QMdcNawyVYcVTXe=Y+z)%8S?mV!rAZ{Km)0qxRHSk62NgE3hG?aR>&#Na_ans z{YyYvkQMAWLi^E?W>kJzzO_rPJ79 z5DTuHkm8MS-MBa9UI!=W7ckJ>w2*KgckY)`e_}5ef^(%Mioq6 z2oHBAE_&)M>tzimuCCu~=Fql6RNOos*)EN;a^$(Vg`5R_C62cJF}YQ_iE{CBLTGdi zRVQo|;_cfPPp5eI>kt4no|l&1dj+echwXI?*B1t7Y0TOa=(irJ;`R z^}8$L2EZud3fK^=H}q-vw$d_wiPIZ4ZCh%x(5{$e;HF?^+Xa@s95#g0AiB^bKQ5t6m7o$d_{8 zCgq1)PZAp#-nNFF4ftS&7#)b^-XptP)T1lw|Kfx^Nb*Qbz1H*TmW?W zH5#h=ubtkdcZ7u*h>8U3PGU1;#yMS0|CBdr(B*N+#)`?#rZwFZ$)vlmz%XmEBn!LjLaS2wJm4EwGiha%)|C_&K=k_1_}q|&W$m9M1p;Rqdc*A6Ftg)bT|;k~%V z6}FS1Vi1KfoSa1fTy)5ZTTU1G$m*!FE~85RCL5A0O~W(B(Dmza$>hZbU+WzuIhl#1>_cxcMj-H7_YWb7D_X|4d+tbdlBm|)fKkolQ&fuUuz`bSclJ&WvxHowjM zxr0rwMfu@)x~tHS*NaS1fxD4c7M`vjCe0ySyb493tELod!V!pj43mkS&(KSH5K0?{ znJy;_ z6i12FEhA+o+RT#iA~|o#J(IOu91VzeRS$ky52!Cd7yZ)@@S+iiBL0)TQn5(M2ERVz_F+>5XAvN> z!dETHjxIM(91k}?NWoa`zUKVjQsG^O+$Va3_cYIbSlC(%Z);67T^g1%R%8o~Z?WUG z&yHg30fl5QX=w0&lv*CLVVGAUJsUNus~iMk(`;BlJm?}Rev*e~5!@9N`6?mODIjO+ zXyuQbm+9scHCP$hgta8=#Lwu-4z`T`?@WE*L5S3Su-Zkd_n!{)*$koG3D@ zzdS^UU(yy~5eJ|@cr(nyJR_H_AM|x@8x}h_abE$I3M~kI1I8NS{8wIvavU}(>hvFPnCxzH&du^y^)Yn17b+Z-Mpv)? z>`0Nu?pBc$hNG6!@g%w+O`aF%FnC_nj{vitJ#IxiIrFzsLeK@5X|)lWQ1^jFNsbj# zt=(_o7-^-5{%`wn>T08PxnU$=WLPPDz;Qv}S?~Leu&x@}?yed4Ewv@G|0{DPX}WRT zdL8XxR26Yw!xAuemdIE%A;>XF4A3$v*5Gd@55M&6e!QTX1rpF&$auyQ7?En{-wMo~ zJ24B)AGBwTS-m?J z@_snFplxtEI5PQa7U>ZCv*u*SA7x7V7$=d2Av;M;-gwYJwOV=~;x2`{jz*EuT65$|L$q0HC9LVoR6p4iccNGK$s2|=qmMg(i*?E4QqaSTWJ7; z%YTwI)!EV2ua#%I5z%Qz92goNVCTg0x|~PGIr0oKQcmwclzaZm+xLe;fE17^T`**` zb6$?mrX)jdt?H2*9BXedxYRjQvsbNR<6%X~W}J$;&Z;|m;LRkeRFv+{F5+%q#iYP9 zPUHDVR*o1Q!pq$!sYkLf)A(sdTcQgomhz=26C12(J+O0<=UIgM>uw~tOq_XCKWcit zP25dfrwJZ~$FP=oqtoNbw1%gcuQt8POh<%gd%%C2O`l`@zZ4e)t!ZPO{|2A~0D(V* z+cE`{viB|2)PqR2_!W~=0OvC`E#$K7R{eY2m41&gp?S(v{g49$eRG)KRtjq))X3I#K%`RQ z;@pdJ{7m8?lZ{B$ed&E|W9J00sYb0O3H+W>c&Mb~M&N{GH8R{I_Pz!&e;c97SLJ+e zOcM&Q2X_#RT1pbE>~bWm|DK-bIp#&{I0#4cZEL?)V{4E%NgOiJkRq$wo+k?9P7Ra94ToS;r9M=0o-o4zC?vV=Yb!znwSMTb!vC%eR8E+x zk@lBkfI;-2izO+82@u{_9&LYkmu7_R zL|9>cgCskxJJfiQi#GSZUU48*aH~k#aNHDp5(?w01V?sqerCpOI8KN))QE$e6{+D< zH8s`3`C~jJDl}_-cw#gHdpG$v@2*M9LOa+zC%NpkCJ>jYXXuApts{J@tv5E8TGiiG zC}O2LXobq7a$gTEeqLd}M|wY0uT_x>*nnm}owbWRwA_fJhmFM z%s?8f$EfO0b`T#_qRwsB@y!F#coZDJF@`e+__}#Gk%#@16%pp{Q#@NKkrN*W*S9_F z_{CUFSJE?&BV0?+Av4)Hi9K5!%b14U2MX@G#^$DcJX(@*56KETQGLPR4?`aKFTa)q z##b$&sN2G|aIKV%_};l*nfGXwDe70z7ODy6A7O#hBb@5I5x5cM#`uvV3D#0NFsFT~ z^A34uqu_K+sqoe1r_0?M{@)Zd@UMnbF*lrR|Eu8ucR%r?mgyxyl|JS7%Nnj`;*t=D zzU|y`TAMQ?PC;Qr}R2kpB!c| zlk>GCY)C3dp$XSeR-OaslHQ0LWb=eBxpwR1PA+nbTB)JNCHnnu9b&y^Hd$(9EY&rI@eLSC%^d~H z=TNXewLg=MU5yaq6W71+@ro#3%dC2e{J64zbEm09(GfoCKR-(bEbLgOsr_2vOj**p zqo(0zZ^%k=!?FDH=?BHTN_w4B@j!pl+5Xqq^jX!C_fPRSpyjemnkX%nDwRtH@GKidzW-ddr;noq~?oAWs z+JJLtds-Ki3Wl4$CoQH0Z_o6DX(rSmV`!YQeKDVpNQf;0q}AIsiE>qoP+ZrrKm`+f zr%D&0d6Lf*V3oeh%lo7fO}GoZ}FMfnk72=qzBH6keIC1 zX(Y8Tt+Y1b(Qw5|`8!TX3XUYi5aar1%JQZzodb$#;WZ?vS=dr`n5KPv4?mPxc^koF zm*iNEIotN!aSN1oqKUyb7MvS7*8j+}^^)_%B<{XW!FX!*x}(z@>#|Le(4)z`t+ zAK(AkS$@yxL;s?a)3Jf}KON>c{`2h^eKu7b#bHRahZ1??b)V<)d$qRwDG%2h6rcPt z8BCbFLJZ@zto+6g5ak;>ik;Z4p4nKaiGG+(`Ky@jA8@^*rrg3^EA#KF2ptJgpuxDL zf@7&lT5LT$0G_s{zZ(=lmM_D~D!U@6^>Nu2y#oNIq-#mZ8l|{QG!fPrsf%3+C5EVp z9TecK-{;Q&A*XH`+%ZWPB=Qx4-08H=c*W0K@C)^}V0nnP&2l#6@~w&4D$ctQKW4<^ zpa}FZC+=2j96qFKj*1o(#}_M3vZHrs>adm+iv-F*f@s{wh$B|M_9_wF9t*xTc)abr zi0*5ntoBC45PMiKO;r{w%7!i#A%Pe@hQTid!3oax1K$37yzZ%!J9U@V$sQAAFUAyv znW_5hRX+A$N2Y_TET;UlfDoxDQ~vU_^|28k*lDiWRnF)F+%QhO^DO0wvtV)WN$t)O zRTncnV+ft44&lmpicQs_S*dIzg+-Wq;~>8{Wd$x-S(OQU<>Ng^_!*h$ydoXUeI zWkJ+K#prfQ_}6&d>}_G1aJ0E?d6&d=dhMyn#*n&qWZj>ZE@Dh-=WFzuo;N@t#2_$xy3aMeJGA_#n3de|8(%{TM@nx!5@7|2m(m3CqZ`f z!AG<8HlGB_vI%$%ANLuGD&Mn0#M;X+HNA+Ygc^v{Re1dG^1PR)I^Ge3?f2OFzgj+Z z1lW2P6YQ-URnGFt-JweJiyHEgx|tyoB3>pnH+-f|a3Q#!C_Hw{agCSb$csJ^2DwN5#W5z~c^+O1_fb%Vof$2~=H94Gd4y%kJQ1O3wuZi{E)<25h)Ke^k8rnW z3dJcxIywie7X=lu6TU%70*xGHEPw&0@J+VQu8$+rEUOSn&ykx3b~T{Z9==}2B)Bg{ z83qjhW=s}$i0puy79-fPMmFpAY>x|)@D(n1k4u_$N~S0Fu}Y8EGxmRNe+=gv96Kv} zb(Ga=(6f9ftDp~}Y5AE|^CAH<4`?}vM@8f3kpIIPmi@AfVF#IEaR;8^O?FKr{aG+F z?_}P1$*;nnWJ9ladwsETn>rq1*PX4IB^)7NojLn(UaX(x#Ao^{OlRh{BoimSrm!*C zCM`Y$1sjO!3Ac02=;EiHi7XKxEfcjEqNi0@arXN9$Flu6Qo6QZk}dulk+HxdJ#Kp} znxW;}mXl(XvJssYD$X{*&}BJg@NswDw4B(-@dKw%pFSXS4ftNN5NE1Xg43kKGG-)i zXQ&t%Cy8Mce1xfJW$jP3iUBOOH60pI#) z?_3PG7*3=uVt$AFxz5Sm}T2 zDR)Z^7nyYGmW=MZgz-(Xim?7<*B==Ea+879b!#hegkC zt*j2F@O|wnSI%Am)tSbzl{fw{9`cY-ou9d3r+w+j?bVt9oDxZ@+sOB-I9I90+-ik{ z_xwtjHs4MdX@i!`?7|3s;1~x7X?UQUB$8wiFBw0U0>hy}qJ70eBF}{3Rt<4rQ@l_V zi5-57RdLIx03{H8&)_n4%4UP!-(Fg?Qxcmxs)?mV=Mf5Tr2k&-Umi%^Fif=8k5VF}=I%T?eGf^l0(bt<&x=6xm z__RfRD6mBD&B_aJ6VUE|dh<<;nWDE8_1g94Ha#4zz5s)33Lxo4%-LOQv=HznRm33p zW0t`dX0vee_wC)f%MjKY!S1?Z@PEg6GPi%w`0wQ8sQ*CY8=zBLtZL-f(`~#2M?}jX zP(5>OI=n%57Xd6&7z|v0HWALjNr<<1HssGrKft!)TQ?;SN_?k(qdE;s6guv6Qkvyh zoPkSD3+W?iug2{O7^8zB)LL_M&4-|3gVTXE*296E3n6IYQ9#ac>HCWd@=ENXjJin# z&kmI?FSF+1`EiDcRt2G?#;u?&M~R2LLx$OMkiic`FEJzO zA}v_#7r9qY>6gN-J65YtgEDb{_{cA|wxQz%UD`Lve6i=K{yaC`Ncb2G{N4aCVxX;4ox)gVR}|Nfq`Y zOdl&QRbm@%Z)xUdq0P;bm|0n{{#rBLB}i^A-WDUN9>t!Ox_$k@_|mRfP}8Nno_6dLK!@4w2lppvz34N!kRZRiI&oJ4@RUt9ItxcX(-~3UJNsC z1SXopTHtNcq{?gS;4S6D*KL2*+EM3r$Kx8|yg$t{z#-H2@f)-hpg7b2X?Kjl*)p_H z(Noo}S%Cs@m1>Ve?AJ|ppn#ZI?-a)E^^%BQM801k!ld-b%t_F-Fsk{Th!^xc@nwn< z%a4HS+2V~ByBKW*{iEvS;|Zzd_*WdVJk>;elA7rP21qN-RTlGuQ*B;tiaT`IB+7&Z z-TxdEX@^7na=277u~=#0sph%X;Jto*IEzU<8am?vM(N2w#Se97xtjf$hjWg?ga!CzbjQY^8i8*)nOgQQ7e%qPEw&4?fcvHULvkaI{CQgpj*gceh)&BgQb2fpFaotuvy*`@g}M>i9-*!+EmkHTKe6DX@! zaLyny6HgzL9I81bMQ<5i?$c(#^IU@$vQUYANiNN&!f#cTUFh#I&h2O!FIE18WO|pj z4QF?57docrtp@bTU4jdp(T~~$8m@nF*h*%WCc!eP%4x%RXMPz>-nP)ywEgHU6pV*k zA|c={h%*q4qbeLGw_h~2h_(bNA3B+11y!y8Rad|zna*WUd&r7|E4 zc+o)6;OmMg4e)mUFS(hNiJd3reW06gtUWU}sTTh7Ge-bl|0$NkZ2M5kv?67KbZw(B z>pV~dh{Cgb>{)UyNl{cQ&(+;0_t?D}&8+j_0$E_TCp=Y4qv3*zoEUxUIx=o*9+w^N zv?N3Xt@!29vI4Ng8e1ITQnD#F@!BRHmG0ASsf)+UX_yW?Lif#u-0tbE)^OT$LctRT zM{MoESTNn^p=xVHWJmRECk~Qso0ioFS38A>^*MV|Sd8^ElLY2NC(7Q=%l=L|%GE%G z%yt`Bk-wI4QC#9n&7~n&_fPNKtBlcD(VH#jZ`=6sZ(wgGGrqPL9ky8VQFFp&H?rHQ z)Ibbd`Rmg(!K6puz0euEO==4C9S5PgHgF}`nd zk_==vTi)sW>xymbHl5EOJC7Ig@JlXypTwMEy?UQdAL00}CL_tR=U#1hp0%|hv}yaB zCv|XDk{OHwNtW>qpIYp}m(IgEfEWVvO!{M&8Y}z795``uZ>rz0U)S`V zT<>?jueN^-7yb)!j)7wA{)0JV!!%9)Oot!DfZu{aR!olq6j zVxI(osB}P#$8|o1rXbNP46A;bIQ-lwKg!yX7Zw>8kMw|4KKo%$f3vk3X60Fc)v3?+ z8dMk}M98vp8PL~Wv-H>;gPYrLt8ofOf%)?-?_L8!HvqUCT1&TjOAlXAK}L^j6`y>> zQgAYN5g++2d>ocLF9&oSU`{tI0MXdb6Y$fLV}&qVE|l%s%$wQ=(!&7MTe)V%eg#am z?qqUD-M^2(V(zPRG~~UZN!EoC48fE|F6x5FMMqj9^7T;0+hx5Y!GV;;NxRN7I@8f2 zp}tIY`=R{da0ya!-26zpN>%&d!r|HM|MW+d^4hzzTYzaaYbggA{wv)WXYi z4;wci%qy9$K)Xevr%@ZefW;s53M>w&8^qZ#Lq<7O?$)}ro5{a+&JpB%-Uj6a_4Hoz z@`p9#k;8>S*?kW6?Q|0QQ{G>?SGfFd89nJKk4qa?<1eKx(uKR2%_}uuW0&wR+S{2&me049QdchXKS-t8pAMFC>L0W(tq7 zN3X~1>OZ8&T}xbUye{LgVf7fRVHBI5oPIiv>lk(1@NBdgQ53q3W)xZcD2kHpbde{Q z6)qkg73}S2MR`Ah3xkvoz_N_ml65*epf^=?ac%`Gg9xv+E|4%XD}RvaC`Y=`}~jQU=dq9S;`V+htSdO$vcIyLo_ z$Ts1J$4W zBot0X1dp;_aCINM4Lnw-$m&mQYq1snvebd(Qlc$Elgoi&BG!Hh*F=6RR-n3*Dkwsa z!I--!-W;TUe+S}VdgGrRu1$Q5Pz)kQs>rEi6*|M+{nO!d<4v>@)pJbr!Yz@t;(LJ8 zti{M>g-qB<$)PHu)Ap7kmwJdi1_3-L`ldJ|%rHAFcq|8=UcFc!l0>L!aDX2|=c*{J zbi6jl*D*(NjnOt*Klpm&55#Q&f~L|5GFRgwk8co{sr8MIPnL@`WR=oyoTkrdAmhIA zy_t5fAKHah?zPQFv;2f^&#gGhQSy&A_5{txgqcw7a_NH3ccx1ji(q=^IZGNJg+F}? zA8>j)7nRmrCWvDDGZHkAV+-n#sYU}GCyo}xD}hIb{AvR}DWy0#c1Q>hpC7>i+&XB& zYw0tvNK@wbw`-@66VD<3nnfq<7x^9xGy5$LrBtb}f48p>+xSyB`oz3ED}@>APC$$m!mSk0a4sy(`s(&E~c(~n%gqVgv4 zb+yf`&A*xfxy#YbO4aP>z10-S&jVZ`ER|?Hv*d7Xj!THl)&QMfX8zkipv2k9R3O> zeQMLA0}>7>{{5*@1Ryk1Nn4FS`O4`t{nHDqCa{wa%Ct9@g~GkI32)!%gDMqmOxR|x zPp(0fF**GROlGKBy>|`chA~oY6|VEWYkgCR{Ei4##v z9kVB=IoRe;BaYTCj6W^LnUJkjAH7%--xDy$E{wcAdQ8DKGfq$i7xharBO@W&Uc_Vo zEYD}&&ywdjCe&%F_5QsRIwi^ISvOdiCN>k zxKdTpdrYwvpx|E3qg5v=At-XZbH>&m@=2dq1^@@y zViO*P?B|LVe}CaF?4T;%z%u@+3p+7Jcs}(7PMUR1QNO|smpQ^OPyvS{Fr8}1;(MK- zG7p+x7jr*IR)js0z|s@!a7KSp1kAUp`cFEN`S3jsIwn$pnM#y;V?DEgV|s_&MB?{w&#KqW(fZdnRt< zvd`yiXp1hu&rTR&uP5H}_54c~OqwO}T{re~foJ@SP!DU;HxQ#*f_4{A>4k+bgMu0p zkf20!!i^50;2chYHr3YyEGMAwVI|;@v3zurE2CBadl&M(x1amIHrDy?wej{B2LAKC zj^hD21-l!=;#_TZ^wZ^DSXw=5&|@W74d`XtN9Y8J+gPYJ1Uk7|mw!-H(E;R9h|epI zj$w!n$+BOknR(6}@j6 zibKV@M{aG@20wZwED19~%qNe(=T}{Ew04kzk_Zltnf%akg4f?nN2zIJalHFwSl%5n z6ClGQg)sp-V?BsdB71)V99TcLkT!Bw#b7J0`~IRvb`m4@%9pB{v z+kH`@&$G^?1*qlvB1>x^XY*_vM4zhLyohn~%>`kJo}-hsxGbl&D2i@Vm&exZ(NFCS znHj?aVZ;BAu6O>=Gj6uFW83BxHnweCv28nz&BknOwy|xev2ELplQ+HhzMuWm`!}55 z&pKz;tU1OHMzB{w?j_AhTF7nacS%go2~1Uzvu=IE3XLSMH0C0)%@QnEV|EdToTDBx zKqL$n=xhaS(^t~)+Eu~ydWoirzsT+=aF};!_{7! z)t|><)N%8lT9nQP-o|&aEZ-Evxw8-1_eZeU+1P0G;-ukP=4|gRUnP^UJ@f;!oq}a1 zcXSN&w42UcJ23tP0=DhNybBTV4LY``+R!U(5{1v9Y>AfNR_g|MTT3(c*BkBSIXS(G z(~HuY0vQyebyABE^WybqF(pp);pn!rdG9$}C1h4O&5tAKHH zq2wP_lgoFF2mWn#koL>Px*Jh_TFI08T)e$Rx@zFMO2!E#=AzUxdE-O?Z|($l;nF%GDgl**?@jp zYMCE*zUnz>bAE*@k1^2qNnhWn?0<)0(6_aT_CcKFt+RT+1Qw7h4Vd`$x z*<+fQ;G$P9353b<$hYwnBSBQafgJ|6X1?dvV&JL$gPrVH+PU zw9HyF;V!{qJY(Whih0W1yJ}K_(8eA^fn)BlF-9#{OQ7^tjMLJbsPd?*p(E!xOiq9z zR?lS~IF2cICwF7(l1)uIZV^Z*ZQ5Qrb?Ka_$%5)t_qR_A3~KUQOO;Y0cj3q~i%KIK zoMbLDAip41&;-Hb9B(PhYQTUUQS6l?Aimyg?kFVOBQXy>*M75$u~)~&StrBStijOe zNu1MbePPshR25xxyx8;THXO-u3`yl2+J<|Zm>NHnnxgu`KJck`uuW+zK;G~&N~%wN z2VAjRz#m9IQO9^Of`}^+_t~5Q!2X!U{#{mM1KcwkXP;UDD`B*Fn#t_HXs&kcR^;mQ zRfBCX*)X_Kgfc-@3ga5x9+uxI_fUIy+SOU|y)u5>Y(xvHygLj<)1li@s)_Tam|V4O zS0;-VBY?!N!M*;~Wz!h=jN?3y!hIIHB=3~&n=ANN*cpoemnad~66nBOvgpvGQdxq! z=}AL(+geYSq7(Y?yX)_Zq~jRu#pgStKC$0jc{i)i|KDH}0@RxNlFp=T<%829~QvkD3;&0*01f!<+b z%mJvlOLZt2Zn{>gPk!Gkjl{v+lBGOM+6PO^Q!-0P>$r^2UKT}rP;xb4?sFe#oFuS4 z_VkG=jAo2?n7AQLHldwlsMowW758JwuTajt{-eh-#X?yAq}qM}~P5weQ3)A5h~|NdJild+4`I z1B;_GMkY@5xk5P~jB4-aYz&TpRgyupAkgo6x!B2k&HX0)7SC;YdBw$}O!=m9T7uoBfiB&h&)AO{9J4Sok(ajN|J+MUkrzGDDk3?ge%$4Qqhr^KEPzjUM?!2V|6ZaOWA$pKmRpQ|aiFBx**e8F= zfBST0@5e8nv4M-$YG+^9uCX(?<&V2IF(EAD`Ma{ku$ZDCqOnA#P9^LvR6FBu>5rxH zcVhLY<)sR|>|O{7en5olo~Oex9p~x@q*Onc9&dQJeBi9bH{l=l!-de~3dr0M6xsg0 zwaXbz@#M099~l=|qL=lT>aX zSW!gC`!(LzEzDbLSR^PYP1J!r(}^I~!|yVc@kJPG$*L#^ReqknHNl=e*1#8dZ`+32 zJ3(As=apm1&8SYNTCX5x0%+}7g=6&h^NB@EP!DMpt+UD@>0qL{>PvPZXZ_*9gmgct zN7oTq(xmF%&C|AdD){h4CDR)V3?-4~P^>Sx#Uwf5jvRJ3l4G2CY*R2LD8L+d!*!tS zmm^s&XS_o4_i-tWagzDt>_5Z#!V-;b@b*Qq;}o2cXiFu#hzd5veZ&|dZ3aYr^ORnH z#@G1y<8F(@ZNf9A4)}eY+K7t#%{O2xg8RxxCHFI~qn`s4LH*`M1KqbmZ!5(N8xnW@ zG%0Ni?;!)N)5cQncajH=V3(6;rl z7e4`d!V693PP?{cPIdlf&bT|<5NS9R6%tWLc@t9O@Aj6?8E(rO-ySf*Q2ASJ26pG= z{8D0Spe+8T;xBDKYp%j-tG~+e!fC(2{&XoDJn;7_7c9(H85a4%W}<@tCa3ee4oITF zjR=A=b%e2dqd_Thr+P7?~n?jzZqx?bA|c@Nf835U~o3#2v1dw?w7Mj z?msyGa#@+;FV{BcrXkw;G<&e(2<&3-eqAdrr~uh)rnuzZ(@ zfJ<~W;Kc>YDf&?jnn(^@R&$<&2Z26=a~$+K(2jRHjcY82x&Ry(=@0Bf8=dUFl8Y5S zmEETGB=9-$5B=`4d|hSQj3>>*Q^chA_=Hl2_zfo(+N~IN9svIE4mS_G2hGC{NMs0} zanY!QJd^=X=ULJ#f&&^yS17%f*z(lM4iw!b^kqlQHY<|Q8Pu4tan%{xADa?5UJZfA zdm}sdI;XB<%SKRVO6FV-M(yoHF>VoVc2&L-d3}%T_PdGE_gu*ExoHd=;FoZ$3|`kL z&VF@Vf#mmf1cYUWphpjAUuA&jies18T;h3ZYjW<+$ShPcxI1-m_n#@Z*z73oWv3A( zc?{^3kw^RWc62$CK!B8c@Mzt;#i3~3>X*j%^c@WeyHoL?{k*zItiaIZIv_T>h@p9KJQ9z@}G`<2z+a_iW^Lxth*}Q zh>ve+j%R9pF1TI#?S6CMJ#T~k+P582&RM=c$-6%?T%aA{M;J8{T3(?_!&jdQ{St&} z4?mB$=`&A}LVpWIaZ5k04a4AQ+ekEwvZOGD$i|wm@*}oO8MnB5Dpv>4 z_Id8&H#`%Lgs}EH!sw+M5?y>~;^|}LkcC_U5Xn!$1O0`6*+Hs#?3;J=A$C#AG8BEC zpLK7&5QuH2U4|M;%@BxH9J@_p#@bTTOqsK?$d+9Ok^=&Sr5pPbvK`7gU4TI-hn`7> z6jD`B>gpGP%a@%%P9M338aOpmP@Li2!?*qw6*G@s%*+$9(Bp*e$&a8j6?zT@TsJKP@ zuz&7(T66592&`Q@V>KRP5W-w+%<>SwPl#dKT}~|&qrnMqWqgZLD;Y`AFxVvS`Upld z1st=D0*9OxOfGIJQ6CMEjDQ&tVZ>K{!TOq)p}^UQDPH!K^e_ahm`GnCJ@Z?{D!+@S zC+T^sg)ksk5==6Z06MZ(pG9ew8M5RZVyw(KL%sHYe6Iql(t~_}4EoAep`ltdbEp+0LNolQefe3Z;*pJL5Y9D-y0m zA`rvRdYGY+&?w|v++X?~x$IKk8&otJ#lVo=HbXO}Cts^)V7!(@5Uw~ssa;B>SCfW{ zQxF-p{vO~Lo-0`SMs-NtH@oncEk(xs&XI+A)~l@^L78`CkE9bj`DCn*!iuakmbRIr0%5x!09+3W?}qUKn%! zdd~Mc#uIAMgO<4B^=kh{XJ($9UI@uLG~xAD*cF1mmwP!X~< z@tUjrWmWuo74t&(8kddI+3Y=Em@s_mmVz}Xxl-IshRo?#%1wfj$Q-kIlSgNa92$3g z5!1xSVh`*rw{aTg;ct~y(sb^|X{J@^b_JkQHsuxQqdVG;JM0?%Cf{uI`lQ2-N7&fN`2)pw;xail2yOivdgAu*r9X*Bm2-qm`F;}%~k}R zk`QTd16J%P9;avXL#IChy%NH8=nhS?({FwIV5RfYv6oOeCh!O-k*BlkL#5enZI3-` zgKs4xHW^`2OOL)7zj|`TvMzHNex^+k&BDNoHo)ClSyRUm|S|rZ8aaj#{ z1);*H`6mwf*61&o>yZ!$&;)FSYsP-(_mDTiFZdcC##irAuW6!x&1kbcDI&q(Ib5bs zbSSSGHY7SR9X}!B7-(U|%v0Cg-NUOtH6OK6S2QR`A|rfv_x(r(-cI2|td=@hDO;$Q zeM`HQ;y>y?PquKHfd91zQjh-Cw;kL%SpOF7_-4R6CSNrCA2bw-{1|W*R$dEp2EwVY z5ywOulpsrP=h}ipKs-T?NcrpJFaAP7FFJGjG)wT0hWPC{Y?kRcDU&jhWZ-~`tguL8 zU?Maij`&t5%Vh?%^nz1>45gaCWWh?o(9g1TSyl?u0XIn-5_MOe$xpDt*GcDj6w&c* z<5$m($!jV2M;z^bo<>Ow0QKdKYpCEVOs72`QKgZtMEcy$Q*6ibu(N+S)2w}Mh+Jie zmY~3~sLVId2w9mFMtU}fITe3p$-gjfiZN09l!LgNhCz7$nx7^T5riAoi@Ry=wtkBH^HLQb zx59a5+oli3dYRv3nQmTEmjXXm*JvSdn6}{z*y!*ER+qxLDb)S+G`^^f{poWz$z6Q{ z5P5kJb{jWaBKYn$`Cu_=_K4Pg%(Z!nDZXQH-2c3?5@K7;xfnhF&@uiOlmlp^8N;j3 zjS=^m(95FA%bVT+b;7HJ4tlBctBQY4WXlfpIzg(LTuk1EW+BjAU*!^Btj{r7t0@58 z{2r|Qjzns2{W@j^n8=;Bn|8V?$pLWJO^NEF?L~o7n1p)hIckH9UCatHfjLrLo6pA33Xz)5LL zSi$oFs1&H6yvI?;o#R(A@YPD*9^)W%16Ls?O= z@7w%3^4|7*6)oal-fPYG5aX_1KIW|8d>KcgT~Ck4U>@yxXkdVe=)8n?zpd1c6+93G z6+UW_C2}JL-rh+7)~TxJ)zJ!(W0XS`#k|)V{i)a9pYqsHjwo3C8>|?ha6_=R!0|qs z>a8}!71p>@R?hM1M_;>ooEA;!LJEqHDarjvnb03c+X6-bt7AeW*o+Jf>eNxBL(tB1 z^*TS8cwtazdM;}uxIm4EiSEX1(|Jv)KirykS{`@dYj&CeO5PQ(f$RwmLX!k?e(PGMa%wz`dn>rj6bE}8wWEGfp&D! zCT@TUw%x|9!>ZJr>H(na%qck6Hg}PcZ4SKrgDv&2#d9y4itgNVgKqBhW2Eum3x*Pz zt|ppPwhD8a$Q$stzmtl3Zoi2;}$bZlwdHhPdCW)jc8Uyb_Uo z_@F|xAJO%)ELr_`KzjQxaGJ_#F}C}!zNPZm_V&#Fd1Odb)lTHbo=2QqzO{|sHbW!q z(!FL3SiTN+=byk26>@a7bkC^(unOF;^`PdZ&qiC?QSWlu? zVRE&WoihIjfo<5dt9)lgh>* z&&zrUh7R)Ku0(R{Gpg?<#Y`K8*@RFLEOCS?6@aA|O<)^iEQD{SIGomy7N9~N8%m7k z;modZWTc9NPM==0MxVsP{exoSHv`XcxV9(U9g4|p1HrM-?8VnYmO){N6{G6;fq~)G z0>kOF&(n6FDueOPwzTWh9o_gWa4H>NdOgm25={4J3fak0{^JZPK>r(??0#~B2@T4 zLAV>oHbvLr;qM;oVKtqO2!hp6dQbsO!DPeDhE~O(c#posm|Z$LfekjZmAAE4y6~s5 zlC>LR@>$+PL5=&!PbsOUpjRJa#Tc?`JA?!T?)A37-$uU|s-mR-3hV3|T8*N6kpFm! zhTiR>tOb2Hl3@45(?1tvmt4&fVx%z5mg2%JTnS8g$Y%qM$nb6Ez!QT?{;0YOBQ+=G1pO%6>N04KkhE{%Of?iNtRtb^q*op}3_6wB(}Ag9$gzgK z&PPxG3N%_9$e0JM>Ad3&{!;+Vj z+_!kF-}N`9GN#}BMp(j-1bdAT7-u_#9`=Q#TS6A9%GO0#47}fUw#mw{2eAzCY6r&Cc>ZF> zBG0U_G(xXYEu&d8ldXc(F^|mZ>&Iozs&++e<`khvz~vNq~P7QKl4i#tG*#dB?jZ3IP2 z4+^o4*00E?8*fIuon(X+(fZo2* z`*oV#a`L|{fbPu@$NzJ-X8$ciCCoKN{{xnIjDvT-EL0PT`b!WfY#lPJ$#u2#L{o5s)&H2e0rn;ucTFKSVk>FTQXu zR30tFUE@e1+dDi>rIsQYuj(^DdjuDcA48WBA&7E4A>0F%tO!Z|2gNP#WV?O?W*QjG za8A`xULf%nLei&Xn?jI?c|h#h*Rp8ynVDTX5GEy_`lLD?uPC(E-Q zo@7e)N`^DsWr*#Ji!VQu*=&h#=UYp5hjn|+j78XC{R<+>z(|cG>&DP*0{#4WcYJvR zxYd(17wv$HrPy?vZr->APRw7*C$V{$Oj~kVvG(_cC~?L4@BM~@??$QLk5Vh*zGj4L z`L&w3U#K$$U)4Fg-|3O|6wf#&3B#iD6uXTq?^z$1uFD8;y4}5hVmmn{fw~fx@Hq&i zQyqrBUDH9l+#S059*IBY{)(s^C6RN~_5!$h;T zWQN&LUlrG-%IQ{Z6I%^nb-6Rb+*Cx8_mOGqsxsn%CM#ABq-_xNH(Yg<$j~j7QFDw# z;SHN5=W3_zgHZn|Yu$GKWssn5o3h;)PWx)_S*9^X(vp@=z!E_;O23Xo2|VLo7)dCp z=cQ4A)L^^7;N#in`xThx|5;o2AfJ|6qpeX{ZD#lXN>vjgkB8HR$0x)}URjTpLs%~i zqJno<1{lZK6D#kMLV1>n;}T3;bMD^Uq&YB)lEi~;dE_^kfs(S$J+R`Y&TaL`ido?X zWu_78P*M&w2_Z=Hl#82G;P#^U{35|NhN~hj$5|2oTw|6c=g_U?0j3O^+=^cS(!17P zrXpdiNduw=z1L^ourQ6mSImxI%%-6hR{%0g!xj?MK4-V``TMjfN-q{0h3MZw@9>h_ntt#Vf?>Nz- z`d~p5Y^LH23$QKWq)eI!rzJ z{@O08RwPs@dh}PIRpVyT#oI56Bw7LPMV8uIV*5yA4n%_6vrd>m1ZSOT z{3?sdN4cw2dIz@kx?bqG{ZS!o)E^nTOb2ous9!K_d!V)P`Jk)oG;RB+bU(x0{kFMGhMCO=c3`d9?ok3}a#~yV#~mqz z;9^0fTh+`m7OXaM+hN|zqu;Zc&{@ZSovj3-ZHL(}J9dAbzVM$N>xV;x6L;DKmBvLWOvuxT~=76y1?KLahmb_awCn&!5_rL(};O2w`AS z!gMZ&swZ7+Ng;^y3Jk4Dakcs@8_W*MA5w2RNmM*U-Z>EV&|&?af{Cn%XtEZI=@&1# z>rm{DBW&;Dc6wt;G&U1xgu0MQDXqq*lNZ${QsvPRsly6zUaM6u|p-6XjXOuCd z_iXlxjX7l1xZ0Gr-D9_eqs=<5w_j{WN5*LjU$Y4-v@Ay~P#fe@Zqfo92^XumC$c4X zfKh|_rPR4I@eJINUl845_+lC(H~YJm(YgIBo)I=OG%SE>b|@5*f=%NiHShkgt(1S3GEsYdkAXntL|>_A;5Q$vq!K-=*hj_7`qIJ5rf*T6*c zuXqsM9|V}FcTvAN{H^S{HYL5sn%N~jg!DvuL(}Hy^%&#e)nyY4c7etlNIW}>*_T+h zImuGC1q>w%UBwx5Y(ne!(Cj9)8XMeW-s1-HtJ0Un#qQ_M#ifhJBnM8$I-4*00pOfW z+~QJ;N2-I+;eI7tKdOhsXqy{hX;q4c>3n)$fPO8%@YiHB=-4i^<&e&k;?J9t?Ja`a z;?)kM@@A6>VnQt4ER@`usNr(yJv3v6AYM}Iu<2z0Y@_Z>lh5qWLcf*H z&ll|Q&prR=2NJ!Q|IP}={xd6B^r5%;_c(L50}bAGu}fa`1>7eC8F~iWJw?p}VFMkRSA1`vJQQ04r7 z%JD0I+9dE$ks~})+toEq<24!St|GY0z36*gl;NL&zVInJYxF7}HuemaG1OvkqkA%J zxs&9Iia4Q|`<6T#{tC_+6_lNgpuPxf>bIYhLJ8;l?u|&N^Ms9wMx}QR6E7A#k zRQ5$Zx4g{Zgw*oc8w`9vkp3X~$7`8i(RD%eaaps;znR2|_)o_yurA@d<0(HGPVaikWSRnaJMrYS8ZL`qI z)BKl8QF6m>VV#f~USx{v83QFM7pg{xeI_(-tqv7CS-ZzCzT6TC1CwC6#C=gc z#S%ncfcA;uDFs--z`8AOg~5kr?t2NNW#0N3z8^jA+U89$#rf{I7g+AVTK4g?gvQN} zN!c)O+)-ZXtN!YW44OOF+Yi<{E-BSGC$NMOmaR507J~M+w30Spv{AJszu(dbZj8B$ z^5yYDGgCZ-v(6?4JD|7h=z->s>hG% znI5Hci>W<>fk2~9koTAM03|P?6er1^Op!K+fZ}+fGvyf-a7)(YcJ#oQzFt9H3->13HASo|iLO_P@>QsZp?8;7k1ow^k{mrui)eS4Zcl+y` z#K~(W+cc!Wwxn-9a)4+8BUq1`NChA>>ZPng2qEsvELTea+TZ4ET%)aZ%U=EAVxOC=Hf{++A`3> z{i)#7XuoA(EHz?AL2?SOp~AnMKkRKdG>QTnathGB#bcte0ukRXehXw&$~JwTA6+4J zzn*3GKfqs1VgxQJR1*65YCIBa-q^TJ)n=+loaG@8QA#rPsc09QJ~@EyCCjaj^Sj6z z4dp1~Pz_=d4iUvq;i`c5j7Sc;z9Oyd+*Dr-rn==&w^n!|kaKdvS|s}^`2^(?+&rZW z4fI~6yW`;CE5*SJ#sX(8^5W!7B^~;V6?fH#;Xf#({*v#ZS6pGxHNu9>kdAj{- zen@VOu@kBJNGCy3m?g@e!%~28iQEvh8H(nR$}yx%c!4$8_du)$nTg@ zvwzIoe=+R{`~`5xH++5am<0bJ{Gf{?P&c*xXOQ(_v8lTGaz*`Ywf%|i2EsNIBzun^ zI&--@lM-kwUo$zcPU0|Z<(JN)UV!e9!>Ra_YZ2IXUUD`(pgr{{^Jl|xVkkk&4nYpO z8_ml<%5Whi6san+;OqEY$*+Jr<~@k;Iw=y_wE*cM%P=px*0!begrsU&W|b%m9$)vt zhKd53Jtf|a2{Pt~$-0E=vPNjDgz`(Q8hiKhQz+!Uwp!AWH3#K|`)d}>b4j+PG<4U6 zaLP}QY3d$Ph}tW?k-`QfBkyczCCzL3;O%v6A+jke4K#VY_JcEmy|z`4?5tf`OcWDt zdriKv{H4K(7&j}j+lv@9ix*YV&%!|7{Ka^vzSS0WmNah$SZ?)S6m|CV+ds|V#mU@Y zk%nA;*RuLh?MEV8 zDXb|_!pB9bUMoBfEwN%Y+-0Wc;~AGlfk!SrvtCWUP70}SZHoJW#q|Yd-LcDldE>mG zF5nC@U`^FmrQrc5UQ^R4Vu9o^DhTEfQb@g!sIr4zYAEAv-Q586u-c1x{SXUj5=B`6 z>We6YwyBk$;c1!L<59PGuK5Ezv!ZR%VFJ6*UG8g*G$?&j_>&r{a5?IyI#}OC?e+x# zcch!8$3Z3V{TI&m1c){ntvLtd*I&FR6Fe2p_Rab_{kqMNS^{czjq`XHuvAZz51b#= zT2$9exy{*@=KSTpQx?;s$1-%HSA_=|$oh*`iaZ+qVk(&sa_Eqcn>Zl&TssT7Cqcrt zw!?3@ad3v;QCDawKS8iETU@eCIK&RInu6$$=mW`sw z-ppdndaXB-h`YM0L-6gRnaPIm*gS%+t9YSYabRToYT&27MW;Gg9HZOUky$r_y92n# z<_eoiqwdp4qK8h=N{x1F?vQM&u54*c4##CETj5fh0NVT4yfbclPcWfFz$0bU&CZ=S z#q#pbkV!xok#X<4r=zP{JmMb?&z@750Ktx6Br-VP(LU&sQj4^l zT_G6-Rd{4QwB=&NmNeumxCj_YJn1!3?2zfZ@9a9kgmV}Fp%(?ht{>naKJJ)V#V=+zq@0zj9X(Dlw0oXMn6}S>g5*;bC52b zHV&0cBw1t#GkBKusn`U&yz{s(h)k8~MT)Kg6&7M+?BZHYSuon5`ATfx3xdsoYs=-l zWQ@3Bzv|)TdKln+xu2bFZ!9YjqUwef^Z1E8#9OyEj@AQ>RqF1&2IKjYeOj0-t?@Tv z2J_(yUDlu&)^USKmN(sW^0j*$4>|MtcJD@+FLz$z0KpbOCjYALH~+Eh!k7T)d%2Sp z*&8#+xHm`dvpxRcjuh? zxW?NM{eS}x{0~%ANFH7dE6F0a$zHN4o>yyDRbn=Jx9yAt<5vQ6rEIjV3pGC=o;+gU z3x6>4d)NG-vJkZ_L6W;qGqgJhs10PnYyRK=^g-a*^}mvFh>!l;zZWXd2kx-h@eETH zXSNg35@&tdD_FcO*2EXnKHlOd#t6WiNogO{=?(afqIgU-KRDM$D#-|&v?|Wzwkq7O z(g_xF9W~@@xZ5v){XkO{St105ew^&K&((zNRBNPTDo!Yj5U47=#yCRvQ~J~}$U`=D zrjDlOI(EA@$tYHtAmIyVrDsQbUV6wj2U>`+-X3U8wZ4oBO|%B!Zf?+t3TxNqo@+&e#-qTbXgtkNKd9AKCC#M!)nXXD}wK zmhXatk7{S14#kgD#<*8kHd9<;tDL4P>`Gi4TC3WF>8g?OK)p6<)FB`7Aotjz5Q97h z725@$gMK(KF5KWZSI7D+t~blT)Oc4d4Quk-=N0Sy5c678wHcGPqLhSQs_V8Ck&_#0!BkQ)o*fwvU7{g9M zx~vRSo^~P_VU5hh)*$a_s#C)HJ;Z^$F+}T!Ya9fj=`vY|eBH!p4VI%KXQgOiBhnj0 z+?3H5)3ZiooTv1sSNuTW$)B{%jnK*mi(wxWlF-|Qsmrf|5z!wXBEfFmBn{mC`_&DQ zhhn)ZD=muPsU~=;C>U$y?e`wLSzH{mv!(9#OTd)fr=3|=BZrV2B*JaFNi+ELJ+nUM z>saMIq|7Zs=d(_NLlr&a&(D0)bP4B6C@mj#f~H?$O{S+yyO89q()gLR!>sdr(#VU) zDIHQQmj4&YpZ}+k`RL8#|KWkxK>NMz5fgX4oR;^WEmaH3y-8!dYs&Ex^YzSKwK<)Z zpA^mI4F?Q`Q^oChZx-z3ZxR;;lMo_-koCr$Ku{ICC#iIJt}^;28q}TM5Esx^>TJx& zfuAURs~ZwF`jwf-#3t{2+_na`&=QBl=Ox^0}@4L#X1 zTkK8q*fg0Hm)qrCa_pri(selw^x9}S0?=; zZJ%#{$H_`G>e2?SbG(`B^zP70-s0W7(kvzwtn%k;dumR`c+;fMVJd{aUP9X5U3Y_d zrI6kl3`I;CBHiA?Wf1`zaNu{W`Ac!Co=b_E0h5;9&h{%4%*q3X;F+?JCEZXn$j&(yEIPj_h7$7x&kOlBHq8C_Q=V=jB^P?!oD#g}V#}u(b`5cs)ln zK3319mZlaIH`d&rB{@sKh8V+H1(UNjD$t46*$ik#=iB>9e)#u?ZqY029Ts%sGslos5f;D zGnw2c>Kv_MsuIu6jhc6WjfX+YZ8^yff{Es|^aP&GL)Ll_j@$;k+^}5AdJiS4G@%{( zVY|pjj)cG^V_h*lefL$(1_voIITmLv(*8G?gnbMu_^O+?F}D9djSZFOc53(A!Oqmj z`BaYB>y4OK+hJfjl}We8Ug^a>;@ZPI1b^>()(eN2uV8+8)A?iN9QkXBNkeVHHejP| znn>Zz`W4%!*FyUap5leH{3QBYmpwM4Vq|b7TPbV4Xt?`BnNr-8cG2(iGd!<5u9dy% zel%N`voNY|Pz5~n{vQt4Cix<{2|vgX3K(0EIx&iPh6yl$WQ7a3ATfi^4;BqwJBi5C z?mCGq%J)v=ko*8{80vcTlT(@YWhtZ=H5GwsB%+mxR2Gy98HG@@pyu(<)K1om8C~fr z7rRP35*Q|1LlFPD&rftLTT%Fqk-yMmH7U3@MJtyatnMdO6Gz-sWa*}zY8$?#SIW&S z^UiC36OxmBrLV4Ggq;E(DzkEUo}_G z6n;J9T!6-wxzl_faVx6-M#=qM^Yyx`adR|__u>}!@7FzajitEboA^%jz#+cJ_KkRwhWyoF2s4U5lsO6HB`J7LzZ7Z{vCdF=4jjiUjA{7vq`>=;I9p z$+QAfKQ&33r(NxXu{YcZg^*k+6b>7Sq&Oo^o;sGQ&M22>_zfZQoB?GYS&DEl{z}UA z4nKO&&9$swJM3}3H$#hZ;(>;*`uY&pz$_IVB#d^_+fEBbDs0!9`mmXnh2}`7!gA6q z>~hUpswG9^4ff5ElMct(Br8tq*jZouzfmdu@JF2E+q3DO4$I%icDQ5xWPwhgA>#M) zl~h)U;4*mp)gD*0d*qK+(Nfq1x5JV;ovK{u@{vlwq!61Juve>6U1GuznLNSd*wY|g z@m*ZmGVg4qH?6vAm%RvLY5Dpuv)qQC6|_*&UH-Dn#R+%}e(2IXskG^-L zH2!?a1vPNoDZESBqHoD#S7}re^}xk7bC8hA9)-qAkAw$K;j64b`>##i5hYa{}Bz3f-5qy)SL99zFMJsETg;GrF zeA10mT8;H1$StbYvc^@{n!)J^K?xoN4do=zj*sPox(_#OgXlqfm9@*DB63^;sGA%vK`Qi#en<_}r03p)g~ zNJz~YGlfc> z+O!7;oEh#~XjPK~Hr^#9Bw~2>tdMVafraR;WkXPSB~EV~7PyUW|5eMWG4OS#%KzQ? z2z~^CZ4>;w6a0i4K3TIK&9%;8KrF0plzcNYz@U zNzX=NjubW3Xh{Fhl!PTqN5ecKIcTLdZ`6ow4lG90T;@ z_Y8#hpT19W$xyj2?{HHi>|3v8y6N-wB@=mh}jfM#lR-A2bZ? z260Km7!A5nzH0r%)9KO_qo&xlXqo!9Xu)rht_Q1)<^E}!DSBvPm$PrKZmF~|r`i$W z+w!vV(im6U@V}hiu2ePqPT*2^NaQko=cq%v1gq_hO!(3|CrPq=OBxMW zpI$4@90{$OholFbjrumNbSZKo-|7KszPoSSqAuTqH{t!i7xxGJ{c6U-?4HH#f1I5& zj{x`SguK_|!nm&d$LWVk<_D)UotvWFct8V#8Rvd3GY*(OLO7{y@4S zQG+MZ;!cg>UJ)Jqget4jRmYvI3Td2pe18wIsvZC=-U36A3SH2KF5D8wqNWJsq)~JY ztHC!b?tD?QSbl^6oeo|TuRqmN9s|IL>NBvKN3CI zc!Ee}ZVk(*efi)kL1k`vEAJs1ef)If2~?hb#EU;pZ>0CN80rWXFl|RLavuiU>Vyb8 zq#bAr@z-$WU3=D~VuoF!7F_tOF}K*<5>q@uh-eQnCe8tcuY*Rfq+CQxeeUdqO4jKP z7B+56^#~yKH}np}*J99GdR+5rLymaYUEkO4yZ&}m=lmVqmo3M7dlP}>EP0^DQ8@yS z;BEemN=7hhy~%qVgkhJH1c~+$zr2gF4GgZsomH}#wBOMDpQqV1JaANGPFHp0V{n2|HOuDYEkvbb zg#<#!s8Y21%IkgrrBbxdrbhBl5uXX*LuNNqfq!sW^X1F@V#8-umqm#2>|)$6&f?A& z*Nq=^eR0$}bjSLIE{1i}RRT~%>GjpAk<-7wg>Ug2#=7ecYecegXp)V&!H$=;W{LD@ zfz!Vqqk!(6W4hYI3z(KU{g%`r{hl9)mzyhnnm=);(6UpnPKQ%|c_?y4Bq>z?|85}E zKYTUO{A;4k2>*^CJn;~b2oL|A%l)_qr#fz7rbJN#oMfz-ZLySBWtwlbmS(m;5eaW8 zs)&9Qux!oL*o`(-4eBi@WZ8^S7H#KLy0R3JbTr~7IiuXH6GqlworSkuKW2?(NLc99 zy8sZQz`HJ7#aP2a$RlNmHR30Ea+I<3lmI-{GdkMf1z9s_8*W-<05JVHk~L5gu+($= zH&n07O+OUA`Q9?nqak>%@Fz-XwjO&#n-+sC&XkaedhystZji9fqA4~_XKq8}kr5W~ zk-e$dP!ou;Fq|8X?|e~$bz-Sl$U=uYK!;`fRbHFWn{UJ465VIDP~>O?K8_jF3y8m6 z6OeH3M69~V`8))|3kba~2Bq7HAmf*;_`JxAW`fZdBWdug5>UZS;l!Gy-9jbti7~-YVxc8VqPWtOJM~#UWKu4lEFw52AWc23;M$1krbab@S{t& zapRW$RN!%Fg3v>A@%;aYdI$D8psi~(w$+$BYTVd1n>4n$A<1 zt79t;xsGxmm<&G{lp|u{#;hs0wA`iC3g^=^4Y@>NA$C}Z(K_YjM=;X&k@3Ivtr9lF zPjG0nI4K@#Ax1$y_j7{kHpMY6$Mi56u3rdy95DGRxl_s`jEsnr1z{7{iW%~27`q9o zV+Nh$5a}lHk-?Rp%HMCcM#u7C=Li>raQyzxX^jKl0#EL9MI3}gI7xkoGgwV~U1GW- zW=x4ypoz(90HIHRV;aP?POX1vsJ_HqKGP_3e4VHArI~rZrkwGxxZZ*FqDr1HXEWap zUSDO?xqp@SjB0%5pznzhwM*yH?k8~rQeG$lgtp2ul?F`$ndu5)aNKa^Wy89J=5 zD$Np& z(MpEuVEy9|4FQACyMe(J8u;qDqIE7AQ@FkHBw*9ApbVT+j2xjk0C1p96NcMt9$Box zey?!tj|+SrR1~&~7|au}M=3;qbzEQQ7wVPmOxpkfM!M`7yyjnqM1NN+qMJA>%g@0T z+av@itbUQVC0wV++l|jOkh?z1F!FA?c+qn0;+u18Olc8=V-`MWLJHj zYBHy7K46#0kR}KMt+QL;-c5tS9s9|8pP-mH#eJzsv0uL~Zlz~dJci1LB#S=1mu`gr zlGbrH)ZDQ$P-I8v&S@0+M4k&H=4U+|gTxUQug`b*BT8K5g^Om?l2H8sALmZdZGz+n zr3ed=wq=yV)a;>~-wr@p%XBL4Tn{Vjj)SJjfR=G#Q{#uHLgDbzPtKluNC)L68)DjW zSDl_QyAo9nP!FuKGfcTUe^IZg-UI?+W~c-oz;Vn^$PLOPJf|^(*t}rfu#Igeke4G- z65(A>6|q#M-ClXF69P3xefghmbclc;jJbI^X75~-nKUiS;LeZTQkd|uv?eE-oTTZ* zl=i(&OPIrNsqq>>lDzzCiuE#3wKssWbjvutrsE^Q`78^^YFOVvj2%Ijt;-PKJyIHNG8`3;SOK439mct%YjS?X{mRW6Ut$%m-P~|d6twFA9@}GJmN{C) z5b_|o5t!QRWH`oi^JK4%yc1NPmHhiHRm0qru-yg4w+Ldns zqX8x$v$-N1u0*WsZ2|P!Ou985ojz?V|?LwP_AN%Ng7J#uF5GG6uEnL&`UW9Kj@)QIezd z7aI=La3{iB%>Z0O_LpJ!OcOuaV~18|+<9v4MiM=>0~!Js243NiV^tGxm9Kl>q#I8f z2%sk37NqC87i_Z?%G(=5zru+|>6~v34t)=!u{wS^m>CBexXl$M_qa;BBVamcOjPkk z!-rs(%Spv?m5YvSxWSPEUke+Hp65Y2BSx$7U>GF-S5E7w_Ut(-zmITgktR++kYG0=0h%A2JGX5|NRHpqSt?x z&abhm?)DX*oOPhDDfXYHI4We1WeDvpQHQ6AjaKU~vSI7dKL6rafLEftQuDmcI2aBB zuh0S-tk_>R{+_qnW`A(+So}A%YEl#}TS#fSg}YC!RRP(qpk@HBc#EiER?=J}xk*PH zXv6T4Q!Y_8ngDMUv_GVkl23Mwn8J6wE=#n*lAY5Xa+{dPaa3Iv7ime5#CxIu;gj>OQi8q6O|QzsCgHyz(8U86h4W!wcEECkvWhog5+Fz1ODqP}|#ZE;HvOXle5J zNJPCvUx9U|>>!B`3*Gj<->TOORw`$I`w_v=6sI8V*L>v5bKu|e8<}LLXD(VO7-a!;{ZbKKjjw-$|i`vD#N)#TO&@s zT8O`ye%>#2H)S+xe(k9Lo=et0|Jsr3deVP#Mu=v>iC6@eBstfHfxLJ-VC*v+PjpT@ zj_6YaZ8nd>cv)R94A{P5>E~va%#sfqCv3kR3kp3cH))HF$)q?=rcODJ^#bAPJnyb9 zy`VGw-)EAT4&n6s)9D@uOnM9YF}UlrP2(_eo@We`W8pM+>(EkIU9kbY@2{u}9_9C|KQO606H-Dd6UUiW;g}Tij()^A<_;u46csE>kuX<_}`ufI3&!|MH?6 zMVNGO+ZD6^3c|{k*a#>Z|EbdNz2(+)LR>Bjygn{xS|uKSiA}UMtcqRN8(fDhKUCut zH;6LYuw0OuskM)SsEeXD0qDoJUMV}UX17)_5|tjgPL=j@_t8rljF9R8os0M3Mmf-M zBu5nBDNU5?MC%bai6QtsT?EnsgLhE~{Ef8~Vo9;FQ*i+CaF z+RD~1;OW*fGmhgpgj9u9&Zz-bsG50dwwpbftU%V53y^DNm$4T(@b_jlA`UVsHkU}7 z|8kflET_$>s5sz9TH;Cz*d`C)g@>j?;-K%c$bTB z^O^$Y9S4Jl@ZD$KSTiF~F4xNs09!OiC?&da8jntg#O2S|VMpb*he`|NUo9;Fj{Cp7 z2`bSdYAsr;){~liV7Xa?9I;2eMip88iu3Q4@cjBm~kN+UnS$}iHe;}5^7sPrxNY?f8i57WoQa73Wy&Aw_ zUc1%QcCaMdp$E_o38U(oRb3NQnN`BMf)d$`iDk?=M!2dGV7%L>;A=3zGfpDUd0?wl zgVt`~MPMfu5ZhzN>uZ->)}V0SW@nLM(@>1wGAyqMMmK{n$HZ7+Z(tvVIzi=$gI#gi zm%|Xc4%tYGPz0;;E02vi8`hMZ`F$(rt4QP*;1X+BHFENy<1H2|i*aBIuI%uYv@gyA zykj=nlPHNz8<8UG@;V&|%8~3Lf#+0SW0)BpPLfp+Gopw)?n7v(4Q~2dyJEm~7A$H@ zc~CM~=%wO1vy`I7B(4~x{PT~0LS+L1-oRrToO+$%F)FZ`|Cd1&lly!8hjo*=yFcEW z%ioj^vSGtEPkf{SXbmL8b}%WTMey-AM|q^$VUmIy%21;eBKb*+7QmX%r~qHcZUH`Q z>#D@qiKm0>y}PFI>RqgZbi9az8j4MXP?+!ZAjjl%o)TFor`4c!9LKvJ^C)cQH@Q;@ zq-t7#x_D6V9rgymec}iJDN_t5mNB$)`2#JK$)z0F6`IE|`ZvkcYV@*+W#t*IFl_hk zkL{Gq;zSbfi1llX_1nh!%DJ=USz1>k^f#lS_`ekQJY~9I`uikawf@jFdObX2rh5hfh8l@xq)j7t_Rn1 zj11k*BF;rfcZm$AzVRYU({F~+_riWVasj1Xozz}u@%%aPl0%dxQHAlA%VtLJi=z#E zn3`<3zt0_2Em{BX+jn*U z_w7I3XfFQe+ZRCgcw8|h62N62UlEH7;C@2t^GKeiYu1aIWq7T`8mXxg6}BZ=h2UhC z7lj&;1c1j&&7u_KMDelTMwuzg_lA?f-=xpmUawA2s*Edl!_gs&v$ayem0nYDqTd;u z4JlP<8j~>f(=RhxlQ6uaSlm5_Y)YodGUAP5*Fv_0U4NMr{gBYc6|coea_kjOoQD#v zOra7|u9q}+R2c`P5aNs={F*=sPTd373&AM%$0)+?O(6?bA4wYUE9V zbnzVXWc1rzfaGqSQm~}NoP2cRAkvPCmC5!X7}|i4E%7f4S$~nm+)~RAR?O`N^0nKR@FKD#zh(SE)_I_eu9M z>y2Vt8{ZvtqOj(fzg=d?uDDP031){CDm~^^*_k)J&{O4BN6CQm`zg*%rs1&G@TJrE zeTtP0M|**<48z9Ma$cf&+zT0yC-?Oxa3V7YMGcs@{3>#}jvI2-(zg60GsQ_cQ-=#u z{aiyQl2`62(;Zj&4<}%_d0&bCLMM1$ooiom1W54-7^T}U5+c$Fp#C6B5QW?n$6LRY zsKuu3eHS?ljU$?4&;bNQ2Tg69WmwNi3GPgusB`|DU*3oV_PROWvf0;F3wCNrB3j!~ zcxZsK{e)A$)DVo9h$H7Q$OZNOIs@dcbuk}AwE+vjng!2zl02OE`#QH5I%dC3EF4(= zPT%5}%b+=gKsTyK`3Wf5l7wDdvLv9126gRwtNj)Jr5bg$E`{1RuR6nHiv?)_lKzl; z1{|P3M2(ZA#F24%ZFY?EhfUDXMt9v-N3$N(8TKAhZ)TSMK5HiH)sVimSdUvvZU#K z1c|XOZK7cl@{g6e`NDEUuL`oe=m`L)+zF#mGgqKy8Af9jpBHpDc3y|GIA{0+V334A zWJZLhO^pLZXS?vNBCUKM-;ji9iGj>{TLPP0(MlM?7w@WU%xosw`ue;9M;K9N00~Xf z4H8n!U_kiPm+098WnNM5bRWO#TP$^{`smOqo_Zt?FbVXk6f908{buIA$b?*kap43x zE~cpZX#(>?4U#emW956FSrHw-dI;1I8l~rGjo2cB{1VRX980wR4fz2zj-A5s;a?>l z=8dblp)P;Ix95ZjLg_su55%IOeoE<+yO`*`pwJ3c%9V^9vK=v@DCE3jt(_a?ZktP* z*_%WaG=~R?a@9PcV6?dXf>eo2Ch_K%nw3D%IT?keVnT z8ITBwqP0}UJsUfJ3_$?PT~*0teu3{%v6Y#<4n3=Y@gOP#6sy5};NX|gdn-V~vX<(P z8GP<-Dp3&Of6L&f<9BLbLWq~Vo>FO{bbe|d9~$GK5p+(jY)nRZmT4Vk_ZC~sx2jTV z;0u~Gfp_G|SU3HJ%LKuNwNZ2ih}Y9%#sOD5riB+GN;b=PcQ3ch*t9eIq?TM7Wz|}A zn6!#BWCvqseO<8qnSb0_CO7<}{1Q&napJH5c#JR?*va-v4+j_haAn6r1M9^-4>Jc>%^)r@n92)xz@pPdoRP4u6D!m$$Gk z1MQF+GZ_4J1h73C9g*plq%hDmWwNU8DitwcFGv}&xnP}eocUkAJ+c)h3d~1XnK0d$ z9v>n&!8V^J5U=P;qZklI1Rh|V82~K-pNe>-SO_LYeT4S4ONBAqLL>l~rE z#>;?78mCy-2MZl1W93&^mFU2u6A0sy0NJ7t69@xFSzS>QfD5PvKegIP2s}(g+;y-$ zt(8tb*(Ku^4rPfAfx#!L(>n+GWs8*#wa-xAMjvd`I2EhWj(MnGuWr4hMueLk1b{NX6znX$6Z(($P(AT~=|n!zu)^3J_19@8r~;2iq{u~-cq zn~G1sp^*a;?eP8VtQH=>v-Em)?p=j^Tq0Pr+Gf7UkXe7C>nl7f?w>I_!#&`^njU!%r>eunA>eM>>6W<>!sHsE4RHk$_!1O z5Z!J9cg0~gQpX8Sd8@aqOjClljf~V#eOY36i(tFT*z0r{N{8~@=}h>suXxVBpCI|s z9&!7BIm=m{|C(x6i27K4{t;PM+0ZSPmyzi}>x?rww;uRuS$^lwilE)9HDA@8sD?b; z!G`NT@L#_n1*|pc?E^3nYeR%_%*1mMSt=0oHrM7aY9QI96&_j@WWl8UMKE^1DxAhqsg(4?dr&RF6e%V#7i9d!? z7r7(vMsqyHF)|F~UXmWmyp~Q#0MUWvS{|{Z&=c}aT-I766*Y6z8M?W*{BQZ zkS2XW2b>%KS#(rh z*|{p$OTXt6oDJBW|4qF$%KpU_d<^tBs|!-zKG8d+v@o8ioqq%Ej#|&J7=AtGKebLb z$qHh81IMhK+TKl-pp8vT;kop@y7Px1IFbMYPSqrjI72{MEFJvR zIBsqlRlY?_J8pYy20xb6i}o0DH}0*kpgCaepG<|G=E7}#64(5iK*hN@Z)%fAFRDKf zg6p)hN0a}m#ZCu{hsaxz)gy&VXkt1oHkpcs&_?yO%Vpw%WIhH-AYDVQMR@q#f0UjR z;|6jqt@^Y9U%~jRefKB+uhz9&6dQq%AEzY~DZayXKScf(6)FRD$+hQ(wuZU^myT8&p*(vtR=8-Ujxpg&8@8FD%f2}UPDEbD_dc}4oT99X6w=T1>HEOF4yzo}mq zA@N}w=cN*9%!ijW)s@9>KBpv%!caHi|8}Nc_(0*mP8S9wE@l6fA+lBff4SdZ<8$Rd zi|StzE%1NH|5?Y)2PUxnYCY==Nym9*eWShL0vYZ)`y+3zvgKsQe(v7SE?92O`EJ36 z6NQTu2JwgE8vhBpM*!-E3ebJEtE?2J4C5DqQtXydC;=L;o>GM41&JE^Jth?*$-N}$ z&*eGGT;D)lM=(5;q@F|QqbrI>l2dNx$)^)ZNv)^0lT-19@c>eKT zp-m57TeyOSDr2z1wpqk6A@JP90fc<8*HAD7xW3zj^-+kuiT-x68cmPpg2fawQa;cA zm=SZ*lQDsOv^k5h3o5jJlGWTjH6#syRUYU8_SHVOtduJAgZe}NenTkLQO+|=QOeVp z>7fjAzkuY{W||)`GmMG^)Ba=|Q70D!aB3au!VBEf+SY`L!NK}~m;|3}Eq9}`RmEXycm=R( zUPX~gqBF&uZ3!5X4*DKvGog$|)mbJRR|!SKlMK{!Q8ONTnRGo=R!B-zC*ZR?*xkNc zIFx(Gg4K^+;`8qYK@1-HUMnP^3vD`7C*GoS1C{inhzStSlP1>$v&=seU6-#4-7V3M ze8NM)Bw|&7;3Zv2c>g`#?dfp_h`@Ys9oTA^P_3L#G}_uHk#|0CV;(I-MRg30R$_wb z%|1VxpIUbC*^?7C>XaG7 z^EOZ4%ua*L*EHDi?>wqf_@@VuZoEFr#?`i!Jjb~C_a&bv@{7a7V|3*j|Bsb={Kra} zdc!P%{L{;KWfN{&bM*$JGj#cXn*aspupUyEB**nb7022ct>kmD?!;4Rw4T4CO1OFz zU3G~ST0@22Rxi&mv9UWBN!xT#L1i7Usiu1EKM1D*lZu%-CNDGxsohA3EWMy_)_{GEx}8yrqLGzV zw0wi76FbH=c-~?0TV@khUIuXg&4U@Btx-wv_c6AL`yG0_GYOV!SG!b^y z3WyE)eu=AA3_`}VAEfF=p=-_X(VTUU zY~W_)WX+3EF~E4)0%xOxf{-A3-c7`qE1Jmll#_%&T|j200_xoP@G0Y42Xc__{T#@o zI`%hdY`xi`qZQLjv03xqqNY`$1{SXwHh5B8QfnDNM#PmA!$>p8zVq7%bq*u|j&}Lv z7z3KURr9KCHF>S2E_gEChX6#4;>kcN=DdqfegjKex#9M(^sw4_)n6uttsh*~73hZZ z%tYj}YY&Z8XB~4kUf+f>g~`&GzZ>VN+B_G;R+N1UAI^I#f?ouJQL|YcWli!${yQu$nDD7 zQeRw|Znt%#)Gh$gwf~hMX$VV|{wW~L4vW5glE8C(qNriwM#7}QJ=!#hM4A^bkf9j2 zF7%7C9z`p6NkQKju#q9q!%r=_JSz@{2LvMR#<##Db6|pDdP!iIApi*DQqZ%Q5c6|{ zumagsmel5@>JYWY{#Jg-ge4QN`r_`CF@#qeJIjWQFTaDr zOrR1RM)mI&q`p>I)zialqbi?8+4q)V(>Hhx&5U)|9TOCp%cnAzXPo$STc(=ZjcaA~O*(d) zwg)@?d5D*lJrXX42oUlh0JlK1PeaWRmYau60-uZO9kG~R0_#ta-fkf2A4QyEZt4N1 zBXNwvL~(tk@^V7hVU+LptjS%Ge&dS6;PY0-E3A@+kf=99<;8S{hnnWF$wAE?ru}3L z2lBCO|7yC+Z}deCZaW5*-(veo6lP4geb^IXmqR;Z&_~Zno-_u$kZ5qUqnYB6un8;8 znjV%M68R}x<&+*p$Q#2nB`9f_Z=BJDX^S|FVR47liPuRJ`BZ2(R{zIxCJEtb$A8li zFddUasz)dv$gngCe^^;{4(cIJ4L-49?UnTHWJe`x0aR$leXVl8w_zJ*o1=a!#-`iXF^TCSz=b@onIqiRI6yF8@ z#ewn1fVT$K{=2Dq-h(vn%AJ)IO%m`n+U!8n>f!*7_YX5QuMX4ATYoa(SlG>F>nUAF z=|DVbb30$I&r)(N@1YvH-IpjyvO#0lD8U&M6d`l8Kq;t}ZbOAr!5T}2=;J6ue4EaN zLk3mf=RysFi315@a@xU;-5yttRs%Jqt@O7MTJmLyv*OTm##F9j$+^aK)dgA7a{h>*`1(dW#m_7gFYPnp(dSp?> zNReHw@TaMQFJ=S{g!t2nI2Kg6 zhiC!jxm}SvL<|?4Y?+haPoB{%e3P15Xh$Dh zag*#*?>fF|2hL~gF{!bb9fr%_vOwnuvlkLM5I8`&yVdh9A1E!*h8PMS6%%D|I^#kr>1;kJ?Hc{v(3>q#*u#VT6%X>IBBS6K8 zQO-&o4ccs!_-IUK&dBLWlphJTW{uGv0s@=oQ2(@Evu6~CtYwSDB$<9K;|J&%9MN4k zW6R7c#Xt-db~!B?C)r%|z^E#L)e1vYNld<vUE@8Y=(mKkL6KqBa zC-ypQ;7wMOP+LZztpGB6 z3tvfzx}Ldr@(OYG#5VWQ2&;?Ld=H|X&T_J&9sF;_pYO9P{GZA4Rzs_F{~M{-{~4(r zhHYXE|3)e+&-KgE)_` zO}+CfcB*=(A^qmcFtJHwe)L>;LRr(UuTZ*Bx|Lr6wHd#BB;#`0{tJr<59OQSygL~s z3Dy(FGy1c{l`hR;>Ko-zgMr*=GvL&vDat4V&F-5nwd9iqt7NNX=h3MK@UYv_%rFpL zw-^7Y9zY?OX$h`G0b6q1fN1fmXyopGt!+wm=}MW`CgMh>Dl$i!98MDRC zo}nMG*-F7Nab3FG=J_+)&28Cm6Hc9cl#|?K@VHf9>?*A@Gl7(Y#&mbo7{x5V)WCW*oJ-j38b$|IifCd9F72 zzq7v!(O0+UtoW7ihgZXTq(gIM`@;qKk<{3A1jbJp>q%vY;_S#b`=8kPMN&H@Fe)wS z&JZI0V0mSI=)^3GF5+kwqgd4$KVuABP*bzmD17sHLzNjkcO(#tXbAo!$1wWAoC>Az zCBVvplvCE6%;u_;v@P(q)R@u8>ExB8f$8+_4dCY@L-tx3$Dh>Dm53;+Aw}xZtzZ0M z)vF5!$=U_c22J;418Wa2mzxPy1L*5-O_IP}i-9_%3>2X!IY-YudcS|?G$z-kIaW65Gure>2GfQ*#38M`7m9ub_u z`8dz>nmYHK;{U>3{jn*|Zy$9~OOjo8lt3Wviatp_>w7bc0>=x4>MNO)grI)PFY93} zux-c1trFx-R);LM8swxomgqBI$WWcG4MV~``Q=9sG~*nO`PmrdjrQZMJSt(F=id3J z`(>0II5{#}5TsdztgPNKW=knEd*R&Pq86*?39d*k5!JY-S#coTw~f9zdf`7=6D!oG zwTXn|*;clGKr>{6BBp{194MH!8!A=u_9idME#=6KO`7C_8JPjA?ec;f1H*w6OZgX< zKWB!-bsqEJZVk47j6m+Y+#JXr?^D4WPF}ANTJ;Cc>!Gc=F#fvvwiK0 zotSGsu}%cGyA4{LjP!C;+s|FMRyn9mOIGAcN9UTrnVhQ_oQYE6F$kVM>wnttc{(^% zCI&@JhjPB>6TP0RtsFNYFRrY7zKusufBYstyq@|m%m1$zY=0g31Em`DKg~A9gtiU7 zkO2_u_720clIa59%lGXmH_MM&Vu=Lj!Er_`+{lYMq{7p^w-d@j31{}WJy(A>GjQm} zNE4H(G1%CK5Z|)JV@EiJD>IY(VqOg3L%htg9&uGH_I(+%$w(KlJo^B!Oo)tW%P>|- zxU&!peYHH&ESWjd?W6)<=9uV+2G}ef7&MsYI;n~{j?stLa9`38uyL3}S;foyDN-4f zN?nvH2i-~y*|-GbZX-O z-@`wwnGFP|b`hfEs)o?WHPH5k!b9_QM(Av-&b8CA)aQl%Nk^CS(1(3HwHlF2kEH%L z8a|R)>kA1kaZvk8q~qt%KQ<}efE0WbPryf?;3uHyt0%^CEw!Z6^l4+SD%2zXQ+@@^ z;v%CdqQxIKSF%vwyjuJWkgR>YQBIXV#)IpvXtUq`oH&oabSQZP4jg$3$&S7)fmp?A znbOg6c;ckjgJgbZ>ss|qsVs&n4w4PFCcQJB>6jGBWQO8;&N*>dFIIE47+%aoTh^AQ z^X3*b5N1^6CxzRHTBS{Csc+`u(}v0}mAPW##kfOR0$<$O`J^(bjTgc#G`E3m?MrM- zB{-JDaax5Tk3z8SsK$^jZQH@gc8?HGk54M}f0BCjmdP77LepZ>CWyfD_Y_oOdB*B2 zsvKCSTVfc&DUQSd6}^}p205dDIfXmxbjo*;`-5)7C(*YRUWbaa`ff*{;(cq)T^RvB zVK`4k%;fy{aEvIjCQ@oq9bNgG#4LRZy2EnCBX)7y!~{3$^*0jHQ9;kchwv@48ND4$ z?Mats;j+>l?_ zG4>nKI_asgbp&yGb+4;Y51$eMy{?qsxrS^kZu;oO(k($@i|#YxQR-CuAE- z+V`-1p`im)mDhlcRG}bBuemqOazB$j=f*)i;36~pI73HbjyHpXry6kKk>)*GyXUx5 z5;E?J3iJ*I)`Vq;!VzuQwPaVxvz$6qT_AgP2A6rNVo7*RtRr9)QAOehuBaO#N0hd1 z2lqIG&N23mo4oQ_*pR3he851b&}ABT%7|#TvuUA0gD;~N+?->YowMSW*4t~@YEGN7 zg+*My;fc&$!YVyF8Iv!OLWShUYrO(dJQ^fB77m9M8~=o2I^@WdWvWiXs?Z!s4Be1~ zRus(M@p|$!vog?DpU3J=-|VKNQ@Fp)qZ65KL5`wM3x+r0iab&eXz8aZ zD#DgS0gpMNzlvL4vR2WcCWoZU4@#_CN0fpC;8~OTY%^F{8nzN8wtWA%BHUo(R}JZN zKn@a$ylQ>(=(M8zby3QS;4hvIoNUF_U*l7%b2I|WL0C#gq>E^CRF$>oU6S=c<<)gN zz@K1ho@}ls#sPtZySl9Zt-zd6L8csm`Cd%M&l7?738KO~ zXZ_S4#b0FXWi2*Zu0;D)t=GBSd5)<&u?<~^MMGH}jN!_EZi@-^ZuuhcNa8GcKP?-d zO)C5L(g%Ip`IW2usMH6*^a721tC#Ct>O8@e_ph5!|409mxcP8<2V=}_fb(_L5yR>uh1as?U>ykp`_Xh7ABo(M& z1gSpsq*Vj+D-^@+un!ftb4I9N`47OHg$pu@y?Je)q9dkKSN!Z(9rfUbrxwrbL zM#OeBd``?Rw~o8}37zg==#Kg)I<9(57mO(w&X> zq>yW3%iO)>>4+@CZ2HhwEQG8)FUHIw1;MgN~Eic z`|Y;*RRqHA3pS$DcaQM!zb$pY?4Kup?y)D;{GVl%VI2IO;A=%q{yni|_HS#IbJ-T> zf1QOrhK8{FoQ&jl-oX?>rGMtX2K&YFgBn9yD8cV!Xyb>^6Oj7YT5#;BwK?rEV&+9b&3KD4j-6N{;a2)gV zou#P*Sih2g4?Nf9D3)<3XhMhnv=mGNhZfbCE8*p30k-9ol6C@iT>>5_%8w)_PI6jZ#@_J8ylNeh0|!K6z57Z4WIg%O^iZPszg6#aBycXFz9S33I3FbZkMoS?md?l&~n(6jPI31>Vlx zWC{wK$Ej-{Bwfak z%~9MoO}6?<*V5LkqOLuqa*P4hUgb{E+l2e)R=8cwkwgyk2mB=P#q={BQ^Xw4sq)=_?^VigcdNZT*z2yQyH6&YI ztp1CabgG~U+kbnu5~`E^Q<=KN5F@2juJD^l0w`@CidXrw zs29@;Hq|xwHE*X!rR`^+nKr9#x^(}{)7qb|LvIk3rxnT!Z%0tnJaJCyONHC#E6}H5vk-26NJi{8sg?P@7uyMJ>Tj>}?Kh{GwL34*bQRzyhXpr_Q8iR)-?{j^ z1AiQ1rTLg*N`Bp0KA99>VI!Em?+W)^b!$6ZdRz5g?BW~ADJtGqAwDb<8d~d0=vzE* zms@qGDirkQS@n2h+;zQ7bk};sA_)h~G7K@Os#PW(z{Oo;6-dnDXXQ@K-Q)6s#p9V@ z+njJzu4p*D#~!v@m3Zi4T=x?=i?m$VS|dvpNIaH-%Xxa@qj_1(quxV3x&yV0a?y#}J*zB{;mEpwnM% z9QfR_Nk(Ixa6k_418l;-aV3?MCqJZ@JY8W~`N?wp6?J9PFzc^n87P)MtnYR%F#LDr zt00U66}F1Vxbs`o{{E!ul42--We*>A09Zd721A}E&k(A-!mEc}T4e6VC77>&v<4k+S3$g-%AU#m=FSqSIHjPeZ!duo>V#W+(B#bsNcb*aKJ6>(ckXl>_?>Z&#c zhau$fA*XABzj#uE%=BQE@bTY{!Nhg%c`(4B#&4Kg||1aPw@5zNQmUcSd zPu-k-iaTH_L&6{+pj*I?ytitVCN*We&a^IcKWZfxl2QqG=vgjlmq`O4!z3$8KJz=s zMGlJ11-0L)EM!Fq6^PM4r$&n*Gg@L|HkT@y$E&JONO@&$q&m42 zsjb;2#(%^bV>LT(|Hl$f`3edzOC9S6y;|u68Y8MH&okW6WY@^X)eBW0;wUGuW9vdp zk_FA4zQsQv^L2v3^3YBv%ALr4cD=WsXTh+9Cu|Ig=roh1edp%aCQh+)ha{snSgPYT zZ}h5v;>4ca!ua@FMbaI=ZA!lyMDydW@gRXc&lTOT_MH5F#%tE;oM4gRvjyQNH^emkEBvAD_zvN;2mais3CLa^Df|PgVL>XyY9zkU0;q9GR z))UN%@-w_b2|{-`U#8E`N=2xK#A3phH9w8%o9>5{E?d$zF?FDz65rG(w$hn7qkCcr z^vIny*sy`-*21MMY%e9=r4;4WtH5&7pA$O*7Xbp%l_ch^3_5+ptktjhshX0WFlN@;J_asHE_Z+(oWqQD(vt(T^7t1 z0Rl$GX;v@F*24>UwefRohhl+#Y0Kohx;Bn(W?Rwi@h%nC54ULcAp8}hvh(Qk``T}`$@EyCQ8y_Z z9(-L9vJ%;Z7WMOyUAf->a+N=;&(uo=|6r=so^*Ce ziLBr;1f{cX|7kxZX^OP@tA?5AU69cslrMhuz1wW{PQzGJODy!gQ5XHd;5ymM~moE zp%@@(LVR{|g^(NBpy?Y7(HE~jNF33RxY>lF)$tWYD@Q<48wvy_s$t3Hdf`IE@Cdbh zB0*Ga{m9o=Yy6z`f|-0K;4TC^$P*!VM;SGdAI->P!N{w@nBo9pQXY#9={nsqooKia z@lSxmn&GZ*nM0xRF(=C8Tx=KKlo~k?Lty~6zv^OHmEzHCR(1fXW>S6`eWj(-^~EV1 zuIDs?$)8eL(W+6c=u{$;G5KQ;)SDzC4I`s1Jkb3tMpg;OGcM$t@SPDT47=ifa>KB8 zE2*U5Xtr`QB>lr(U(por+tkPBeni<+*OQR#n}q|vi!#)scAHwCv2ua8)DGnH!>Xhy zP)A=2l$O8}NAt*{BU2RL9T67G2=(pTmQUXN{VoYLd{xVK zj^ox3$M^N(!?Yb&B0L%R3`5#HIwojZzdm?+##bEj^;yicMIF{eRElyoxAqe9v_o74 zdL20f)`C+KWQv=l9MGT%Do0{X0%U{TVs#I5>r5>?A$S_cp(a1=N~G=?jE-4}kWvim9I93**RA6klj`tJvID{~nQw5T5LgrBLMxzqm z9Y{>B#`%m>!TkDaTFcbkV-gx5k<@&HjCqxykxLKO%=yLgU2#Qf4Hl2ZV!QyH3v*v8 zDw>)_$TjNc(mKl3^~rXCLV7%&`5HT1(nXeQOj0O+F$4i4oTJ=~ewGX9B!_UrnX)}| zFENA}dD$;hG_VRGvHy>#bKtHl+O~DDW7}2*72CFL+jdg1ZM$OIwr$%LJE@mC_n!OO z`UAVQJ=1lF~erV&du)<61EM_j<%Q)Z_ap7j~a#~KxV)(0tfUF7qSR_2f zk1f};j%&rjCOxrXX&(=s+D-F(E=b+a>;?#0SutwoY_2Swh~OBr#-&HP?dC{ud@Z2j zcjiwOP3UZNX_7MO&di*sTt}z7NB(G2ZM9k}1M&LkE zc)~-Et;z`XM-^pr-Z1Aa)yLg zQ6(mvV%}3q)_q)Jf_2pMGFKcd=9Q2x;Rz4d%&mNh6-ZVt=J=cg#8nn`u(eNyfIE0cA;Qu!rh?i6<*P3tZ-f_l3+otrR<;BF49JX-NJ9 z20zw7ys)wvvQb}JC&o1}zwsh=kw*wmB{oeGm(@Qs0vSgDmk7Hg3oY}RMb%8a&W?J; z6_fsn!ex-zw3e9y)@jZCB%lD8Nm~g1ntD_-Q@ewDS`*Fhw3I1G%l7p~^D=B#;di?i zRTIYNN%pCXIau#y|A9|%buKi+b&46@kPtQc#w?z8NM9Z9<|&MhKk<;J@w?>0VoodP zxHT5-Ucla4hj_8p^J3??WC#aI9Vxi+3CH?|MO3K6r!ZFFG`pD;@x65y_pWmpp(E<; z;Me{6PIuZYQKQJ7#R%!oWB_%vJLl`?lUb^0Fy5MCx3S*GDVcfW2 z0;&6hh;C1$rnuiTmP9~wi7qoM~fVkrSpPrI~ZTc9H%H#-5yK3XHd{>ZSN(&nda z#qJHFdm5=w{lpxC(x~+=4Or^fC(TH(q0L@JOHRPi3_VCLRrRyqZ7z2k3)$Z|_rA?meaa}s?9Zlf>?(T`aZ}%`kh{T~$S?${;AkKv%G;Med z^1a~!Kb`E#EA6*vn$aqXbrsSfK+$PYsx!oWvjU#hY_*ZdMC{%KLCc&!(Je1}xjsco zLPIf(D?{m@F8p%b=|d)+x3Dd9r7fi;Uws?-C|3(qU}&bb!ML=`ff1MB`r>EX=_GZv zyi_!0s> z*RPF;;C-NH;j?RA<1!EDy;aWFItP&#tskTxvXArY6pZ4Ih-d+d871w9dnm9>iKp89 zA42~k3}6{o03+a42Ohye)6St>66W0A9RX2`Qu(~)4BDfa0mq;m8Q@?C%T3O4w(kd> zb^~~12iNkOy&To~d7)T~q9ddLwzG@B(!lud^MD-Fkw=60MRe3RL zKR@f=8X&iJiYBu=XX0}cE~8Zg+v%1NM7rS;;Ety^@c@j>E;)tD)g(4~X_rW(K8A62 z3(bnp_Q=1)r|{A$gsg*EI8||iXni8d%NkKfpe6D_kIybauvX>Y{CANdIuWU{YaKGZ zR|0bGT7@aD90B(81x}CSIf(JGN^a=~tKmaldZG(?sLY)q9|W*tOmaj!?NZhDS-A{* zbW#Rk!7u=+uaq-7%N|U`QT<(GxvD;TSBrk=`p+Nq(uzg z2&lX2Y+ZSbFrHpp5ZxFGp2n+x+eO=!D#(IE#{+5X5Qkil9}$X}$}v^#_cWTbv&#*J zS?m72;+j=G3@2v}{DLvAQ|J08ZwB07<_CTcPE_;Bfxl@Axr?f9Ei#vqxNY_BcIpQn z%Hn8QgvFHlCpHuELX&I9{}3=w2Fyz@Brth*TmhipdQWWy3=`JL1Cr~G|29v* z<=1r*&;r-uORE%$1r;Nc#Q1BS%G{kh73%1?*YS6jttKNWfH*=erj;vK?n(dEc}wCG+rTZl(QSFOqKU-|U$X`-T1feO#Y=Ti(U3 zI5KgZdHPRwqdHu6irjeiA^rUokiCoG2i;!bujeVkFeR{U-`id(X6+&Mjq6a58><&3 zEN@yV%au_caE|1KZ^l$1e1iye2(3K~)f$N8dvPFnpw%T;&P*zYEQHpdn$?;ZP6^Wm$f0CEX+uE=X{{)>`u;i1ARTt9OxdG9vpH%iUqdCQ6Q8!wFd^nJ4NC z6o+ZR1>>)fzKi$EW7Is_c3wx!AhU!`VjU8#bM@8Ap+3BNQaqsdu`k8hiGkRzQrVwP zMi99h7z(AZJ}~emprwGq-AnPScFEKGs12S3WYNN1bX!iS{bc-AG+>#Z`BK^OAYECK zLBV`EMq`D*xyF@dA7NT=FX$w#9x_Y9J_W@|;JlH`6v}~wHBZtN?@=+3{+iHjE}GlCI1u`oR^45KW&va*XYw+Nl?jyFV(`tplZWoyEB9IR&9_p~Bd|?o zxJY);{zL1Yq;wdS>ejPm{^l|d4@ls4tzO9z+7Evy-$O}rL*?8n<{jfyC4JX%EN@$0 zcz$p&ly&b)rCr&;%zj?!n`9@8m-(g+(EtM}vnu6ddAxK_Q+`=XAKFXdyP1{y3J;RDCPU&wiH?j>acb2$Ed|(OD=j+rJ6* z6WZNJl$V?&B?LxvY;3V~YKqyXOP?jeJ69;+-Y+s<*zTLjLnV0;4<}XdnjJclOw;TG zgLA;rtGN`$^)arMJjgLYW5CPX(3L4J?pQa-8G$4rsa(=V#E?>$sE+7$_0O&~J9%TG z68K5oi7Ch*)wMp{7a4;YBim4qfis4|`kD%W{*&uO{M-6ovHt2u+KQ^+365TcFj zp$ZDh+)~9UF%A8kXUG_Q2Ua?B+?)jGs#`ecUM`Jdm~0498*VPgtG*T{(tS|!FF7>j zwe6CyAS)j`q5-&)!)!%^XHEQm4pE85IQM&Sl>6a|-2`{309l(UP<%JC+sqNw1}fUv zmWa?GZ0aLRr}>y>)z$c<4tcKn!j%!B5#ub-oQhF-LD`WlmUic<@nNaQrZddLip(sr z?AF9F)U}xhBk%`h&(l!$N*{((X0hgGW5Nn!P1}hQRfe2bHRy6hw*Wl*J#XV*ckIoJ zlk`r4C5{wcJ{&9g59d5nJl*hB`DVBUw=P8|yr#)9lX{Si7KCtW2>j(9J5F;a22c!6 zrAKWA;1D#Q)o|9VE`ngpKarK(rdw~-E2_~Ad%D|JLWyXzyaOjI7L*6(!Wr>djxyLU zQ?qwDzHCr@Ky@Gvq<|}~1}_G)g3+;Th9^uUY`#Iz&);!gdqvkWk8toWR?O0Ir_k2x^9kK^yy%+)W| znLeN_LJiF>ZJ`G|X41*pun4X=QgULvI!?)OZ_ucLx7B|9$`0GveCs~RH$nJ)er)_q zmhwJ=cL{b%*hHHs_CC0fH>)DjbaDPYlwq;jQ2wjhHG$e}+~1ecjWcs zIN1m&I}hLz8-;l?AMYWA%t`{a_&lfjpjm{W^7s-0U2iCdidGMi_{gkgdZN$eNB5i%;AJkwI`A2rkH+xcD#Fvr$v1&0hMsz(yGCTA1hc&{q~JJs5#!;!l=$yzcg zZPP9<9cNiF$6-zV{K|LVA2vKTvYo`>QelNJ9Uc_xUQ!wfWeeFQvsT^QlVnQ`k+Yvz zPmiTV+bDXLaJGGK_N=^(=7D)+&+ye@a8bUIwA~vo>J=$)d0Me~?A3KBDqdC5Il5zI zJjCSV-sT`6ju&BZcXf7z_grBSs}ZE!%6R}>hsB$hw_t)amH{7trXk%2j=E66dg!wM zj?4B9vGk!HVgqV7P1BbH%eW6c-26G_d1e@Ylet1V6h{;m^^2kS<43lJq_uZp8Qd!q*W_VoWv2dHK^Ve zCcqYb_`Pe>_ado-h+2!2SKO2n21kK^{XXF(Jk`0$tUYCgf?`KA8&WqYVErhjC^uuu z-}~K1@63*LG1_P@Jz*V>I3a9jgRhRqMv;FL$f{bK{@Yml!~aB1d$Dt|A7(Y2CD!)X z2wt;9ylyIEuVNoq4W~%52Gx0g^v-2+5~K$^tY{c6rBu>sF`R-hCM><9K!B}tV8!we z^sweEdww#Lgym&m>E}D|nsPH6dC| z-7d&Pm%<_yfM;XBXwBU&sVI9TdF;u)PIgvq6o`v~#RS*4heESA|T%hnBN$E~YeNTnk0Rsm~Z@l$3{ADZ>3G zjj6E~m`}yD^<;xwpQNSG5zvV-HC&>)#}=~iQ?4eOLAc~N;>gC4hh>ketOW2jXxkM9 z@U;<*oU@71J4FiSf5TNnk-YI$_QH1K#^5KIRg$eYsUME<1|A zQ6cMR?DX|mX_TE3{Bl(c*FPC6vY^o8gya8Szb*v(;grCuv+S8mxg*2rN|^Ns1TsjZ z#GBOfM#l>TI& zjEd)VT$jO}R4`A?8AdSNv zZ5z^hP*f1{tIxD3aSPoeGOSL5sxyPG8aGt7{p_^xFJs6qd4WTHk6OmdM3**FVtNsv z&{Ah{8{zW?d_LCH%v9?oo+VfTK^-4d9DuN4d&?}lV6(3XycIv_ODEy6Vw1^QVvWyg zus~4Suu_~0dre1h=*<|+Ky%$h#s1P<6MR6+wE&noRP#|t=}=WIbAnO-akfdvb(^~% z2P{OCs}1(;5%+%-NJ&-^+i5?%D}duI4M)PJQPouu!I}Y2>`Ezq}k-GnnWMMYsaXmKf2I zGSk#JR)1oZ^z=hK|NW9w2`ShlMWY(F(8UsG($d-$0@{ZrqYQk~U-Ra8k=7vYCCpm9 z)8hzNVo+S15sv#Hn(kAVlleBR2n8_92yLS&;Vcl;BsD8SF=E)6Y7GdVOUz%*1HyzB z2^mC3#vUaCE(f7BHDL02A{6%(T=`&z#Fr_=V|T-Z83_VN$LNXc!^WZkHPWQ@CuX22 zq8f{FvJ_Qs`Q?DKR8%ZhJ8)qpUr8)N2G9JcN5}=013~_xwJ;0bg@r)ynK1WUN^2$o zlQ&XG2H-t_wdlSXf-DYE|2SjTS$go%p5mKeiUkYQG6zAa}9AaMMGBYln9XVtW;Mrk^tEw)q|1d4UREx zE)0;ziZLGZc>A?-Ot}THlq#BV_nM*{Sb+|K#>|(tPRVOP?Q8q(%^rfTaGO{A=Dbp+ z(|&WaL`COtU$i&E*8+UK6wo9d;tJTr;pxie%LD&q0VMs>H7IUwZ4IQ zAR9Oc?86bxWYOx-PYHx&0rW3|BkY{`WjsNH@liJaraduH zttD#u`<_2>F8u=1>bQ(@)*Dmm5>p@f(8Q%~qoumJIVe4$7$uenqbF~YDxLHvt;7g5%OHa|g)Ln}4IA*@Ex z0Fbm*k-47Wbm-|SCHnyExwvT(s8uM=8zZoc#w#hTAcNJ& zDAswGgGeb>A%o2D!&UXO!%{sX0Y3kgE$XTud1O$}1^@dRb&Y*OO6Y0MHmt9Ce|HS? z#UFYaB_F};-pCep>8wRRYkWY^(3LWC2jw^HesETjGMn`H=-5;+s&;l#OC!_FNU#k; z1t{pdy5>h76h|i;115yye3zwJ*g=%f{5OI{H(GJn)Jdu)!W;U6S=Och9FZWZN%Uqj zKqf^AuTgp|2mid4cgFRoL)n^*oHkOyV8w`OvoF}A*iO;QCxZ$lh@2nkJT@DqgXOi) zgI8g#D{9p9-2sh;jTV{CX81g=f?69HxI>uaYF2`cB z6|D7{A5m?TK|t2dW$SvAb?5zv8__vPyr0-7VKDdY#NpF|8gK(GZ5scR<+YtzWkdfI<|IL&86fVKfDFB_^Bx$c#1GOdzOxq^59cPy1`|_ z6RgD~Ed#`CI43q{-`qlMHRa!Dik>?$Lfh?AP*}+v2ialpHBmunqx!XVk5QAb8J)44 zJYlyAN-@Xj6?J!Sc(ZBX4i`rFs)Pe!oXT^UUAPHzshOkSx-NM=VC3jof_HHoPQEi3 zVd?kWx>^#Z>xQz1vY~x%kEzo2j5C%wUWD-@N4=?veIM@D2lTZYMA1_LPK~s+eeNG_ zu1`ZFY-W6)au+;KN98L2O?r-gtFA4@eg8ay$h%&*Hp}T4a^$wf->K&Ne;b}n`BHF4 za*oF)i76$C$+o3w1^ry)pE;lr+_5OHsYa(I))>-s;^NqOW@=!M z*AP*V5+Gi?PDi@7?a1^J{;lC5>|Cpa5(gO#6sYgtTaN7fMMj4g3LF8vX?2v33yECD zycfo=)`c;?%Z23^Vam#QsC)=yY|TK=uu4FL^1_Cq(v2yhtPI7u*Zk9^8d2dZVNYXo z@jN0*f)kZfxun>CNw&K0yT$=buMKDVtM0Ev#a^u5u9Nw?NiTL!=1ss3;jFMJMD#f| z7a4UXHRTd;hI;Rv=Z^|xo4e$0Y&9`Es5lA>jk|~h*TYQVfaN*?oOf#y9x?&epMjiI zETklRnzeOPsh9{O2OsOdcTAND^b@?!H_6mRY{w{G`VpkxG4&G0G>gpn=TKT18-aZ; z6=||w5c}}0z>W|$tTBzNhOpqEXT8Vk z&Z!77GcyJs=)}ycU<1R8h|ykNTur?dAmqNMyfw9UAMOl$ZC{8n5%*MH_-XZNE_68K zE^L){a6aIBNYvLR1>!vT@K}UE9Qo?sy^J3FK}7M4X%hBKn9o3vNbjIv<3Qy<9l)31 zJxA9JgWZr|-N$z9N2iT5YQLp!iY2ZT`rMMxPVj4!)(5mCMhUmL6*6g(I z`!50ER3yI%xde#~XS9{>D;qWrLZlEhcT$}Imt@4?P-0mD2X6!dw2IQw6??2}dl&CM ztHGN%z(v{i(~w;-t-}G5EMd9rp10s9WEKMur1*_0_LOwPXIb-b8ad~trP%M4m(F%uDgHinnilfE_0)22 z_CgFRO~#P7x-oRL?hsp3OI&?{l%6*ymA5d+Gu?&LBUUo~uhsJs-vQKVEmC`BcMXe~ zB=ak+=%?_pX^yiHb3Gx#sfm(v6KO7wxAUcwmC&7!lA0&nivLOx-*QBPlNH=QZ};Q* zz`y6Yx-GHfb7Bj!mv85DVS9ZZX?;;^7S0#r2j-?NQjEVu0jR8&76*WPz^*r*R1~t0 zvR8l9T*&oZMKb9mAX)Q$o>eEz8sk?2ku#UEKpwzp7MC}Z@@J;QvQf)2s>!T)FOCO^ z5R8z5FnJuY5(oaS1Y&kNo*zwkbu|7%byZTwhMRpfJ_9gO*DThA&s&0?Sy}mzxWgnM zk?dFPYMw;OC3ggfzKz*Ksg(QDwCrP9$Vv#YOxz}e?z-zi=p+s|UMYIwgQ7YrF+o#- zMe$(Ud|KYXgjT)88*c#uxQU3bg$#&GpaAu{F+b`k^;XiE*7u^Qt}D_QN*#8wzfQfb zST22K6dVbJyt<~ZJx?o*@@|<9f{7d%6ke=zlhtrLa>J}yXnrF;QjV+7i!fh02v(~E z;Iq2{OFTsF{BnyL=LL8oGwgg$WrQ`<^Vwu~8NG;Wx?TM2&rNj~>CU;PgyRM&l@(=& zjsZ!w=)7OIbD2%y!lB5^JExE}*|YRVl1w>nQ`=RXy}it<&q|TzZq1SUiX>dmCA^Qc z%II-^)Q>{T*}Nyznx;_m1JT3kY}5Dc_lQHK)asQ|w(FXa&T66bXGw6VNe5QRUyt>j z5UHjq^{LI3cY{55tY3=|i0Q;dLnCFsU3`u41)NKOs=Xe7jO)YFnte8eG;XpSa>C{K zz;9=IJae`j*(4?%qV)r*d-t)&WgD;U3XB>6B;Qsa+a1sWd(RK;vrvJ~j=NH}6Ok1O zIoH11SVQApUgRWfP~K!M(1^ z7JpmoIgSP?MbTF*Y3=D9L=r&!^`Taz-(|<9r$5v*N2Z<{P54tHXrJjjJmV)lpZ|)K zo<_>Ty+?;a9o~?rkBXcL2Qac|H>rM$(ob66!*1*YBi}ac;!865CD^&%RkYMk1!cTJ z2&)M|Hvx-(bpQE+47}A1nc6a2=2Mdb#e=`YG@2mOL5;QO46Y9-popI(q7XvxaUlB< zRBrzkI4FE`4u-F1`4c1?i`AnA=NjpJ}IzFrZg>$a_dL= zS(q1I+}jpM7+l=sW(Z$|STm=Ekyr6Xj?Uvy>NxW9J(7WdAianNqsB&(zXM@|>lPGD zvH75!U>j0XVwHs=r4Sc4)D5#>DPGCi#qOXM;2fo=sAA?)3v@!A5Wedd@);i&i(b=p zPz&FOV(n>ZR%yq3ygthb;XRbEZ0@ zZCTcJ=MBG&^c0uCJ3X4(2vo_@hi=$AMx=RqA@wMK|Uj6%zs1nYBrl)%rzX8i_?OP$gh-NfnoE*ZS=N z<~@1piD+otvBkT%;VWD@owT6m!N{$vAxAanZVck|hZlo*?d_)R#1GnQ%^q{&e$ zJF+?ZXG^{~B1q8V?K?1>gS}5RRUs`XB#eo{;nrA;m0=k)5Uk+7ZT zuvd5W$`Lhj>c7-h@Si|kYiWyjDKvqn8GIj!*3tDLv6^Xwkw%NTl*{9ZvCaGWQ<|H| z#`N$$?gnemBqRLY#>2r0fNs8M+4w@W?9*5{r2`nTnd-U*?(2<*OnwiYz|NisymW7^ zcwY>IIw1|FU2u*|@{SrMoFoZ}p9D!8{DWtO)xU9e&KpQy2B#Qas+o9K8Xz16Lwb@& z-o|7#Ghg1bn&`Rq?(jK9j4O2~wC}lV%skh!e>Vvwu@Y;`RqMpAhnvAsUkIa6cz9oI zmV;(8ZE=zYA-mP3)0Rvb1Us#1$gVg7C%N>DYCWS}_|&-(IQCylgbsVHHVTzh!`b)S zLp_k*{$@)3Oy*c;ZNnc| z3`2(qYrQ;p<+ICpCt>xI?(auAveR`&V&=P970hwwZ!^Z9R{lYCT&LdN%m+fg%ZaR@ z^bBUmGh(WEf~+G=o+E~a)7c&?seeqYA9GsUML!TS&fZP-K0@K{x)d9Dop^RpP#kgR zjREIRq3z55&{Ace0l@V^Pr#M*=6exsVw+*eE-&BzD`!D8r<2s@VNbVZ|Nl+OGzgv7 z{#$yPH6$3u|MTVdzVB~0P~CQWbep2TR}gp)0RJl6`Lz@prcW-wSNk&p5kYTPhIdZe zJS3MBiUSNvso5m-PY&ilJuw3$b%wpYVkK8JRWwPXVC$}yZgAC|KWKhfy-qolWuzT4 z))N(OV{_8>`_%r-b+h~#-MBCZ^AYr~)rs6Dra2(leM-y4+5`@yG(At2v`RowU#9nL zkgNwZzE(0Byu>ck@p z-cqdVC8Ioem_;aC1SU#`dgv?w7paMPYfJ2Iv;DO$Q*V zv0gJ{s@SN!I%B=(|AC*hv_Yn*K8Kv=A z`jd~e5F5!8_|`$|%G%=9i!0z&4jzKldC{R^+VW@jyG`NW08TZ& ztI0W0h@Y>wI6G|L0S$Ats^ssQt1a!WiCbODXCpon*9CbN8yQcWGNJJd$?^2Gdp^BV zh=tQAF#^aHH5Y=2Cg`0ADP3$SuOiMTU~8*(H1FHn$bpKJm8%_cu;+)KZtl*v`M;>@ z|HV&zixX4-lr*+?6M_Hm(8cgyT(2^yN4DE4difq@k`Cp*z9xL{x%y-zgNwkyzeRaHyNZ1WhRe<{@IyMiT7}VPeZJICC zT`S3nx`XZ)T;=Vk*9{_NY`WZMD}u$c1Ld_;@rgCCO2t5Lf6j^rh|%g7FALtz_-*I1mafxDoAbg{X+@t&`Y??xAIG_nVu-I zgt~GWEYOj?+>BM~H{=P1oJS-F0FVz7?&_&Q?fCT$-Tazfdzl0oPr z+kQgoNh0)D@8r^UvDr_H^QHY?z2!MMs7Z)dWzd~`X0-UVaK6V>v34ZX#*FOA*QbrM zRd{9(U<}iqZX{c~5vJZ`wWE$9cm=r1sAn{7BQ9Frb7O%8PJ} zL$bilRbQi)Te)uhu0UXyo@{fXyI>Mcl5zYoGT@qjNU4Bu5#acA>i|=XcW=ku$t35e z$KAo}{Wvx;st^(y`=C4PepfM3TfOk#5#g?P#p7FD>z-zU>Has|cHQ>2SgdGgWk41x zqF-y@GStWXXs2Dlp&*T;*gadRr0}DZt%IT#G~tpcj$x;2BP}mP7~^_5yAkBys~BqQ zC-IO@RjzTybd}*NAg;ii5Zxf(T~y-^W}y!t;rfAl67#V&1~eul#qGLbx&9?O z25-8bDpCbqoyon50kp28pj`kckBOH=Dx;HCzc|)-H1d(xshw-YO?MraTT302tydOH ztes$1`&nIIil8N1s-mbG*gE->24y7W6*e#@;7V(6V1m4=yJ#Yf)sj+gg3xl|s zQ)RdpYf&1nwiM{j`nncbvsq5k=-xCwlbn_fx}=wc{N9cxx_u&jsmsAfn`kgc@mBs! z1B^l%ww72843OVqI{51HgtxfHgG&xeoN>9YxJBEVM(LLQYh8%(bX+n5cdhHJ8g3O| zU|eUTa1!b|j^M_S0z27?WRnWS(lHy6$R7^~UWEbj6Y;7dT&tN8Oqu!HyU$K@zOnYY z3TF-*iLBXD)_@=R*oqcGGJL2wXwj3ivcH~9?pEpF(RZaCAxY2YKY=S2o)+`5i|{sl zjNwA^inEWm4_|C&sPJ(*DQsPeu39^f2S909>6;gqYSaKh;prngeUum#hly>k7oPjL z#{QACL3{o}#pTUT&tmY>xxTJ0FPA9S6qpCN@9LJznB0ffz!fEz@=?f*T(#hk_kl+( zY?o0TPZi~;BbioHhwB}er6jK_Ppz``&D;7rm2K(NBj<&+cf?5DYYZhw3QEoHRqq2w z`8M0&&Km2B4dhNzLYj_tZvp|d3#f`tN~aW;892UI5qPJs5jsx)N2R1e@J{@wE zc=MknF$)B59JeVR=hN)ilyt&niM`=}b;Zo{EgZlM3XV(ILGQ9^@hD)-g=jHwhk zClm~#G0FOnE0J8zX1*Jn6-yH1Z$wu{_)&PpT9>@#xVYw{+A(`q&0!;5P;XLL@&T>w z8p$a=%D~oi5#?*`C+0Ce`Y~PzrZmVww|EQpf^7RJ6Rwt9r6G!6-^xLB zKSXl{4th7bkr!JN4<8Vvrv1j?~AQ7@w-Now6-@Estu@hec+ zT?b~Fl72F#V?BMMwH_YYhZCb~bKu+y@OS5L=tURGNJ}S-EwWQJaLpF1fs%^Vc(rRr zq8W?u=40}ocoL|Q!V2_6XU?nhq1gBtqdHx+%4{d(&Zh3uz*t;ki#t~z>db)x(L~?7 z5s3aYzfDyKF^_Ts$*RP&R4^tlZicM#aGhvd0fNAHi)Sh1st=`wwipJ)o zLoI6BeBBxy$NSMP|AVUjCaIABi!iWxnD6~(dRV}JS-#4^u{*B$_`2vZ07t&>dHmYb zGwJVuY7_-(Vnhar4|o;rmgNbzy33^mY4{cE%`SL2qZO567kk4pu|{$BBQlUp#2H7- z?n~5)Hkd<`(~foj+{JUBi1y~N#$;#tTg>l|w#|_-SRN5J5FsWNLiYoB{ScEK6|FVA zv}+RxOAT2?h|XcGNikNhty1hc2-FEe^w60gF5pu^OTKyD-ZqP(plQ-a6luIRIggp7 z!!Jwa(4frqs#vKcz9Ui;Y}~dzt_*@J31@9SEN*(B`-7|jzh{x|MV;3?0hYB5wQkn3 z$3{djaZB&pe4i^;xErT6FD(2-@_ihibs^r!zWNcy=~FbWkhWzsh2jhPeike1E(0k7 z?o08S=wSS{)nyt-mm{QQ80(m&X1Ps`5nqj|ipYj$w2rsg+%#c!4mysl3itSFwR5 zwZegaiVp4)m+seFOPl9WmN&6yk?YCs~ zT`#TKjZ9C8%sjv^7S^;%9%81<@=ZesZs%fcJ)g$waQ!yKII%41i*hf|2DNe!OkpbP zQ44K^`1LX+Qi>pyWQhmyMb9I zf!~dfMe6)>D#z}^GJHrAI%Nq;nJh}B=WJfSz_$>uB85OLK6{q_YJxn-CLLCR0(!A826() z_KP=2VGi5u|8fJn=l<=QN7HHo{&O>{Ab4lGO{v6%m_<_^*LZZ`f+IisoxvQKC+&&W z!Bxcvjxh#8>JJ}9(9*Y3a+v^+@iB&&p7(#VC4Kq;cW zs;`?-di0F?9IKo$z>a^p?Z9F~5VE3aC4-|G^>%y_{>Xv!)~xC?1wXW&QBmd?~&~0jFh_4hGEUG76L@)QP(M3XK0W=bZ_u(+`MTz9jhmsRtQe< z7Xuu1Qw|B#qMY!<$A!@i6Bbfgy{b0GM0V>E2^`=d2QeI>@mmrMsyr6G3oaU(%?+a3 ztOc-)9!Vc~fB{M{}sA`{P=l6xjtJTwjK`8YVWdS5>F{2vD4u9xj!`$hMf zSft@UJDTg<-|niq&Fkx-#=9_Fcvtx$8WMSvnTmZqAH^&_mgF*rW_fgtxHsP>DSm!f zC~-f=FEVnEE{!>&lvIVxDuJKjkTH+pW1JP_$P1DQK<(2!4!!^n#*_xl?K9A_ui~Vj z%#X<-p-hM-93XFDPJuarS&*QVd=x<7MBMy{ZeLh2ZV4Sl-t##-te zZF3$Xsex^XN~0s2?Hs{d6hta6-jRaqehP=kQ;?@WhZ}$hwJC}06_G9!<)}je^f@Q_ zt5PbS6*q!Z0hD8+C-?zN_gsa1{KC5Rc|Xr)wE-YBn&n z8cxKp@OtNgt$H)3??Tv}%5cGs(vy*h>h3I3YbY-igU7~oV}x2MKBY%7!se}sDV%P% zd`5xCfffp|?eiD}%b~B5!qX~vwCf8mm-~U#XZrJS)0S!3W;{kmeyp52a9F8v3FoCV z-rD@@Nk&sAPtU%3Vs`^0?Z$G+Q>zl!D|<}cL@gLORW$O$Z27B*MQu8LwBFh z1+8T4Y7yYUE6rTN4tcjXxr=O{o?HUq1XCk943ssTV-RYixREA0DXX_)PBCMz>4;AH z?r5D>9%-6AnM@|FB862)wt4<1kqGtYtTZ0@tCXm*xgWqk$tOfgAtp z-^X7B@V{OLYZ@5;w5XUpAA-f&6WcA1A!(eD@A(bo>Z+3NUEj??@PYI}5Q<;7xmN3W zkJ7di)cb0zR3_eErg#nYh@`$?d^d1iNKh=c*Xuy-ZK^eG?CqttBDPE6Coh@#cgW%? z#a>kt#8+*^a^t=!`;w21$bFiz{e1|TQ6fA3V7qhQ@YI*!#nGliLv~8N%<3Te#&Kis zzAgLJ@Ou7E`@c4#6o@aVX?@6@WeXzy=J*SuI_h-V=e2}fuYcG#R|u^H_&vh zMu-On65@BmoWLk`(h1@Ugk3{1kXB_hUg=w`{lM2S9~abFK?MLww@=;r?}{%rfoUEM zBu&R~UD#7)wR~hp&_vO&{Oj%{-6IGgw*X~^@XkummJR~Y1lI?mf$b?F=mLLVU{<3ltLupeHYjd2nMt)x=Tb^30uF8qE7LMWWOL z6j;rqG?##ohu4jW(Y@6t!r>j!TOOmdSEj>ye=P=(8!g~}mMK;0#5Uu|S~(Zz3aAUj68kUbAKKZFw|P*+^Y(iCbYfL+-z(N1Ukn3`jJnpJw2vps`fOe2jX@RW6e zD&KAki#}qT&->UlLW`m<0p98Y(T%&%6VUj}oPEDhiA5mN#q)8lmxK3p|La2!K6cw@ z7@Mi=*lSKRQrkmD#|RzwjJmWscK;g z$3Zh8#N)lX6(Q--CI`kZhdagR(%)Wg?zc-^6%=F| zqyGzw{m&?J=>Hmdn|X@$4d&CROW ztZB|suRIFs}s6O-9o;ymnn0WqraRG3w&bXsmy7CgOmt^xjwcxsC zN?jqHI23yZe`Yh|1uFNACPXw%@RouvfndT^yhvM8m$-v2Q_K`VW&I(sGNJjnd^z&1 zjWy;EJ;29s-j6T1vcXiFAm;xu^;c1GHC)p+8l1*0A-FY-1$TF8T!MRm;K8ABcXxLP z5L|;xfZ&b0yE_C4vdR6A@7>Q>r+v7_T(hfcUNzYXW_gvbGi;hUDrjR~GF810Bi&`t z^e~Fa24$0kzO&CxDi6x6;cd`&bdRWpj*9=LOxhvbu2}V*IpC#=j~m5ri?ynfTLT)( zeh6R(onso*gUaPJuc{Y61XVcqZMNO7xSUf6w-xp!S~wK*Y?VWTeIdsuK_sx|MC_jv_4%k&u5ua9d@T}a{ZmWab>)Dcd+}=pfLeW^&8YKW${(evVTAAF}fsWTP-v=<(afAIXRa z;jB?rieLY_y;OOMebf&t{Gl&`Sr$?cdyYl3guBK=8EZdznk79*KasF!Oo8IxyAe_o z>^k|8OozS-dyj%KErP`ozoDW+r0PI!FXX)Y7}?RLKEE$2IR-`zhhUD#g!5$JM~d1k zymLq~$T$zyK~`o^Zitu`4?rA0jRJZ*#m2=&`Hhu`2iA*P8H~@6Ms%-GIoF(sI7>kl zGb4@?bTWcP(~3echyj2XF;k@OO_F3=`{*7gR0q+hqL%V~%w(sfahRrJYP@ZA+t5B+ zHkCz88zK~Ge18I^eC6>^GNjUh#987!lXGSEp&L9hb%^{GTOxbuMgbZ}r z#y2DuS?7$ZA5ODZA$V^q{Z6?AGejQ;HNm<4RN8C*YxLt_JcUGLh>72?tzNzz2u4wh zT~{3mvauP{nMs}cdX_QwNhBeXlc}Tp(>m{d#s!};$ZnCoHD{mS07{m1L)YOiM8gH*S82(j`zuAT4wn@qa@_Sjq^Cd zGsp)-Lqj|zMzYxFc{q-S1TpSszsYXQLF55HD?6-Lb}d3+)YoJd;WW-z)2{|ry~ zx{McnJxz*k=tb=64HAkqh4Xy6+}*tDSMT~zFi#7w^hy-lQq@OHs`LN6n2qsEzgN=g zx20vfRQcjmMEm&l2Q!vBf1pLmDnrbNjY?lf zHp=nI5La3$D=g|2SvW--{zPME*a6a)zif=9!9!{gvpjK?r)vNF%8AUg9Z>golwUP930G;d-Q7w*re~e{w=LmseU`S32gdT)00|%PuETW7a@hfduk(HoA_N zT{Hv0l_D_j+aHuFIN6=go^vJ%PGCKm^Hxo44(G&~gn`;4@qryhJsjtOdg&F0;ZTbm zY$51nBU@f{Y)gsA_E{@?4&bILzuJz#gjBSTxs_sj3`|unqj|m6{7Ks-KU-o}DiN`X zHZYN|Ua?V$mzLEy<<1u&uU$3EQ@RM1|NS{rjG~=>R9PcGE|I^RzmkHAPuHO@LFllIl9Ch`6RYN7!s&@$zDE z-;ji<8j4})_1LpHTaSs6s`Q3E1DyDbP?dQrfw$BxK_@I*S*!N*PoaI6A;*!8_I;hp zx$ug+AEpsQckPlWe|_a^^RSV>id$~2W0dpd$t!q8AaK^$x> z5iB;PHJ5nwS+Ic-q-bP8f)!K^_EJpn+xdC=I`mrLjW0Ja;i8cf5`6H^Q@R|I{AdSA zAXC|3_F&cp@W}#9it6*^ugW6!gq@hV?=Wj@^yz9srR25l1*VBo;{JgQ-kuc)K+eLS zV7EX0zemI2&Ezf_oPM7QuwWz-l3vm!?|tp&SV^%+C?}IFhtE!k19;>32Lt(lcl>IWp{&#N;5H%R(x5Z^X`G8wD_ZB!KN z>;sMDFu-jlWA!S=WX;18ECS?rkLPx*t=i`F~z${%R7lC|3=e`sWc)_v-o z{xo{e1^w0k7{sU{FUqkq*|F(bC>>(xd(x43^~Z|$J9QgXTLGxA6~yNMoAr!;iQ z(PaqVuzIb~(5V9NwA^J&#|?>w=dk!PtRg?Yb+}?Ax=TedUabDi!b|iE)YX{|bp^ds z@9kr_&G+vV^}igb**|N&Yt$~%`k(BgyXSvC>bchmwQGA9U5ZQ}NX1YXAOQow_$4GN zDu&e)k|l0#yExBMG%`dR;3$jNBWILks<|x|m)Jm`DFGv@l;9lFO{l3uvp`RMfmK@U z+=%{GbTTn%AggGm6u=I%X?ti1w~WxX6&cvKv9|WXX{rsWRLhJ+b!4B}B|R^ONX}F9&4U3ao zPd3%^x(t;DSyHPhT8n8{ny873cS;mu%NX*V7S&nCe>!Kzt0Ljo7H6sRRM?>+rYiJK z)7RG3B_JLOQr_20LlC69Db`f1xAj}#>QN+0Dnczjwq4J zMLX*5U_es&+$8B3$+qQmSkk~4(7-z_Q9^kS!r46I2p>*eMCbk@uYB`yczjSI6_9tc zd0nf4l&TkUhbXypDH9OGXEgAR$?(e@SGB$ro~Ohp>u`zPs$@TA3|06?C*r3siB~ee zN`LMT-;zC-A$4S<7fl!1L4sV$?(jR(=l@ATk`Wckj!*p;5t~ zN6v+twPe6WG@qBq1dz55VZOj}hI+6opbb8UfsX316MASVZ8zKZ$4%SaS6bDn@}Dc1 zZ{j0J+&i-}o3=gQp=y_!##S!XB#TWJ=Ntbpwza5M!{hu6jU*Ym>sJ!gGw2Y|TQwl* z^!RgP-~X+}TuH$({_~edQr|y9Z9P6wYsIp#q`~zVvK;V&^ z`L)({(0KCUf%=5Id({E_R)oH%|7-;nk>^*Gu8^Jj>j zWxTYW>;$n~aMEh;}mD_KitI8!NE^B)vlqt{5=Vy_CwY67a5J;M|ReL~srygAwTG+wVaCE&UDlXH{O3$GqONz6I`|oX zcCy9SfkU=a3Xqi&FT$JbfP5Dzl|Z%*eL(9%{xiiCIp9w}JPCrslor@juDNnF)%Lwi z;AM;Xqzn1<9B@c3Wzdpu?Fwv^(YaX5DVFuu`@(ia2#g<|keuvlXIG6m&Xh}P(C!7M zJcB?Uj`l9DBp+TPXjpQ6Z_hTV!+H1b_pY83;yk10Vf!2XeV@W)S6@FvR}ADlr3;SC zLzh!u;dAsIPX^oDN`bQkWFX#s)QZOGDxvO#0mV)5FGe!e?!bE2tWqXuw(zp&ZeBdi zP>X?56{h!Bw#z6?i8pn5oJ>OK2QceTao^=C=|U&s`_o~2!A819#KWKZKH0a2WL5Rw zto7M_jK+P!#WnvmMErlxJ;Oh|fNwDz{u^-Us(XDMZhdh;o2)fPrrWO-mPcHMQt-#p zF8iiG%x}6u7C*2u+FA?ZNnLW;I(0!jrJ$^PHc!(72jK|4i;tL}n&yc1{qmKG6Bi<5s~Gz{+%QORIA+R8oe7e2$7 zi%Av^3|gmez7lGEvLCH<8y`qBv9Zx;Vf!I_dZCxvy~9L+^JFP`ZvG%K4h)a~tSF6q z3XJO%%>mG(%kVxplb5lF2%4INVR(XR2grYKOsI7S{lsxbH6W=CMu!Jw*((*w(Wr%OxV%QzM#X-+rI%z_>i{# zw#j!ku#4d`o^DsTL*$S84VBaUWfL%~78Z{ac9sd4Q`)x68-3ibp+SK2=L~7AYaWX5 zSf@8q_r2aP(3}_XBo(hr;#Y8%)eo){6cYD6EK4@1vF^YhlFoxTY@&QPbB7SNq`~oQ zBW}sZehJ`Bt6WHu)vRxbNI=b}^z7hT!yfvDtZtkxVpO8kLvnc{}^{|`p;2R(F#?96B+5Z zDsQ{2J1*Swt<{G=26Uz(0|INq-R&_7qYusW&I6fmzc6@uvTwg4ak)Qzq6Z5|LsIlz zDuOF?7xb)!6i?5%tzO3lmqt272YTS5`|So>L3Mkcm5^~I(Q2;N>&yOWOu5cG+Gi9w z!LuLP-8+o(kFy#+e}5d0a?&LBFY5$I(04?(9{jy>dugMJzA_oxoVB~>yZRqN#jfYy zi2jh(Eb-rR@+@$X?VEL*e~iXuU1-bsz{m`xwO;^YONK`~xL%rRhg-Cdsi`mtf^EC?oP@dsr#nePK2UjK z=nVM?iLUZ;5Ltg{UWpvyX-AkRTs}(uS32#A*10LREKHl~ z?}iImzjk7Sx$U>#Q7VEVI-`@S^91(4U0lCy#V7RPJ2?y}ejmK3SXtubK7Ng2#*o&W z5f?A$cS*=rTTr%&Q}}xl6^kf=$Tcnecuz6ZqD#i$<=i{}NnvW1|Cjs>iTg~`8jRE! zk^@~PqdlQ(cIPxRT1nROuVM>Sf5Z07MVogPN-q!Slu z^GiUC@6LJ5Cr%5U1;_U7XLHT*N9;LW*U?MKIedW?DRE4ChZZN6Ro}4NzN&?xEtS&Ri<`l~c~>}vlNtUWyoUU);YZaJ9=Yp?}B04C3T(FLZKN}@*Z$n!Y;PW441E?Gew?j?Q=!-;m!yyB!8?ruy*okcjfxV+m~oUy!TJ;JfJDiBq|I@0p9O zKOu4<`l`HMuODl?fCz*(6HzB|VhMA{!3l?g)Za_0L~q?gi~81t z41L!5kUdd4pRKtGXSuXg;3H#A3=4}7E03deS@v<+PuV%=uk#=eD_55cLnaCbeDG9q zGct+|jx&A5UyDS62Fj;FF^h6cUsE_m|KFZlr}1~g9bS%aTA^8IpND5J1|OH3`j;5y z=uR(Z$W>_WuEPXyBk8c`jK_N96x~p(*!N}|1YA6Vqa1C$6F&DIJwKgAN=|Eg*{~mQ zxTw{5+1`RS?mSHkvk&19JoLmx_99sC#q6Z>UpvYSFtyZ2GT;~;$bXq`RH>?3bV0tDZT4+!tFT(^pH(fo(slBrnzI5QWiTH1noA_he`SosXfIF z#rN$cD#eE48&dv_7eX9=@<6|rIsV@nKk{$JHwm=t{5Rvr1TQ+=vu>kv%0(D11O3Us zIXh1D1r{+VB4{i)?eI$~k_U)FH7XJ!Q)3C3Ke265;@)MtDW!E+!jilZtLRlU{WSx~ zVC{wyE@VxYzTp08U8dZ`BBFX^<(l+I*Ps27%vGE;OB?LJ0=r0?C`$ovg=nOJt5w)U z4?x59lp1q6hz{C67#hGVs7{vtSj1ZD9-x{FhajzQq7m7Dfh7T}fa~mMitxd4dh6(_UdcuGH`o!^0ao^KUPh$*0X_tS27t$cS z&=^%94etQ7MRqiP#vY#}JP~-faJmyy5-I(2QQZyy^|1GQJ?mHy-NXaj+}H^4I%eL7v*|aJ&})bp&1wa*@zIaYro%#@S$56> zMai}aWGi#_mUU=!fUJDEG2)ZO&fRfea#o7(|B>o;{eN!%!`1Nn=&7b4z1jW0N$=ML zp^uy|<<*4&@&Pd$6kym#sZ3oxF?-{*FZQBXX>aGXCcQ)s&I4azokS6tKC>;IE^&P< zSEEZfTPAqA$jDPeyuc_bmcg;HK`;B$vftgDAp$5siID#8g0NBuP6mU7dvXZlNc?s;c^71ox7Yb--SiIl0I*2I_MEBV{nam3m!Lr*deWN#J%Tt z#V7AF)Llvi?*xCVD$da&s6RfprpEiiE$ExXh7Vu&vw+ka8h_`IK7(~=Y2G{^KwXg~ zKgjD7*~YD}<}aG+QpiApIuy6q-xpH?WDBBNI+lY@QFdd{TsT$B;GkyKtEEWDC-7Y5 zt7%KS+6J$iN|8Es09&>kT$&-~R%>>@V_KcomG-x*2S-}PQUML^^NO=(GH7*&aU?E6 zq&i;rJwBg4Zra%6tU=?s`=Ix3)ePgC7p2{C15j*!LjtyYiAR3EoAkigy0IjL_Q`k zG`z)DU*13QxQ?tGI3@$JrVePkpRcTrA!!AX@LZ1qPt&dQvxp+=Gh+rc?A+lqg4Qda z4w{?2RroA(>xEYG-3Fk-^Pz?&9n{8dPPc`J@hbwE277#Ju1SN;~mImJB6%INCe&lqh*dCb3w!0G=81 zjIegL9OJ~o<&vU|PAk!}gQ9AiM1o@7CJSI%`GYDRAO#CEkh7J7MMVpM3FP56!r{?n zpnF$DxNwd8P)FH?0#AR1>^8Et^ryJCiMDW==+lOgiDofx-JT*FQ8vJ>VQGgvzBvBZ z^taZ}G}(rc)30`)>;m|I({0`Ut~$WOujxPH#KwGQD5vJZ7R%oGK_{G%)g%&^^%Uzl zoyL6`tLl=`pERvbpTGS+;`ECog2JAT(17?}kBg0iP=b2^n@?OXCHghS!?!=_Z1;O| zSyS9ftGG+4AgM>5(+#4Qr2;Rdsq0LA$QAN6Euov)YC;&RsFTz6+U8^%GiEG=IsH7_ zQz8KBsaAz^zr)FD&ct(^+eB4SmbYrnI3h%-gGs=u%S3k=dt?1QE;Oeu9BDaz|6AEf zp7omN7ckG|9%;Vi&pzK%fCt)UkVojkjCvk0^j~DjO zC+m5cz%@@pHccp~^;1>9;@*SIN&EQOR`#Rn$r$JMMlV(8>%>60we6wgyy=4{skV#v zYC?B=$5ht>^gsbk=;7oO|6ao23`MuMZvnv6-J>k>|LmeS9la9r7G_+FAWDt|KMXN=o0fn zfANiOBd6E^d`z6p*#%PRmn}<+zOOl~NirI(7Eh5eW9SzORp{5Yu_IYdVhaqBDQJSG z*%}c(QiJ^mS?lU$#{FX^Y0dUHuVLp$V^!QuAt~hor)>#}06wfJilN{4`Mc7ge6KQw zhk4o8`H>2DI3ibSV&bc)5*EMBb&C0Hi}!AGuhgwa~&q; zH}H<^6GC3XA_KjTWUtG~LJ=LaDbvwk*h9j0&{=gBVO$Nc130sVW8A zYF4DtG64$x)#(UveTTLuR=ie6VtDWI2*}dXr%!bxnS3)u)iO{{Maug9jg(K*1G&Bq zkl&$z6-Jtl0=p_Gc&5YY{zmgPr)U9lV>9C{pK@sp!&+h)*q>bc z!u+(}J9rS+>G;nbfiDMbdkd^?tAYXB&-u{IkzA*z9s9pmzT}nzXFORB(83ySAUwOzoYk8&0KAgf z%NF*4Qhf*RLx*IxOvyYuw%un=y2VQj(K_uJHxf5G6tfB3h}baAZF1W-%NxNvDPoH}jZuralnPIKjeeXnA5xh%Nn>gNB+Ij$xAi^(wZI)?w(Y`g67Uwddz?||-W zo6Hn8Yx6bzThSjFE(YEj9{B?m3M_#b;ES*YfY53^%S(ZZK)N57Ce06p1$CQOYg3`A z5V1TeUPk~XL~fYxj{qQsOO+L|h{UF;BUs3RH{<}brLe=0*zwb$NRx*}D$6K`tomh) zMX;i$4T;uu3KzdaL&382m17@^JwYJQf5L()&{jadzH0mhDSouEw=vwjAwP4|I|=f(u^VX z-FbHYWlSl(G~d4u=zoA+JywTkAz7k;Z&kJ$^ltTxvUWN97p`;e468z1pk_|#4U&c6 z>7Ikv3(#5NJat&Aqzt-2Erc zY3e8MjT(bWPR&iQT-MBogtW2>f*pWj?rlZx^_I^eLL{1KYm=h2P@WJcN%D~Wd};fl zOECJH`H=;GGQn~Lb9iYt9?hsKk8~Ell>BWM38Epe>Xpi=xU7?X6u62Y$H2c$4ptlu zLL+E(x?D)rS7}Am;Z96SH&9#j!S2`o&3Dtmu;ES?x~1Ee1yT5_|@kfWq3<@?z?jT zzn7tob%;OU_6s$%AAU6gL`ba#({|eWG)TDxsmfdhXf9oEO%hCnsa5W$doOpp)ET;V zvzJjxD{pHTnB0In(D8-I5*r*pgG3OS0_9$0^(aQAtK#$RvwIce=|zXKP2wQo61F*kFT|DDtS2UDxQe(R}t zc6rfV`L_r8nq$f*Kx4(do>-Z~9)wci;So{cfu8|JbtHj40R*s!g;7k6c2J1e7K$?( zlcE{yE^d(yA}J1iHTnAqb&)z4R5P0-)kZe--)KRU`IjIVJXbbyeK`7?d#9YzlHeai z{x5i;vH}ML4G3CkxVmC@aRjE8u`UP^bykTSA2xB2W7&yN6m$}tJ-u|Ic4ggb3KIa1 z2ZmObjhXv71v*+Q}=S#sy@G`|2&i?i(V}D zFq^9)XFN}ib0*N@s!`+SO*C~3DDxG)pKl7@hVhN0OL}pw`e^f)d@cb#oT`Rav@2!w z$v?std%4c78BJ`u^>ctCAI5Ggy4Bn**6F+lA|-6Aqu3h&P-;E;KESn!2e3@{Eg_1g zZU(((zg~j!B~7L1wOw-SgKLIzS;_UX99=A{=Mg(Aj=Qb>ZxY%{p0Gr0 zZiNXOv~@o69=#~DQDMrujH`eJSwIULnT1htRgu?}1p1kWI&SNY+Z?HFvTKs>9tnA* zL!<=Te-+{HYF+g!d3Ybfcz2|wB^gW(vqx`tFv)3RU3iv}@Il+<)8E%c;Ag^~?_G4; zRCdeZIK7_EE4g=N8IIgG8zB+L)?Ue!ka^!9xxHroPHDR~5G6A=3k8OMS|@XJ+m|Ne zNi%oLpn$1`wzTc6c)KD9p2vu1wo!YJ-a^I{+eUn49HAsmLR(9S>LlB7CSN(&H#X>o z1-FkY2j$ro@VhA*pGNez69#l2Vnf7TFZ>g8qz(0@&10Xo%K3TX{~lN_S{B4zu3cUN z$VO%p_qB89+W99hfdt`Q#2;E?1|5+~&$-%LzUPKd^2k+|nCEsmL0*b&(_q>2KgF`| zZp4+yu`9Oz&yi@m!5 z2$?c}Q;H#$Vm%2Qa%zg8jt8hi&q=a`u~F9Xwv;uY#dypW`Bl%Jwlc?(%&{OLr9v2@H6a4fIdkBpdQaU1t=`g;j_rk?GV8;uUb zk)Y3ydh^;Dj@8|2zx=1F%og#63vKR?<`yqgI|*I^<(o-*Zty4h zPL+ug_AF;Sa$EU>FAen}yc$2a%0Yzhgp{jQ#u9jc@V1U(E4v2ewt5&1MLk;|7f(Sm+31=b! zitb3HxE)UTL;^yHI)-Yy*j9qu-&Z@E3NXrhotRC5>8t)< zYV}9ZPSG8aqA7fBDb55CMBJEizpi2< zXHvt|wH0{*t|XQV&Q#J&K8`mAm(M@xo*eCnD}e&rs^ zo-)}Hne8DQUFrx91ByY8D8OGxNxebP*NIrm?qdBdTD05&hvSGwCYq#pWni15NKBRDo|In1$WMg0m5Fg$;quyzg-DW@~%)XT`NkL@;x;mtgs{< zt!5g{L0!{L`BBI85WorY@(-CV2Pj-7(;S$J52k zgg(-wvb7@JkfSj{QHvb~jmDQa0E2B932RN#c-%HL!LPGb$=^OuE6}=laSBj(M6kY$C#$( zDs?J}(+Opp&#ll<>z&N#GZ|Rt0r|%e*l4?mOxB5FG+)f9&gopLa98&8cOixgs&tc_#HlH=Dqda+@w@cu|(p{(1cs~m7-ah z^wJM6j{H~)LF8sz|7d#N&w;CBkhn^U(tc5hyHpFV5E|#frKB2i!0xtW?@0JmT^Uo; zDBKkjo2S(P*S7)wK+Rf`1z%H_Y17S$IOtC_^P@B1Bs-A2Nx}kJl6bAdCe@XsL!g^D zLGQjuLhX10g%5KgrWaC2oB>CMp%geTm-{sCRg}zp?BcyoY1||!6m7lgTO2eEK}|!h z{P1n!Q)Oqe)+?&C^uasoaH`mCUvm7gx+W6{Eb5i>u)uP%k1Sdih70C*^<>3E|M72~ zlh_&2HD(K;AM~qwWToiUAlp|5bu6N`o*{;=LuF_k$*IfBXR8iELTRzQgU1j(wH_yu zBe%^uJN($gJo@a%g21{cn5bCpM+~-k5hIzf+#OXrhjC8QhlB8zN4RGY_mkET34nMV zvTt&tef%qVC|>_Z*i?lcv&?wwtXHt3g{9HdyJ635i=O~VBq@4a@8K32=Ahuj`yd9f zS^0R5@6oJ;emg)E>HzKaTsV8AZ2mRaM7km!T7C7Ly8_sd603OC9q1g@M}F(3E-x?l z`&By`v|8~qi1-%_-?g=Nr{+#mO`==PuGe+zP-1X(I~mkeQ~1}9oiOf))mU+1&py+P_xwcb`1xj-3=vYCZc7^M02$q3u z{XI-Lcrcw~hDeC1Tra_aMFchXPWfP1F%C2ZoI-rczAaXq|2QSqGJ7Z8KKFW_3x^Ca*L7~Kx?BL=v($l&8c9sclZTf7JFEBq>F%DLdI|q# zb*C9=+TEl#nJ}Soo^o5dGarR?lNJ^UwFspJ`Bzq?#60FnIRrmI0XiZ&ZM_ThU12Gy zVy^K}=1917gseUK>CF2XnZrU!3sf^PVoC!zItn4x?-}s>;X#KnVGEV;h|_Phm4rGf zQSECq>w$F{zuzM1Q}2)b8ktVZaA7RyFih;zh;@?ys+Z}t-A}$so;rp9_yw()d4PI`(YLbnWPK@939$HKh+8@ z*9$^^rKU%my9|Ox4uPg+O~gkBnFq_0P!YHSHBy2+Ikj=4*A28$U7H<%xldvdF19|7 zeP8YZk@poZXaiJG8JYHVa-ce5M73U}vp|KqZL=u5&JMHUINpRCx;nXbY$8`}d|DP% ziO8{z#&sp&GSr;;X0c=W?3j^5-SKw^TzAe4U1y!skBi!NsMC#Adjxf>C`?lXoD12V zuxq>f-EDV~S!nW$+aOjX8NfdW5*Y2tea9`yRFv5?grIjMg#ff>2@*r|L4Mv|I3ASV5SEBlOXL{kU-#)^z}@MY*C^~=s%S&coV>?`7h>%_g`$_7$s4S>6x@u4FhlF|Pmv zIETZ)d0$buj0gA<=0C@pISZ#%Od0Nn=3iUu>$*dyWmGbK&*p zS>*^ZAm`Kw%b&3th~YSd)(&D?fO|=k7Z>a_nLekPL3Xjs^Stw|L-D|4J>5=mv?Y?) z_Q)#N!ozymFdzj+*^u`-fXgsHM(J+4j3czZhuHA_<`0yj9*XVHH9F&$Lfl32u_*Ur z&&H4fJnbv9=P+d)(vw3C-voDRUM(e6TZDq6aoz|Nh58wFlPVHpLoXli`=E0YeZ$U? z9wd^BN;0wL-AQQXF&S}=?_*bi-ba4uRVl5B!+>6b(^J{`5(~xGFNy-!4kb#@M|6Oe zdTB!v=(@Yqm!tR3nhQP4oA(|^V17Vy~na`o^mCgswUZgwYuBm$!A~tFU9Wl^9`saJA>`65fGzHI~m_27A%R&NNq_? zdmm9?B^|&57eiheor)}h1NqJnWO7lmu>+6G7@MS!8e@BSEVIG?95zIEz$iLDQ^)Wl z;B*U#&5wgxW`ZQS@+T|c(FRvEIZ8CkO3hq%5s$uv#s12~@KucHJ-=>?j~FSA?U;)&R+65?${@A~8rPF5PHKpV_q`h@7qQkBFLK_a{L~xFyO5jfgv#ni|j6 zINmS2ErtC%$f9*$xjEzu6}vEubQvlcI1(X;8DJLwL=pW(lqwiCxkAcgdXQC6cKSkk z3qaQTUB41X9g%d9ELoCZ?&%m5$yxWV$QSOE@KU^-jsYdzIEj5Ys-ad`Jk|e}!(=vf zY0`-l04_SmD=zEcD5wq&9k`u*E`#H~%pdo7Hbu9jmf9$km1$-lhEK28gBwcwRXDoG z{P}_OpoiHN8bj|QVYs-#%K!s0ja2|o44ojM;D!C>cQZ@h5SPLM9u<-U+YT=x4WT!a zcFarsIQ81`KxT!R_#beZ4UHoeHav^d-tgb%+w0`y2tA}{Td7B2Oc&RWd2b#|ZnezY zClCh9e0t}TGKCTc)aVZ}-G9Syc=c9)S+dQh%HGP#iekbs?s^!z-5g4d#o*Qy>Ky*N zEIO#Uga1!rw-nNwTmhvC%q5YTcPu^MmN>!qKC4yx z45FJ=n#2g`;DW`7;2-NMvXCE@6}X>mZ)yfMmP8yLb#JIUT|i%jT;#A|tp@_b>WUx3 zt0Oh>*sOp$EK~{Uq>sDcPsHBF79K6G0$lZ{;<||#d7#oHrKSxxdf4u(-|Aa%PlKP- zZ<0lOVotHS(m@2=P9H?alHL)1AfYOMk(&zit?TKp8Vzrn`k4)%DkWQ;HRjjdG%e8u zBV#DwIzqNoE&wHph~aBce-Z6-lWC=^)wdsmI>TUbWB0wnc!~cK@JbI{ImwV3~yk&Gu|3;olE8k*CT7v!Uio`AjJq6gGT5@O)7~|KPL2S_3vVf zk-2fS%oV$m=8u!ekq(<=wGQ(_@x{_JJ>Zu(N49+*lVfG$cFPoE3BT6PS zerQlgCJ+3cL%nWYUfio(nf6}aau#gX?elzm+`B!#zU?4KYPf5H>2uNJ_Q!JUb|jaW zDfeZ3g$D9UOlEUIg?>F~b%whFQ4J<5_!l9Vd;=56ICS>7qhcq&JEiE;O_c)WTeop|doOrQb8pm0G ziOJ~Z2E==L*IL4obaN!r9)M%6f*)M}L8mPBiQM!LMU56s&wzUkbYXwsQp6SxevjKQH z?UY-=tCxqy{iATurUcakZHg^-(ct8bz#saln0{BXNeZuvnU3DNr!hh*u*1N&La&dM z08~r5Np(mfE{H=`ks?sTht%>`(DV&eID>Hd6rR|X=s|uqsQ38`^mg#P>7{1!Vf{os z3@FpX+}danJn7HGFP^M4&s?C>Zcd_2mHcrgb%Xa@SSPzoIpRw}HDp)Q8J&F4itp8# zT~M%#VuY@6W_VC7Xq!Rwk0PaKAUVXcq0#g^i5gL<0xbib$}idr_^}Hqt84?IF8-$@ zO*gNKjZomuT7Q?&GhV z02?a74<|YD#Z;lIB;K9OPX`c45^kCknb|JuEHEb9vy4E$T6~>z-}8#pLGJ=Pyxlh@ zJ9qKF~hl=#7bEo=||}*U=(q{h{9CeONBN`|39X_fxD7LTQ^uy$F^5&+qP|V z$2K}n$F^;|V;ddYww-kHviG_7zVj1mj9FE4eypt|2MuvpH4{|tt<|)k0maTn-t#lA zGh01|p$1==fgg~1s+jM_&MDd{jaU0f&hrEFzUCh4b z^h5=+Wk(h~JckoC{KKOSY)e+R}6tWkW_LR+Y+# zeSYR=eNG=4Qxx5q_FHh^lPFdROs1mdO3RJNS_BJz5URl(8cK#1=!!f%Ok>xxQJPmz zTzOU^z9fK0>uQLOAI9OSWiay6AqusbjrPOtaApe_c(QGh`jPK4C$nNIa@CwkhYjW0 zFGcmK&)%rT(9;YEsKs9w&58m2VU{7q?IxWBx0E~jhxdnc=N6j=GZOl5o+J00kJc;V zK!aKlKY^Hb%RRWThggYtx!jk_8epPG=11!&Up!gUT67`7-=4;~AelvNm~l0ZFuC{L zB;xY`(aCiPyfVa&@~w)V0|HxQ_R6ayuuy5^5dR?k^kRIBv*}QrT<6oTx>^L{&62}C zZvHV(6ujiiek?+@s>^l6q!w)9jN5>Lb&1dSWBZpe(~KpShKu$C$%(XSUdJqhZbJ#& znC3;E1KEj}oe;upG`9s0hU;t)2D0j=IDEUvHMg0#pz@8x*Vu=h_w-Db))G7m+h-6! z`%!a#6+Q78RU=0ZbWYv*+I7&6;SxEm-P;Ha`oVDzQP#q83E&|CpHcnF#gX>q!`0@g( z@=a{`E7Izjc8}5AcVdxblsuwZ$8te;hfbKEuapaO568=Y$Tm2v!Arg+c=5y!jBJFUk0 z6@9`7Z87EQO`hi!6L^I8TKUsvln<6K2?)bnzb@n&NiRX9C)<;m9~LFqW^nm*VbQhM zygm%6+M}g1mRx;Q-9AGXX7CqHod>Fj?yahyikToxr5?#zB3^r+=@wrNe9r-%%o3dP<1`xrD{rIZ@AYQRn8b^ViGQDg0IP zd=$%2CY?~2$umFg24pIsB{b>Wfvs}FH!mTBTWI|IRiIR@kc_{Sv{j|E5G4@^;3Acr z*3ADgMEWO^9PJxV-ww3zQ_htFoD@ra6_HRZK&s=_-)FJ^tYvZ2<94&$($CZl9LO?r zWP0dxG{xKEWoMc_*JZC``0H@?Ub!EO=S7{q3C~@^7=eGLu5o>0dI3~2Uk=6?-%5^z z%gWWaSkKYzq3btKj0+W$+tbNqbi7lETW-zD_l{8Yzt;_fo}GMNr7_yI&5gyKQ*lDFd*G(%6ZWvV54Qm}k7u&QaSHjgYbGGkcGC;5 zyJl-_qM>P(;7OyRDq*+axN%C3q==w&I&9?#-qA`?P@`hVaMwL-@U?;szgP;=5CC%w zY5fS<*rP513}KCR{Z;R0MfuHY7!%sGB4MyMq)GX4I@zeiNx6IG`KYe5ail@B1)uLq z!4{L;Od+(R7c?L7>@yxe8;ZAYoY1n?^e~bUFOWBQ3FqITu5%L?Y`jN@f=Fk|hW(hl$f`m_ba;T^HO}DFyXj~T>?lZKIo%5TSMeTFZr8>wj=t#dT6VcO# zh|p&#&?13&LvGvE&S@S@(MfwG>&Zs7dM`00RO7rn$2>Y|RsTeSO}+16<`;noBVtR) zC6P^V4-$QoJn;kjK&|UK(AHNKSFLCB2zi@`CPCXZF++{LJ9tfq zuS{BD3Q}%l3TYHiV6|gqk^^&hk4*Hl;e|2NskP8uBpo$HB5*DmvujcDe5~`Jh`x-@ zTlmr3QMUn!pp8PZ9-@NnxWz=mME^w^_tf4PDz9}<+A?{ zKHMd_GZ{i4#n9Ds^ro<7;+GJ$_F_D0jHMT4`7lc`{D=wd1Kff=3*_kSZ`HTFfUdO( zu3MSx1xMJ;Ghvutz!HB5F&nwg%_z#h`cIWAWK118Vf%RPm!(bZQKZR_Hj8cC^d97K z)cT{}G4!kxwA0ss&yJ03VPE|?ZBejN;m>ImNA#nq(o-I`*rEnXMjOw0JzD6!_*-(2 zS>BO4d^S*`L{v8JVK%i%*3Zc)>09)4Lh$}n`)(s9!imoby7Maj`u2We8Q<}L3Vd{L zEi7rg^p*2p=MH3|I%xBF^F0jiA@2KTUxb_39Pf5IwPRk9aUE@a z>%F0}L2KV!%Bd)!P(GAV7gzHvl8CGa>tzS8=u}T zx@0FZ6x+(bfc2Myiar=(QaA9HdQ=^jZ&JCedXuiTpui8~UMyQI@ogBm+x6&6f6IBF zyxghzn7cf`P)O`hF`kkS(La;A$BtR7eAN&94iNAMKBSH(oNz#RrHS}B81N4KxA;%L z^PhEO;muh}_n&)^^sa|cK7bxs0fj>pRTKxE4Ecq!+>ut?@jN3LS&>+$h?FJWsqy=M zabPa(C_NZ9gn}61TF?M(E|8u&lj0{7?P$966_WF}bY9$NU6?VbikFG@BFI96j-*^C zdvfZt{cLlY`We!+Vzp~>XwcLLPHj;_6Z4I}ZPrlhfc&g zhZGUJVXT?X|EBCu%}bu%6Vo6^F=jg`U9NP6q(U+OT`T6UT3*4!fxfUvW_X8H>9fKZ z-Q2eu3F8?A6pE^Z2Edf;Sj^+wSMUgS6b5n`OV2)qYQ1XO>6_urG!d$k?%RWwZRw;TTGh&9B7H6H{QAM+N$#(NGAd^h#N=i$s|oM>hfx*$i^j+ zl-sbug;_Gvo2spal}TS8XwrnWN{72+;&boBalQwFEw($qT4glTFo)=>!ittr|I~!2 zP$FoQq?TO|RsS^w0f^UquSDv&=v^>Ha=wFru-w#^+V|baR6Lv&2mRGiI?i z$LZs%Uqxb9E9}R<7Wp5P2ky%V!!4oTDHCBRY~u=IJ{LU4y@W!EU+lawmn0YjGK5@Q4#YYJFAVwt zjx_O&oVTtSmE_djEg+^znoFpqyn{5{FQJDLrVY>pL>myP-QNdz0%LPKUk3uDI6*M+ z8%KiX*~@}`)QVAaP?2xtM4`V*nI30h89*MS;IMn>uZb}BZhLKxg1etLs-+#DZ^78f#eVs6g`GdPI%U%Nr;e19mv6%|5OK342x07G=ehG^-H;EC`l=( zx@=Nz*k?X9ixFMbSQ2Ld5d#Gt$2WS?GV{0&{#r;RuQ!RwW^N8(4)johfpf)(gT9e( zD^`liQLE>OcCnR#XUa!6j;Xo+eF4mjuJdeBab9UxCBrL$E^qsB~ifTFoLv ze7`rOuo2AwLBmvHQUxSs$o|lIGp#`sxpq-^b>#nfedVJ1Fuu_M^9ZHXNFasKUgJ{LG}3^Rx{brzyn;bvb~%3)0jg%CmL)EgeR}(2`S`gp-V##KCEfHccqB+AKYaxILgP$61;RI#3b7 zAm@Mi^4E#~^wh6=0;C26mRkhPyYGx>oyWNcd4pI*R9v_{DNm-qU0Io2s+~kN>D|9_ zm1K7|B=Qkfokx^~_B!5rExZU^PGbLh7u@gL2cCy8oN6tz5i2ddU7c6kwyyzqP2k`7NMT5b-LxG$Jbw52wj%vR2)?JPO5gkpc@w$? zk4}sNWe7lsUhQvU${ZO0{V61#0coY`8V|@vY=9_L56hv|EF>WU&HsdBLhK-^ybCUt zAa9p=(*#oE`H|KIf#VK>m75hn9v=Q`f@NC(_E*{M#!ksEf;^1yK@Qc;te8xY?tvOO z8i&<_;a2r##o7^60=p~BE?EY~h&)AmayGl669 z3d7#4@%`xBFzbHZxqLw-JIMYJT*@J1dJ-o5N%T@oS_w?L{<+C8JjEH^TR|>F!F`Iy z6@6n)vu86eGz^tTU`d57SQ(Ro1s)WEDNt&;sxO3@Y@6M^Z_)(>s&*wM?KD%DrCfonNz}Bq)L)MMy zwE_OMwljHcBa#ap8It?I78S6dut;BVo?;tKv#J3|dr%Wq-Bq7|&8RWzoC7YytSw+9 z1?LJkT=bB0!N}&q$glcPJPsi6CQyEBIF9zFCkW1*KqKO#6t&w`g5jcw>xHw?LZ2`Rz0|5sED6g zK?8$$7~>JKj;B_@(5feDo5Lj)5PjZuW~#3aB278pCP|>A%R~Utg`Mm|7Dr>cb_ChW zbUUuTf|Ve%NIqS4O_DoKi-`4GJr{>nh!OSt24->1P7$!-lnq^X{k$E^{U{zBAT4qkLG-gxwFVF0JIs?da+pY16VBs8&gh! zYwW6+B@av}T^%WVDNR1G**)8_&TG1zq)q}XQUcs6MYLLmf_ZtT7+(y?p3l@YzYI1H zN?dpO%XFF1&AA{j8hF^DG75ug2s{Zm1LEGB$p7lb0=`O@d?(RxqDb!|qI4p18+~q1 zSx^mNH*B$l#{*&opA~_og)D+hqN=dbL$89&xVJFCsdW@ny!we;pBZ$uyxn8^9u}k? zDfs^Ox;ftB0d;$M|4CNZ#h^SxHEL?fe{C;MB2O5QJIS;p6YnIg8%D%hq+0FN-3GP5 zRPBKnYJ0g(t+Ias=ES}OCu-L(^WOB~kLP1IFp&D<2hq{tHFdQ%=k?GSt?ykVTD-_` zmR?Xr;msM~;`KUz#_>(6=YXcy>&p^(T}w|Eo8{!Qh3D$IQCHnlF(kgVYQAuqBY@=d zUvi+O{eR>@a?yImDNyK{1`7Y11@L9bb?3W=ipwRvb?DiF-ZNx&uR-wlhALVWd!gc$;_e)aT5ut@=)$d7MC5v4%*_r$`d6zZ^v&4)nH>$ z2#012rRIg;zAjt90Gt*PE5(5xjbfVbhw(+rl70E#rLx7uZMU}-BQN4dpKJewRbF%L z?Bn|Z;(;Q+WAnxXHBgmP0q- zZER3)`bF#5<$;Og-$J=Cl=WgB#ucG#v&P#0gE-xQ4vNAsRoDuBfBIWU0j|&x?Nq#-?OQ^j=XS*x4R9+ z)tX@9BWiJlyG*!p)d*D1w}F#qSB~1Qfo(n0-2KY422}i`lm8$2rI+Uy>)@jRMgRB@ z>mVS9=p1m_@P~hGquckB=Qs#}7mb4`%oI#4EuXoWn#n@|*&ETXNZPz88iIqav4F78 z2;y85XeUwsEf9~5hB83G6FTyCimg-%S`ZZ#!L^xkBw(18G`1y{vZ<$8SY4#z8$8;0 zJ%}GnUtehC#h5%P8C9a;v7VLWXfQDRm=1#s$T%AVGr|#PyM0_i{@WD=rjTA0N21;E z7YD(nuKa)&;_vvfbS2U5ewl||o*v3jw<-v~@T9ge=h#G8bgaoB4@gjd>l=6Z<-DWM zRM-_Gz7am^TJ$L#rQ%;l#@ae`YmI$8OwxS`er=>4$Ab#S(=beb@`7!oqvuO>SO*Rf zMi!>yINO!dtI3vXF?sB$N};p^4w$9+pwNA%ZntNcTuILY{#EXpB#<23UpLmu{$!Js=PmJfzsBZFUwq)!KnOdcw$W72%E}G-|nAnwe*uWSpD2#)g?>)2%QW(b{FY6#nerIjyQR%PbGd ztWoLxLvRvN=1a=WbWUjHqwwGm%HUSwMsWPsX;rUe_cL#gEhWoos@!XySIyX|Ueijg z{!TzabFNay@;+?Drm%=H=}e~TB1-Ll!y!8m{&97jU7yDP+sRC^1B&9TOZfAC#*I@* zf>Jn7zTM3c%liUyvWi%B^f$g8yi$V{hR5cpI6$1JCRZAn<*gICA0`vpo&iF_FmZ`C2l6-knI*n0%+Bb{fSS+lCAjBPOOH9VbIf zlq7H!J1d$5!jf%M1(X03B=DM^l_Lr%Gbj`U;iF6{QBV$7-@Bk0)9 z0^`gwzo`+FRL`z$0yL$~7j^U;^mXPN%nquH%T&;Yv0AE)G=B3L zHj{+JiAtLNTySvnsaL4}MM1nds99& z1<`+__H%N$Pl&LEn4{RF@&jNg3K+QQ8lr3T12BJO+0mb-X1mQBwRjI{XvQ7v1;__U zgL$SB?j7&J0+)W*t_MIQZ!f}$agn@6hT1(|I}tCr2F<_c_xqNf?Bmb_gKdzJq}bh6 z3(wk*#lQ(ar6lkAnOaVsuFTI`hz3Hthf$^CqWmZfHa7mA8+>>^-R~HjPj$b-{@mVv zldeDc>)=U|?l!p6r+q9xaguYAvdZ=pfGAjsG2t4zzf2HAcgl3tgzA4K01Cb00=KGwYJ*R>jR zKaZ`q+KbHAN11y6BSdB#V=Gj3CkPI&48$@C*=81bLbMzSYT({BEd-;ZdgU+cI5WMs zWwB;x7hZKe`ZK*@0C^WlR%)S{zhs z-0W;lqF_TbXDrR9iAc6Ji|z1D@5u@r5gsGWTYEciT0eMX_%37WBa+7o6)pC|g4irP zt1K`c(53fVnP^jCLY>(wheSLzEgAxtPNIo`i}Uzh1sMKjaPD*QoCZ0|3~`X{MybL$ zfXPN?y~x)h*jxSha+FO8?7ln{Ge>c9g?@z?hRV%CDv^^Qk%&W}*x0vY;6bvL;pTLm z9$mT%zM4}28{ij}=rzG;UU7&0DR*NimUlC}fPt^jWhd!N! z)#FTW9q9kvo~qEiaPKUid6NJf;ET1!vtYv6K2LpH>3)|q!1|l>z7sP35gWK!l)TTw zQn1Afi^9NTEwz5L168eq;$-8Q5w^Huy=^kVvEAcKQ$9z?s zz`ba)m`uGh{Mt1-1)=jVp#BdnYq%sH3j(ZDw`vG)-)DPq&6hP_Mc4cFdH(~A*w$_min_cE%|WkoB5+cL%m*W-Mjv7T$>pzB(IbAr8z zTd+O!La^R?MDA%a6o*aqwW#Zx;CA1P@He-Z_Sd)|aA|V27MbQ3=kY}GvE&ivKzBbU zCa9)ABXE7B3YUtIg{FZac$?H|g_rpAd3+?8gWJChr--0Uvd@%FL&O!p%z-#mDNMEs$&fG5Rr%sRJpx4#jw_QWC6j8m$0Km~iP{m@j^ zp{zQ^Ws7mGA6syi{r!Qkzw+{oHXh|?&1W~#C>9obK@J2UfrKjxo*bAa^|BP5MOjX9 zBJ4Eb0dna&WcLGfeEDS(whiEb#R7#pL6YiLquKRqln>xWtiR@rlSc{enN>j991QaP z(dk2y{uY^>`+ai9?x0Pa0-ekacz*eEm8C+iq3B^#UUo^`hcmIbZ)PkwLj0GY80sp! z!FTyZhA?QRt=ABP>~M2dY4Nkx>+zc5L2c&hEb)eKbl<%^HOrY4l*}_4>+MOTeJE9B zvt=lnYm*^_vkG>JOk=@LjTf^UeV7LLnEnBIn~u=!sVA@y%|&*2>634o8K2Z6$@z8l ztZlt%9OQP-DuA7-MLuNEkxT|JVxKKBzG|1~XS_F$r*YOFp2qL(TH0A9KDugUn|8Sm z0RPWs^EFnU|H3xIH8Q9Fz&1I#P+jdXZEIlPz|cryammLSpKXPO1$JnCPE&p(ETdzf z18@R>3qVNekS&%H5X*?9L`C}?XAmLonRF7iZVgx^W9LK|UTt2u0qzW9P8$@|qJrTa z0Qf7hJuz@d_yOX{K|O#I$_0o|y^U()o;MMy9YFfy-W+5)mUD)yF`htY5)}OR9`s7U z_KYUXB6i?@;M{dOeeJWvKc$y*i9Md~>`jirQ@^-jIOw^ou(Y_xF&c^y^ZwxP*n%8{S`pRU_-! zYI84XNFCXz0;KZE((yy-g`wAxYCo^cMS@>D+v(0^-1nV&Ek*iJ8JkCJy-5VeCwVT8 z`wO%kH!x28{82RwEcIzTFaXKYI!X_+#|sp`!d6SW3f_kf%2t}8rRn^QXw-2R1Onb> zPcs6a8<)GmU5({6mHJ)J*}COVWe(N}PoN~AIcr2@Y;1=#KLLHidTKeGVHC`VSb1%w zwluCw$hYLFQuas(-@!y~-Ztv~wos<-ZQJBN`m)VRz@uH9qnGChnTz z;_L8zOUV9Ud;aIN(D?eQ=?2K(07f&=NPxnlt$w8UzpGfg&eo2h!zhQHzqx*s?r--& z`|ddm(+JoiFI{as>bqV_K#Hc$Q&Bt^iO}PK21}{qL<$Tt{PuuT;MSQY=Pa!Xq9HQ~ zP|4sQkq0$q_({gk-Q(2lF%$i9pC^A^(q#m^kCjqJM&jGBp#k(1^!tCN;_l?89gFH7 zl9a7tgyYem@?R*TRa)dp4Pbjp6rg9WD(&zkLNtT}w4Kjj8ZU_!GUwqz9D9{2Nhbr} zdN}R{72{3?X8YfA)jDZIg6y3v*ak-3y`%DJe9;v5;p2DW8L*?O8_-Oss`%Th4poL^A>0s@fY zzKO3jTuO?m0}o6tM6{=8<66By%ru?Qs#ui*22yrXeH%mflz(Ml;l zEYk{e9#2O%<$c%u6%(X)o%)-i^$?(w4QFkryNndYh$-Mmma|Seny?&zu%gd-77lud zT5k`6C?nu={TmGgAtqp_VrL-pymf%xJ5+Wh^5VT~@f$Opt7seKIG7`d0b})89+Am=?0>;bl8b%|5nC zgFnQCU5&Dy7LU4xRbP$BR+m)__b5K+!Qnw8R}FSrcsed+d@v2b8~W6DhpQ zlLL&>M)IsO=rVHcaHDPrN=q#>H8dDx;|$fCIfX^XzG}e>pk!|m(x5G&O0i)r3ey$= z*%lZ6iiTs6)chI5?gjY`!C(u)VRF-@N-PowCNsgTA6P(!gAl1c#C-*PcPgO2CPi*0 zaCUj$tDSI}vA}%H7HaO0CWH2u3poMr`F;X7$UQvs)1A5{&E{OdkP>X03^C(L=kvPLsV@z`_fD)nbpThY{YYx!1RR0FQ(|c} zEgH5S_e8ZRrZ^vk*u?`rg_e5XlYd`e&pjC%@ek5PEi;?|k62FEb&?;8d{6P61W?jB z?9XZ=XIhTTQ29nZxhShoEy2ALXrZ|JD`c8_3;lJO{gYFXc(%J~UmicB0NONbSGL=p zU)n4{ej*I1b6@zo#fmM7TkhwHz~7dQy*~o$deoz?E+5%v8^O^HjnkEJT33lCEqUI@ z8;Pq-E!_o$S&OV!8KhK`>z+pqONFoe+LLXfhI;z2N{olP6572_*A4V6Eg*L~`IBA( zM5bd)h713lr;Hjs_Wenf%wpSPnFTi6;%&-ye2l-=;}=^zmFVNQ`k z^NSbiG(^wDW2(M>k~pRz*pZMt?%({~rm@NgGUK7-`@{mk$VX`oMw4P26^Y2X5FC+( zZlSY!-m@88$Pg)wVWttmIEZYZI>N&zDGbf~&1MilkkQ`8jnB+vDYwZE!>JbzOL5p$ zK_~;`Lf{>8y$(T-0buXV0(`_Zn25TPtviwN$68nUJvoI@+eeFa?*4GlnS7^?(?+=`=;>iPpoxFucj& znBU|tYhW1*#mwRpw+^b-WA8KHNUGNB6b7J=g}cQOLvOHPQ<>ec1Q7uQue5AthCR6% z%FYB4ZOKZ%z*w@=*~E9{9`q&3JmgEIMjU1s-otLB$1GZus!OD;d0hhf4V2MCWXLMt zttIVTM~xKt7@ikWUZHHv$5hue?t3)f@OT<|pM}S#zCs5UYP~RVx&~hpv~}b+Q`X~x z`U&G_cru!UzO@AvDNpV9P2rC#}V#l+_|aU;eDO6n+xrSm;BRj zhl#q2^hYu~WhR_oEi%P`EK9=)xc0MDyj34@wz|rj@rdcvsgG7$B7u`7A4oEf|ALG) zPX2+6lQwnh|8bCh0mX`Zf&lJ(ZTS4Xgp7dJA^gZDzmeKX@Ir37(qpt08{@VGwqpDF z=mAWn(tt|o##VzFy8sba*~Zp?7*;CAh`~Vd-!RT>bgoks`6WC z+xw_;F3p%b_1_DA7;y7uMIB_vVzy}ab~x>O54-}<`$uLhF=L(`8SJWJ>_5qn(%;KG}*-$8u;opgaUgbk(l%=vW@ZnHPQTFw6nzj^A zw}a-fsB*}`vfL&3z8bhGbg3H4x9?X!Q&+^>aE(bDM+arPj@_`S)015|0@LuFSJg^P zH%AA(0>ThhboEJ5yk)S*Pcb@r?+nkh>gyQxEOhUfr)#KeVDFq1qu-!LPVYHAc;yLC zB+oFlYhn`D-@D#H6&oHOhua%k1U9lZU&clcWL$}uW90{K-270y-c&X@pfWvB;5b>E z>^lx65hBQ~9N8&{n60(-sZQ5lHubNvtw_yY7yiqn`IqmD$L;R^ACu;RzZJprb|7Mx z2+t8WwKP$Ft@5KM;ujOuyeUK(Ckrmi?qX|6?hNzGUSlv$ey;fvz=gcYsN^=cKUm}1 z1B62(?1G~x<^$MH_fdf+JI&VmtMhfGmm2;cy zlx7HN=}-o56+;?JTMjqHwzJxTh_W}4-R0)aNzkitl#9YiJ&H|^f;Mm?QAs|cc~&C_ z5+Ttk$~jwuBjrXMM}A%VdYF-*yI0t7Y$SZ_#EN3;7jmw{pzePb;y_q>?R7<$u+hhx z^24BsG%$}{nsEFBzyB>zDRO(9bP__D;yGAm6AeJ{%uecR{OI{A|A5D5#mPzVJd$QU zNv$}6P9@_q!BA-o| z0dt_!0BbCKP^{|`(scG4u8m5xy@aV^bl2KCH{%il{z}STSPxmRzbe@ukTi8=KNgH9 zscE$q$gDh*-kV^!L7xDT0<-|_b2wqatIRcJu{^*QM4SASB-je5YH9%FRXlU9AyAyT zc=;^bwl1rc*uoDlaO|UBRKIkawd$$}qImI2GEM$WpgOobUQfD@LyELbymD!jNl5I@ zR1ZtIfKS00M0qrXl?53Re^Zp_ur_!C4Wc1BY@WlASfAUC4&8T9oQk+m50JRQrNQJDLUvcwBJVTp7!_wm5gtLs}O+X1Op zd;xF`JuEaX*F+=hD{4NQiz3|XDb~Dk=v|+_J0jX;B^rw^tViJXhw7Cd!a*Xyv%rl zsPm#rI{vF5DZlLkmk8vBoVmjbK(K}@>G}&j(7|6P`{1!^XG0>_&`(WL&=jWeHmxh) zIuL73UDn1IPAO8f=%5rP#|Au`xv-^M&Vct(Mg`-mxrPu!sr%vwZlXC~)b(0PeNDV! zLlF29BOV-T z&b_FCbXOdg+e){gn~q35Cp@c*ESC}E$!!MLMY1&F+;6uoTJYWQv-)SX2_8U@gmv?b z@kK{X6g-q(y!q&&4m){nD~tV?G<$LD8ow#H38idERw&n1Dk95;iH_p5=LLOeom z#ej=3LMI}ak}P}Rsp@SVcDw`dQ1nRK<_clXYhfMpoAIct+*=DB7T?Qu%Xf~y9NXPH zO!oz5ACG%Bf#&aZ4%#IeW;tiDRRUXjo$gD+-cpP?U3Uo^9~TTwFVAURKI74%DjV$#tuGJI-45W&9TcoHF8RV)jE1@ovUn zg-a%ipP_{{umuQK19bMKN)ph|DZkmUy5e%XjvEying%b6?E&y@?iKHrYAgdh7Dldp zQ@Lex`;+RM=G{UDVD@`^#K+GkYH<5d+@k?0=AOFbj7n(sgkbE7Ts6{qvoST zioY`JNKgz4-KimcuLC)v*^P90pdl)nksjX!@p0E5OCN-yoK&U?q64p})G4aaTcJdQ4{C zz1)!6_k{PdobvzBb40(wT;50n+P=e%9_Y6p-?jgCf70EvFu?@)qWbBD zi=c+pi2)B=gX(muGbK)b%ezAms9AR>O#g(y)B3bT_&L1s*WlfZIB4JFP|v~p-3WNX zSzIov`zJ8LaXPkfNwjV83e>xkhz(&)>G7|++S|c**nmNtQQX6A z(u>%&jla6>`}|va{BL>h&yTjBmkO>WcD~h!g1n1Li*p-Au9Kriw^W&J@9*YFo&+6_ z3mvm8IWFZ0PMT*)FK1kn6X7q|3(HOa7t0;3lR5tf z%e@65a6ig&>w4H<|A-7iz7Z3{!eUR?ajf)z3D_ZGDVOfnqrC1hNN1BaOHIP8bUB@B`C;rm$w^Kg@tu zPn;Er#a zU4~4)BN*!~qzSNvVR8>Id{H!Fwk<*=S(7r*7+247i9~Q6j>|ktcN_nXsn^v*&0o`A z$pS~FboLNovlmZE!JrDy6Hm#K$resPhL$yPcgeL{SB1K*RrkGO-#H#(ZR7GLS)p(t zm~A19OF&?O1BJ`-{`vwIsd)~~(pUmH*-chpCbejhAZf{AnGOX8a*X2nDK&>lKbyvZ zvc>8BL3jL3VzUM#r3KU>#YijE47*R%t_M?rK?SG zo_eO|6su$%ds@I0+4Lj7KxYm?0MmCopu^&ay5TVEhMm`s*BYzt$RlWu31X(<>Qtv=GYJZcR^)&ObM+99{GN%H#Qa=$BR;2SF2xa zgq=R14dkoIt<_{KoEj$oKScCPiTs6mq?o0w|BHEmdTg)puX1lT?VA^fL|a%w8v^7H zVx5K6RV0VG@+)c|xZ%-;U=M;sXQ7B`A>v4os3=Xv&&XN+nm356s6mR(d;J|o;J(3) z3Nj%8s-$m%e9i8Skg58 z)Z@~^OaVY%^XVp2No4G65?=5Y4AD(3?jIOp6ldu5#Vk3)iA7RwHs+6Mt~ezL?S#U9 z!SiVs#STx{Xx?Y=2IBF0eAKG9I-GV}+U!D+NHMU!Y253JQ*e63a-yoQNnlcWuV=oK zlvfz6qHW+kHuJ&P>-3blO5pLz-K*%HjZ^=b=klq_bLdmHH=y9mw}5Q?5>46z7j9C? z-8=~;*I_b67%=^Y-no}3RQH%`LYE@uXpQ1%99QGH*&9E=qBn;T(cT8(UEf~8(9CaO zU`=;bY570nwypM$21&n&Bc<{`02?mv^_S<>$I8H#Z=srtaG1IsAt29)#ve}TRTnIS z7%6oK87prLp0x*Mu+$Q#5KYm2{JLuA%VodBBG8z%P26X~kuIIk;#~()&&~#|i?}8Q zxObqi=X%8Erueqq5?fp(uPSBemYUm7UKl%)OU^x%GJhW0;JVeH@)OTL+%z%XXsi(` z{MUJJ@&26kdQdX|1WjJq?|wy70>#zlGSXKQrR&CAV|;Yx2`D-Adg!91Sa95Q+v+{s z3>FMh@m&Vf6Pz@drVhEQr8{1XIdGR6PMsQchP7S5E8y>w+^n?s`kwQiGTQxQ+3EOViqI)vTdi~12eWU`atVw!T5k9|VcYNbkf z1&-0Noy*r)+ewKwqQW(wNYE;@!*#AJKp8ysr0i7+hNW;&Qzr5UyD-PVJKcSn-`+8O zJH75te53ijOZQic5}Z0DqBop8hcn}yR`^PS;@zh5BoN57N-AR7a$-{}wpiAXO=`ET zB8EZH**&ZE`@rCf&hD$9y5)Ue_R=$x-E=0E&u6*Y7QObXFTKe*coiKlWyrSOKeIo~ zCN>mYep2B!;3mdcWnP1R$Qg+GWx$mmB*4&`k$e?N{4zhL$AY!GHt<; z-ku$B@-haIt=%hK&+0{;>T!gcWxaO!)Pxe^>GceFn%A+5n1}<_^~anHmkgoLUkKOC zBN6BoC!Q;}I&oeu`f~92eVZ^GO~DN#BAyObjGAG}5^)95^;2mV+0r`?Nx9B07)Z*F zz20S}-=n=5j6eu~v5~dTRe+6@fYSr{MNTZK($i-HL^T=>nbn6-^RXPNYkS-tJO$ZLRy5i#kJ97n(`jLSagGvsN{8_`%+)8MZZ(?i7UL& z{`nPZUhv=rS<(H{aT41y^Mhyu6Mk~X%DjEzJs{3w@J7CpZBkXlwvN@baVU+ggKW26 z+Kw-RRcxKUHs;8<7&Na> zY0;_mW+j2A{jK{YVnZY6Z(O2Ul-%|B_DZWdmqu~H zHUNa8SC_NarkGc;m_wt8ZQ7to2giK;!K(KUf4(hJzdw|&N0{1%8M7EBeI78%J;`Df zI`Wf3WY3=(s^}^kz)P^{7*Xo|Aozb&y;F2$UAHzG+o>cKYsISAPAax-TPwCI72CFL zS6s1e+t$hZz5Cn$KCR!)yV=@kef06D7u!%9X0YP(yUYx6{hn+{vVW}<5$su0{H`E5 z3d<6hGybbssQ7+ijly7fA!+3+oa>0`+emY?U+MbE7uy7iqZi)mMkB8G_ziV_1%_WJ zCtn(@n2#LDDLu!UcUp9!nbnGDf_7)ne8MOPHvT2EFVLQjg20bY86A-T&U2RfU$(em zVcq`>q(m?bohgiyJPQfuPsNIJ&Y5o-*G&Ht|BW;(X;0_uuB_5Q@Ki_qYQ(;0*HAhH zOa6O3aeUIC&8NH?A-cs1lqGmk*Lh#l%zT3=`}etK+)ClQlPyy$?YuaLynHqLEuQeR z6wjOa^>wW7x9N*#wSPR^k}V42{m*^KJfk}uiaU`;$&gNl6MB}F{p(RWP8It&+}sBo zaOIpmS!^S9-6NIwj?%045WsdTa|_pQ3)B7eECTK&Yoci73!wW#Y7P>0yKMKF6vEAxjO1 zp})r*#;CdGb;`tN`Z~C;%@Kc^p0PwKM@AtcAM8WEd`qu5NGeb| z)W;igWZ#f6>ob;nCf&7hqsqT|gS~Jkk%+~298V6a)hEE6gz7TMXqW-s$l738n_ywV zl9F+B;KBx-iGKyqu?7Kn<|vklJ6tDWlg&WVi69shdfdCdM_a@k^J}fM^@s%^X|eFp zj*3~#p(vdazJbnSq^V@o_9OZE^+5x_4Iecjag-yD=Ttyd71bDBT=%)Uc7H5(Z)Wnp z`o{^~%b7)0#$}Ka7kdn0iA*M%b1&Mx7g~No*^eb=I_*sF<7W!T>tF5qVw9hfSqz^y z>$*aJW42r7Q@-DdvVs_^c~Iyxg^UDWxM9TaWT1((%Suf`7RZQ6neCtvbp6`w^s!C@ zTdd=#8-0U(ndqcAA;D2;Wh~LW$xv)&aLE8Gg$iqYUco&tMxx%=IqFoQa9YKxV^na$ z`jfl+wJ`)&;dHN8F8iF|BSOdP|6&*(|G_XGkK@^wEQS$` z2<`L9+uZVzsE2Tx!eZg!*R+qyx&HmHrMKEeJ|`vwB18BI7SJF3k&4GUk?YKEZMkCk ziJ24~-+vpMg@vCx=cG#R!e@vmzlsagvrPAk&3>4##jcUg^x59RtXPF4Ym7rK>kQ(t z>zBvpn1-;L-u4v3e>$DT?*(QfW<_fhwK0MJsx18(S5YChphHefBZDI%d=rSDm8>as zcGR{bUb!{JF->f+v~AIsCD{VG;7ujU;5HrK5SX=x=iOX7s>_O4oYzlK3Q3IlUaPZp z6iH@;?XT$vS<6SBIrXcTE8JK0z+{bNYVNeIXq2QEJ_;Ypap?K>{h~hl<10Uf5T}<} zE?{DkeuQ;{q1ZK7C$pQv5P#@SmZR6LDsz|=b_hp=3(Nlgo^{axdG>iV$>4192iv-X zjuFAy(i980n=ts0S3J|K%y}*t;pQ}!`aN+d4ZZ;xBgN1#@1#p?&8&l(%th%H=T{Kk z{?}ETGx{>Oazz`K;c{AVU3kx=~OvF+^HR&!qYoq zqL;RdmX;L@yg!+G(HIxfHlH!J)c>@u6GUjp`x}I!_P}PQdLyB@s-$zS=&!5=vfi!p zzA=RZM1Ln#c9l4;f^EgrCu$Hjii9*`rw%sBx(uGi5)w zb)31HPFxGVAeOJli{lC<9-dW8vqikW@_GGuGOZ2~$sZ0D^~GeyzWB52bI~jMnzD=W z9osnib%%p9^wvgNvX2AC?1apdH|k6a<@eH#H_~C8-jVaCn%w(9SH8unX0bHAD1EC# zTtc_2A;O$dSq_9XPc`iYGXAp)p--sO$1%~6r=$BHFlm~7OH^*@lU}aaGOY9rQ+;;8 zzkShJRE!k3s{e0sxm)BvDJ+XeYh)h(z803i?SPMK;uv`8+dj|)i?M(3MEvBVrV5AQ zRk!Z`h;hei#>nQ_uj3vM^j$Y6#n_hQ*2tLZ;rEdx)D0L0dEXqPVL&|xmHLPGSgB2;m8OJbRP zao!^Yef`5oT%*-Fo9%ml>4}R-h=lpYrxG16v*HQTy~k*A2BUE-T&_VNTId8rVZ^ekisvmiepNtvCJ9qu#}a$K4E{`p{|| zJ0^fCe0ya~n(;(hGw4DWgw{d3h-YKNMLSwnjNz+_(R=ZWPLx_3%1`&F>ALfP8B5!d z5>FSle9eME-YNTB?}ETKDGXyK^i#a;clg;5yhiSF(&KK z=Fbw0c!kF zSI|$J{&SOlLAGuGur+9di-W~%ffY3cT8SzH)HA*-n9Sx94UXX& zVIaisp>RWc2}6d*K5my|QR^%a8yZ$z>%cM_HPd!bJzK}GPw2S@CY_!{O*W>NAR ziaV`r0m_uJ%(mpcDflm>tyZWY4B55j%#V2)j$;@VYMuO1;5S~wbSSPyqtq4~wYct> zRyX?c^B}zQ3IGLYgb>QDteDLnhk}~-Gf^ERg$9?Z(y~Zhq=Uy{bVOs;kzW!-CjZG+ zKMRkB1z!L)kJvj;=+A9AR`YsrMTuM*J~-0!4Cy+h8b;$R@U!`S<00)Ke-hj?)&-ur5lD^X7+Du!vbCnkAfBcpVq?umM zV!0%zGAXyc9-eJKC&W%}&q~cZZ@XGMOSBITbx0itc?C>4P<)su$`%tDJdC@+jR4%A zieDRtQS;zH)21V8;6WfQF5-TX#wZn|J41w$+mWh}R*CjpY)yaxijU>V3L@Amyn;k~ zNCXKTZOSf?Zc(FLtZYqYtz8$czFukd$>G zI~c413V@EGxJ>c0Ged1{AROJ)~@vkEKIIrZuHjb`c) ze{5VT-j^e1r?sA-hZrLiJgJ#0y3MYWrmyWwPsr^QdLQlU`{Ayg%omcEp|@g$*1-uk z^qd>ahej1EtcTIUSG~|%v;373W6!_J4@C4FBKK<@>W@nX5@e+AVcI$KETX)A;LY1x znzvVzOZ5b|ty(sDgOmGBUp*@3h18tX-a$I1+FuB(4V*4;AGl3spsdij-b_peso?58 zKT+%HdgtLgy-)@L$1{)eQFT2j_vLgh#9QN?=DIZF&*+y5eT-h7*Xm2KW9E2$-@G0l z+SBTBx_@Aof4iCvt@f#nsi+l`ztkP3P%#kL!4?4uJ{RJvHXgA1DwoZ@q~fwkqn!! zulQQ3UfXh_Zz&}(R@o*aZ4IgrzQ~THX6;sAIhN|9Cl3ues1JsFZ$YpT@EhQc$dl1E z+EzK!17*kDOZ&`nTRE3=$@A!Fx7tFPU}L8Q2D!fC-YC@P!y=L}P?^VOoWt=85p!IU zB{f1f)2nmmYROMi$jOF}vf&NX7Il9PER2_rvmJ)h(cFHX3S zh`X{q^SA^eD9m@O!<8PGL6l5ahaXXUOE$YUSPx$D0XZ|?RsmIec$EHf_I+2iTm))^ zlB;2~Oy2=c9DK+4`X}+?^^roUgOvZx0@$&`wp}x25MiKU_W4c~Vr%Duh5$F%`ID&E zcANofJt0T9azF~|Rsid@og*g{Bmyo>Xyt$rz&Vj@U~h&u^FG@!(4La-QRz0{4T%^U`UuIm;_%;p%&Fy;{Xxc_S+F}?o)s=N zvK)Wa&)!G7($--c4^!(A4NfA7u7-|BG%H^o%MXPut+y*=xEt}!9Se=z$dYUlh+xd_ zC#GsCHOcY~wn)JERAFdppL`8&Lb!+y=Y{_>`Lpiz=Fk^9*(;Z{yi5FV={S}~r>E?v zb(i96fa}=2=T|O76aeqDAc=%Q{!HOhh`atPkq<4gY{q?=S9r$B6&$r@kiG5IiFX>Y zJ}0#3xJ`~Xd09Sb#tZgv-yN6N{)lSW!BAFAUBgMT=Un!lb%D9lO!hJ@|LoGIG}AHq z?)xde(+c7VvS7@xlHA54|JPA?;6~XX!H0HcQo1T*v5|X{0*Fv-_?Fe1}>M zJkKFAy{cgqe%=4({j*Qa#5<9F*c+uxXi z8ts=q-B1v zCzJopSfZ-TLkxge`c-i(uNWQ8P(pZXD?Sx$(5_`#UAWLWa>qeyZ6sked#;lKW(rN9 z4(oCdNDk*1tDNVZQeefIV_uJw7-632XC5yx!`-SFFR1Sgb753%iHpowh-pCfBQD2i z2-Quef(A`YawSqHwC0*87ADo0(*hca?W~wwu-IXF^UDOM5=X+KoP&zelBRGP* z{Pb<%_l18&q!QwuAc(J4ry6w2X#JrVB#~D8^KA7;O z>M*m-0?*m-uiV^GLT#kc*RTA)(hZw`nDs8YNrujUf!^v-@ZW3?9Why-Fnnm8Yk85B zWu$*dIDg3%GZy3YsA-;pi=2uKWFl z!>{S>t6|}xlrZJgu9siOa}fe?=%j^8#)!l&Z7J$g+1^ejtKnD&k!eRu<1o*H<2!M?Ufo<(P zim_;_QklL*Kzn9_)-<#U&fXzrzs4(#GvI^^nqg^zwCf?teYd%~$;C5Ij{SE1dTZQ1 z_23`OO6NFdsv}TbN4C6Hsig%%2Y`m;v4d=( zFbt3}bwGe?h}xE1S>mL58hB2Os{NYO>^`zTrA*D&xO`65?JI~Q5m(>l&B&I#v=jT+ z26*?SHxuQfYJN{Vlt1v4Xiet2p5P##;U@Xut*Fd5zyC_vUeDTQM&Ni0NbPo*^A;4g z=sdQFupGwMg=_H-H|cfEJ+LHLN%-n&26KP|ef`e0XQ3+hl8$|>6|zV9Q`z>T5cwg=ddaT|6Nw=VIfB8)!-OfyE|NMTCYwD-P@W?9sH5tFG7{V7cH zZDopwA%;6{-_x1oEhYCHHi>R3xa0`3&$`~mU)$wA??2~2#H(!D_j#zX%{+rhzsTLa zs)P(~gGW60LWro=dwoBtRrUHx3@s=rt|8Y9$*>WN$;S|3vG&)gwK;mObk^P6OQz93 z%2m5$s@}UE95&?#Ymgl0RiJEi-23XyE3B?AhogXl2d){9zl)lvRsETV@>aT55$ldu zbq|jfavPjOWwT(THIXdH)*5zcR9+J=7zz|89S{BIXa^U;NMRmX^+9v0yU&snh=i4c z|Kb!kJ?W4C5TEYZ43YnKtai`G2Jl_h#P`yGacU%e80oGi6djj27x9c7tR-6UUio`5 zc?9!>L04WBOT0fwOQvTK#oMK_ajqzEe~aAK^fJxMyB))m^Pz`5!O zQT*oCjhy3kS7i&j+FrW8mu|{cFd$3Or+v~&L)w2?&yWy#HBa5?Z>n@g$>yC-(0_7dox6C;8B#0 zig^@ia3T1d-vB%`&mg?560fS@TyNzyyJCI=I_qSX&X@C-Yn9ji>Efb3`{VLutB;p# z{fUrlDohu-Zd?dv#GCJHGCmL=d+v1VAyI-L&>Pf5_I*WkZ@3MNg@cm(l(jYl%f1vf zVos|{mVImwv9rZm2eq3O7-AhY?9rwzwIzJCqDuK`oImD#rR1lu#5g1xprohQIg_lB znZP|CtI7aFcA@NcP$eGoM?4^T(=^JCn^SG5YG10F;}4{%5qx|0SB-{~?;vAD?IbC7Q0Fcxxbs^{N~4%YP#b#OQZ(hPAO}1eT&+ z_?=D_AKR4)4|&t92XAPR7-To=qz7~k~j+wt+Ddd2#D>`6xgWCNDvawCK;Yy_6BNv-NPhOz4;;M7Z~D*EU~10`>0>-Ibe@2;&@RaAk_-ALJIa$ z!W*UHgd|v^vAJ6*b;?JoNYQXJO&Bd<=vQ_s_cBb%Y;;HJ&X>Sb2MKI3%Ro{rQ&!%# z5A)F5EuG#Hh5mpCNTJbHVBNoV>fM(4HHDYPjF9DIbK|J^ZK@Z{mJBN86SP=rZ$_Wg zQ&6-YPEOpR`pvFCKQCXrjX+CId?lDy?X6OE#S_woUY}+UdB|n+Lu~I>c)baRwM|%Z zrWORDwVzbfd?mbVZxyT!G2#}#6czI49u_6T8s+vZ+Pr+}FVsgd&-|K?%{28R8s8U8 z%T3)M(U`J)W=lEYY6caQ(k@Pdt*4;z-|+r6yYiLyX8^|x*0S(j4oMb0<~>HQ4OTKE zc1v8&vy5b3VLTS{4-+z-wJU}+T^AUp*9n~_TM%7M>IC8c!WS$|hv@t--tdJuT>RsS z+ojio`}bA2!{ib6w{Lm~8BL>8+WdJw9;1yclf(o@nmYi{)t#C^mY zWQVG)q&U=tiHqO}-fGKh4{6q>)dqW~mX@#Bf~c}pn3TrnSZw4jkWa(SO62;33$n?` zEW*J4$S{L|Wj9&nuQW$dAJ}P+mSuu2YZM$4gir=bBR@c@dAm6MrMwd7 zG-@Aur}L)XpNb$n?gK{&v2lDtzZUtM<2#{J^l1Z3)uE;Z?R#Z+@`MO*kpSE1$;2EZ z2AtiCLc?@uJwRVSoZmhg_EsxgWzwr3C6A}i2i(@Y688!M0}pozeZkYSQYW|FnOplx zr(0P;MttfGx*qa*tFvL<*9NS_#Av=FaMWvqaV!Zgipw1}IpUx0ew<)dJVaaUiSF82 zk6|#ZLr)hSGU)^AE)j%{TR+|=dOMBk6vT5CEjCnT91VQz)Z}&twjI-NH zw!78r1*9Ke2hU``6)+9V%db2-+5xr7H1DkCdqxofItlf^lx}Ka$FXLoHD&uom+S9b z;nY}PQOzNWmBkN(UEK47JULd^v|}M33W8~w{0}SnWhx*4XF}h|s7@~W7w%%;0p){Y zl!O$(hjy`Nx@u+-;%{N2_Fp>xK_V275|cb3(U@wBf@%<%1FiI8Q0z?$!zFnQE7Kz` zeFzZ}&lpuBBHXa@hB2o@)e5T4t?~6UVU~1(J>E!;)AA|UsYUA8U#@gJTKYsGWgH#c9M8UtJMi5$>~8dS5v<1(nQ;witQ8jgEUBx^0p z_wNV{-^*Yn&a=pMij%PNl^u)qQrbpG`U@=ivMw741<(&6irV3Sg5Z6X6ng+(#(z^wF@|WGePa-Hu1p0oOx9l1c6? z(TG9P18rxkcMf*#Psi|sd|0q^*@tpIM9q}`&M!+oWT`;WKQfYX93jWZd;kdwl526w zz!H2H3Lmjd8J4vn*Xu^KT$7s$mUAPeC@R3m7W+}r2je6yx<{g}>BYA(8&WYVEBzWT z{x!*NXyO*BMd#l>bBOtv>xuj~0&(hAkwI(6=#7Nw(^h-RdS)1BK~hdJ1=mX6jftmW zr|8}=B;B)5>TuYh2xng_hFGt7C#UY(uHJ;{JqW6cP=^QJFG?OJINyeM{_m;My8D`< zyuSoMW&bv?jUZ?kPOg#JOFxg)4J+c``9~t|xKZXdQ3&~DsE>H48(@ThVAldyYn5Fz zN8m~qjO3j*j(97T@6YaK&69rlw-{RsLz zO`Q#y;ypcd4F>A5ej8`W{xv)7nAs3*I}4xO zHg1dKt1hQG{HLWCV+-eowdtDDtNbrl?0ul}_`Ud7Vw(}28<>coY)*n(NbqW+hpM^h z@9ZQGGgdnqBoPU5W`fI{#ZED3sX8g!O=#0)q1tVo^lO4hB?~GpJucN|BPEg&{l z&Em8)%fw<0FwFiGu!pY0u#>i&z(4NLI&n^5!%4$H65}(;xQg%83T*1$dxhhd{fTJK z72TuoTN0L}^wGSN%80XU#e}KuC)P%rSI|r<5^3-@k{dM8vbRML>V(`w6=SKtrl#+H zDD)_${?arSh5qH`O<^5jrAf??wLTk@z(W#S@PX03?HrMqU;Y)dOcJFNiW!3JvYh-D zBEO>gpg$#Ox){#t%D4py;Ja_eTM9d5Nzy4L=2$WMp8CZqYPfoc)hL~( z-Cnd&3KZHediaDo7~KC%!+ot&QrAc*y`QTy?;D;!B!UiRsChT z9iF}9tn+G5TWZL9=5i`0--m$W*S1LRs8(v&$A`&%*Eq+oXWk*ryUu{Zsad!HqbQPMb!#10!7zpP82KU368wRq16T2{I_d*U&sH6w`<-5-3k55 z=Sj-wp8MC7+aZB$4a%Y!1}w^H3PdBx$#=wu5J7;3fmASB6c_S^X(|903YWXj_}USp zOTzw^3!Co1PKI&#El^D4kI~XXhd5wL=|*TIF~|b0q`nc#_-=CACLR5ZO`CfLp)FTu z*BOE`B#MN)RW+o6vkwOcs!Y&t9pYCZ#}U-`KbZV4!Txii#(fpAm@iNbadA}k2gO@Z zPUVKUMLvCE>kpv%vSi3Hy=&A?QzXhmKS9PMtk!<$<(vq>$GXhi-N_z>nKf|@ zx_mLO{I~+1q0}G>8)IbUI!X{la)$(V`twV>n3d=$ospX7R8j#wFW9}3=ATj*4aHIT z6LIt=clHti39h_c-45Oz|FDoyTgvH;rX|Y`89Z8e7l^vx&m1+1@pLb<*@XJkhDmKHW zd#&JgW$m|5k#NUzV_gAr{ttP4gwx&9GO9o|tJ(Iz0|3ri>{h=vzL^V{EDh60e^Mom zhU^;Ib#D|01#1O39`_c?GE@BU?GPak{kCy~>%a(wT8Eho8z=VH8Xq2uidY_{kYh8vdB)4=hh8n&Hb*9y^9h~p zq1Vsy()%;GZLw1V;gR0{#!T}hH=QC#zH)lK#GB(ny$052HMy+{`-X&5vy0y+?kr(_ zaAr!WENRoLt-(+-80Z=J-puUJ;*1tE zhSV+{3or~Q+f2?=b4Ib$V^8a~O(Ljo!HkHidNrdLw24kmIJ13@ev`wRzob5*=~gAi z-rOusLTg`nZxSs1Pd!cE^vF)Uo4I?OF8}9~TOc&w+f|<(3#ZvH$9i3+PwDM`Zu|(I zK3x|zdlnvyLG5Y0?HL#r%k<%EYzx=;@8K1w+8tulHpZQ)zJj5=3VQ)FC1RW=CJ4bnTrV@p7jwpJ%b=LBtI+8n$pc-0q zJ3yB=st>ELypMJ_;RK)W{3FJdUBwHL1PL4LRhzf}Ch-=KAtDuLcBF}f-&Mb55q@e_ z2@N4;&MjK|Ha#g(V1kHtmcBjgFmn*iw?aM{kRBvJ7Fx%LiQEFXCL-i+#PuTEkv5%E zn2#&eUX-0@WwWt-TFONbAhJgdLq}Ksa2Fw{f@SjXW3}T|A}im+$c)xlP<`c`8m7mX z2A6NpGq`WI2q6hhN8J^(Oy3}-#y_X=+7_~3%L0`nZ$KuRCnTC^cOlgEMy7i+I7`f+ zjg??~$uWV(Z$EgGw2EqkOCK%B{5+NZl-aiqdSZ`-#cdm`E@Wxxm3t@GVg9Jj$L=_> zZU=5E_ao}!tkC!N6cBdh)@Gr3L`l9HM7H}3;eB<Lq^SDpr%zx=y z*XTpff2;Y}KQrT%t+U(34%zyv-b#6{Ld=Z@NLVKPhXX!UwI-C!Y*YI&&KP4e6y$pm z0;t5bZvB= zv!mkt{en>4@#J~{+5u(E=aO>AswlDOd4x0&&L0O(2=F2=`y+?n>I{wV7OABj7mpKP zfO9%(ED{m_=nPuEZeP_)?Jk?J>6}Xq|yRu~0KEq^t zV5>xP(&o9;m{nyEF%+&^s*?F=tQsxU9*NI4eWfun{00{cJXp*kYg-dcW}7h=ajhAW zc}p1H0`|lxf`t^^Q^Cuh^}R2l;TBpRq=+7V?CXI#QQ)=jF;T;|oOuS#yH2L2jJ_U@ zsit+@+Zk2eKt7`Cf`_P4Yrf-;=RtQUR*6TNoSil7q$;!rQOQ3QR#`z3P(qK zxKAX6s$loMcF=)xAG~p$&eFB-FJU~ggmEqwd)?XbJ+*X=rMavKy|^_vsrI4SdM;G5 z>Q3^guHLg+c}Y`moGe$lNJKKk$ABL>sC;%(Phzp$kJ)L;K2t1E6@pl9QeIC1%VpaQMC0;%XVhWi@K59)6Y)O=jarPLqN`dWg# z&}>R=x$72=@T(Zi34a<(my1rmA$%pgfx3z@9p67r%gxyA9T=g!F)&K}O?O|^1`dPn zmN#ltkl&fwP%c@F{z2t0|cv%IL8HN)(Eo!fY#B9SSMQ2D4xI?lulGlNHe-q6?$w`{9n;z*D+30`o-Sl z?u!0~Bb|Rv%)ixzhGYqYwI#RbpUzE!29896;##|YlLc_qk|`zfx-Yus zKE-s;V}6hMaR_nR11;T%kS*C-DKVwPICZ@)-x&DQT`w^;<(5W2po-B_v<0aX=G0d1 z!rXjWlWqYZCnUOK6K@aMY_l`rCSNNSAnWIEH1Z|D7QlB~!Jt-+DK+0JOlt}#x>N@Z zi!T~&_?8&=bEF~rLMZ73-4mwDSR7tpDXj7(Qpr{lU1wT$h^z1`bFS23W~)-{%Dmqv zO$~_D3b>Y&h>(M7-lG+GW-vrvhHg3_3$y~aaw*gHs7f2VSXF5?*;A>$;5|~_Slc({ zEtjHxip!vLgF;W8X=}A@)M-7M|o{Q z1b)l0(xkIB30~E5BOwj5U;+pz=1;c$B}f*P5WW;!@4ixg%Z46Y)oCeT`W zhR!%q!taZR;oe;19U5(NtWW{FC->CX7q5?ZeM!`<8isC0v-gLmd@sfQOxRV2Lo1dB z_nx=Mb+n)Y&f?*My~AnbFt3@~{H;e2sN9i8#|QiQxWjV|hfcUdOj!gj^2rlItmQJx zt`T`wz|uhknYmD;t!ARG=+sV9LmCj_&mdio%|$IA&VqeXns9MJHz5NoX7{3oplL3{(%Y-Y4r@Z)x$E1_AE?laDtCWA(Tv)k)fP18FxIgI^o zVWO*m;mC?|()W%v+vwMO5gE=V+f(9#q@@HmY)oA_n%j!;rsLd-UK~hhv?Q;Rc@^Un z!Pr?!`evTBZIIbj-O!v89qm)r+#f=`$kdZWjgZS)}alL_lyhJz#r{Y>0lMSPR|BYwqYG{)zfB&4@j7NW)5>Z0V6V?K_*n zIahXO4s}^0OGvXn4*Tf{Yy`4Sw%@AV{btSyv?{!9<*1|8da^Ul{h0+m+R^6=;iJPs z>VwX|!;dwxmnXr}NUPoCqt@-e6Vew2L*aU>jt~T+9AR@qz_E*NSfE9U7nlJ-iKa*m zEPcSe{QH(EGSv|_Arh1#q8h7PEQqWr%pOQfg$Dk$cO=EV9NV+Ue*G{s*IJrCe$1t~6nciS!kjGT&z% zG&;{+Z}3x2^je5Smf$yEG&P*`$5B`(6s7i!hM_$TJqxK_kC<=p%IUDQU4XfM8RF+A zzLzc87Qlg}nD(8A^SlcoZp=Wo*Io~16S+pwcvHU0r<)2!8iydx-raZ0cUUL9zl@+I z2;ogx)LYMoAVZ2NZP{E_vIdQnLE@>vgL3Q&%`b&~%hqzMDf35Mh!x!3L$;iOvjFL6 zIYYOryW9Qr{`I|HT+V9_n)4&zV2#mr@`BTKe81DNiV(fi+r+t2mY3AonZMc-pW(IW zGvng)h4hoBi}`$O^2aK8GcZ*K+wBow=r@Zn_Yc%Q?jNtnYwAXF$!ZlEu6A)TyYE33 z=_y9Z8Dat1aV$Oq3aV&MRrtZ82C$=<>8E4S!YKvJ*JmE1nvpjrgy2FE0}}no6Sc7W zoHv%6Misl4Tpw`W3?VJ3sxHO&3MaQ32A`YN7Yx~FuH)N@|9jPS+5G3C;|16H{O62u zU;0P$k^Fd5N+>rk_|_6{8&K_(chOvyePkNUW_D7KwmsY2q|9ObL-n{hAT2*lp!6h< zJ&Lse-GUaVLygE>6Kl;MhM9_R_eX8XL^efQU0)1BYOjz@2?xRw!ipeK299J%3m%$; z1AO@E?pl?r=5G$YgGzN!xSN!`jRDwCP!*;;HW&Scc$SVZd=OcdSYL9e!x&jWZY0Fo&ad;B;F}OH_RNyA;n0TJ*kq6 z*8Y?oO(YK1pWWeE#@)n^<-sip+FZpryX zCQhJ#g~TbfGha}h#;rRsh>y7+FLGqM68l{0rI0QNL0xKGGIz@4oc-iw%O zWk@<;Z6|^#azV3S#a`V5=p|w>Xd^o$w^RR0ePi1)bLr~)(MImiRAf9}|By@(+~aYa~Rmy#KGvE#w?VmCfVj^(Cr zY2H6`!92LB54m;rpOw- zZ$H9SeUDRVXZOre_9$PtJwjJ4e7T7_O%OcZ{rpXGgxDI;4B@cS?Y1 zB$CWtSTEP=8(r%FedwLzq3alw6Z03f)S~@nD~?MJazfL;pT!XPal84sxhJcqO+d&G zpn61I)Qis{l}O(GI#Ij6q2555DTg!G#`7j_)t6ue46pUe0?W_*{pA}k()L}BWT($H z;Ilf;!UbJQOK#@FoT$T^7}9Bk-Rhr1B=#tU$whUW_?*$&ulD4AkTA}DXv_D55qk2R zCW|!QexZYKIt@8xkM~!g)48Sc*$rEA(Ud7jBhX@H@V-1Gz*b*T>#VpxM-!hMA(+N} zVO(DFfvo*N_anp%n0)U4-{J@Vr%h$|0<6*h9ne1#2!6mY{?H(c{d-b5n15M*+H-qq z^fQ&t%>N;~Z}L4qv;WU+P}mvOOrrKZg<$ht1cEf}P8T6?uirdp3Jz)1U+$a5q5yL7 z7*d-s6D?Fk_~c+cjU#kXU4gp%B3$IJcU=4(x|wXLSvXlgO;VYvL#*GlY)JiLVYiG7RgSeC!uD|!c%Q?~E5!#rkF3)_bPJw8$qT&erA-TfIEH8c&M4V|jF(;!o`>EW0 zz)!W`OAW?QWm{Q^@m5@V`Dav8=1b2zfU^Hge4S~ZYY&vPO(g6wpC+chO8W7U8Njt~ z)E;kw*S1y5$TGTb7*42sNrlC$7r;Z`fkX?{ynaTT9;nv1@NuRoNal`` z^tX$tqTJjVphh|m88&=ua2Lm=+8!^PgZHDWSCJgfK`ApMTzhXUaO|d3l=F2!4nAGK zvXd13{T0hdlk4!j5#6H8#N&IXIWuzo(|sa?fZ=UxL0qRD9RhI58ZxnFbQn@uy!Wn$ zQNBmHu>YsE)x*4TbAKE~-h|hc<$nQ6mwuiLX>ar#r}2XscrmI?8@nr%{4^itYXP_t zHqyf}xiQL-Cd>=Xizc1ZlLhw#J%v7$dCYW5|6HjH#{{+o3G;}ys?Xk?WAN-2Jk zLg=UX-a)Oqf^%qJUGQd6qqS|U>`tg)qoX-}kqzS!braZrDAH;?x_%`RFrT}CB=}|& z$~{-OH=OTA2ncV0)34m;Wg5(u!Jd@)M@AM1TGQx)B~;R`4$zYi7X^sB2!gr?(2{K+ z`;pFx2!d!8;$CRG?$XvdLbuKRb_tF42P>-Ty+qMtxWrc5yf%s~UZ-&=w*s9~`0AkH z#9JZa?70{?M3BibwmIoO_nQh_y|z8sSoAkpMqs@3(I&=;_{dKM-me0*QO%$cYPBjY z*9GINoSmN}Q!0$1PVh>kGjW@o6}H9^4`nWD1rU7WnOP#Bd@9c_Mq1*S^RxPW(&&{q z)DJtLJW?wfL@%p~ajE!|s$#RnT>4g03);ku#;)gU?`NV!daqYLySUrKIwJ2P=i%g{ zmcih!Qe(Dxv&W&o8|`{IrWolhRe2Gzxqo?W=fWB!m%Kl(r89bOFh;U{M_gF~fh*hZ z8O-{{8=F35jQK?&TpDvOZ$Xo-RX;I5Sh_XqdvFYyF-DSf% zm4b#VQ9VKhj8`?`Vfc{&vZhEb6LZO{`pKBXO=x3fhff-c0mUcVKG^PJ0)Q(5_a!V& z@JJHGZe&Z+ysWoi3CMSul-V{nF&J6cX$4J&*C5wfrpxlenj5bcow}ykj;Jf#*Ik^! zfJ?Y)hVDr^=?@V^C=XFmIcb+eVA&zH1Fbhkz*{d;dA?d$ z)AN*Bk4iDh62j7ZjrVKjN1?rST!V*n42gZEBim!|OZi>%wALi%G{)m(cNUskF8e}n z>x4oj+;N14!7v9nzR|~f9It{GboSYB2e^i(g6+x{$E6n0D>~U(Vepq7+?kUrpuiN__I^eD8_P~p&!XG8f=jz zf@OJ%KB*%pd?Fm4Nvy09Kaqjh8U{b$+5P)uXyPKNe{M2R$^kJPL+EkOFKwTfuI?bL7=oeolY6^Kb=sed$v%qJ63gj(o3Cz8~a_S zCuxawp5zXpqqd#t;_dD1>T&!HiPh)QaZcqu@TKTO9XBDtc(zGDkO@k&-%tC%IHt_> z#w_rz^qB5znaI%ZtY?>OlQ_6fGpMh3hCoHo&W}tKW+ENM6l;vNQ;6d;LL^!}a}Hr> ztaZ#nd^SJHc4+|JM);q623CClF^^7^_Q%gV;`LSfba0$R=&{y|0)_lx-`5%LYlh2- z0xn+dd|eIdoX4va#`HfXyy08FItx^~@jnB$?W*?LIKsow=H@&FxnuSl3W{3J5iC!dx&Lq`1^3Ll0C zF#-*5`jSsCofDvv$EdH^5C|?^E%X@2fThYSfl|8TuAD-Lz0^}*1ZF^mRbkzWrggk|#lX)me@)eq<+&o}>b5;k`V`Ieg;+5c9!0r%76Bi65L8vI@1v&TydTPnB zCeG&IJps8FiE!bfP!VEJhKhFZ9!73w9+uyl#XCs_j4i8$I1SxgTW6ut#oko;*k6K> zzJ&N5ILyH~c(DBC0=nVN~ zuB<}|YMMP<`16ix=t6qN=+3?B6WQbo3B)*Hr{$Y*T0#nhup=6uKZGp0{i)wo3=;h- zG)VMe*M4L!Z1)UkUO~Hy)1|}j4Q-X*IfBme-X#icDw0cU=!xZ8|KQkrOeyni=vp+T zNNG2MH0cXVpEt2GdW8r~%U5m7h2BXQ_bP}l%b1+Zc7b~!a}3@q5z+)OdHPuVzi zxgCSQq9WT%<>Ppr>X<6B4ws?c4(yMr6h;_b?>8ppp;YX|M7hC6>ECzXTUWdv*Xd+` zzk`I+iM(tY(y%^ogqk%27=rUOcZfMLwOm?zx#R4)2q7sOW=7WyTr~zv5jG^u6L51O;1l1MhnX>;v$Ivh+f*2U%>fqo zMgcV-UQXza0@RiUl*L>uowr7X)BF**^)`5%W+@fQ>o8zB=ap{~R!vj6CG9NC+Vbi6 z-hPB80JGpqNhj*}7qQj8~q{VB|8et8O3lP*goi_YJECKRT)1Mcoo+168ND$Hw$a}%!|mTd7YPg z&at7Gxv)WwW3i~Jr;H}fCAXRnr(e5Iw&@=lyr~%H@nT(xgCOmP*)3Ws5hKkW;n(n+ zGP*b1jMx(D8fd!o(_*Ec%c!_k<0qqB*B_bB$70YQAaUf_6K?5w_%lAmcaUX#5{W>f zUn^H+bDu7%J>c@Jz2ALL(-}B2D>GT9vdd{@Gu5JOEk3ZCQdEPu#{0*ndj;W3lpE33Hfs*Fg-3Fz29K9CkW1e>!;v+4;c>sV+3X z(wMQ>&=ecz)0z`kRt(D@B1}mTesct*tfbrx`h)}93wf&x4kryNO@t4um8fmG&&wgQsJ?p;#7j*Q3>tMXhIR08`RsZuSZ$;y^<#}YTi63{H@ zzi}hIy8e)c;wg~0e!XUswjxtF@{Nsp%ZiVQZ1!pRoRh2}ATqPN6h{V3 zfvu(`XQGr*(~Ke{&(|4Gx9J0WnZ+WCNqRmW?nxxuuaIK(`JWfS8wlyw8%tARM-h}3 z@7qSpE<1>_&_1N1jPfNQe^yxwA;tFw7ffTOTkZ|)Wo%#7&dU19t(1LnO>qfJ;Ifgb ze>38!(^uqeg6iB=Bgt^=#q6^nVZ0>N zll@rTZ^2l{b}^Yuf%`2;?Uo6y&8se$xgzttbntP6Jd0!oNBTD^Hy~E6W_%O6vi#7u zJ9wu%V~;-T2ZDD`g6#rxibaz}n`Gb&0da=ohP z7{u4ZU%8G*QX=|NT`v+kqz6N=*)Sq?2t8N{0<$t4ww+v+v~AG4kUgy8X2$BcH}O4x z*hhksbOvo1xYDzxS-R>T8izJ1Sqc1yrd{$i@{{xOaU8o!=S8)ERKjpy<&+KB$LxYh z>}Nw^1C_82+TB!Qa&ty!EoXMM9bs18sN%*m*i|eO17y*11 zLi>r|wcOS87%BN&%u~S&lDB=bvDh3)={f%tyOTmrPPeQ|^+{F3ljajq+7^25%rZ^f z9l|P#X&)VpKUJ7Uvl=)GiS=PLEoqS|j`DtSib^1gj@DMg;oDIdR*Om>uTUAB>f`KF zf8DSVIW7CFf*fDTbU4D$r}KVs^<>{ZcEq*IKII136CdIb_cZmR3}oeMUI|ngJmDl> z7Du0SJ_BXh{kXc0_pVu@E{igrr#S`uF_E63L;Q(lZ7P@iZnoe+Loueva;& zmCkV8U5C_v+ghJ!_>X+cdExJhK#^TR!#ecuehRdU;)ce+#!%q@W6 z2_a{d<=t(dN)x?+mmyq^=?Y#-zv%tfpP@N{STe_-%`1V_D7lRZ0{l&=IyL@u2;qsG zwngXmjA{wOV2;ki9){rNwk4ysOkg^TK&(2UqCkBy^!oIWT)?C;KermV_>hb#(_k1E z!kVB$0hF>H66bTtNy%iXwN3i%46^{jDbvEnnrf;Pwn*_IOhG2I{OEou4}*p6(?+Ig zwCD^KPfs!e^3WMeg(A?fxT*;n;jV3kRK?K=f0sh1EmblSsHn9Jqz8t9NW9BAdb63h zKe7$rP4`8&{Gn2KRof4{WQdyL@nb4(lG0K+ngqN+$|l@9>=h%blY#WPvsn{Bu8Lx( z%{sGfPgHAZdew|-J}SX|=45e=i-8NWt-Y(o z-(EJZ9tq-k_F4V~+zLclW7i&9HWIQ@I)*W7ms z-H5b{S=#iMF#tn<^KK6kSxTn($Zlzw>v&qr7H5 zGxX|Oav2jan0~g{(v|_yg!U0k_=O&%mv4EIlvKKdzj3Fb9LY#bzSTIov@?(Ba@cuV zBN*z{7%A6GRpyyR4Ihw*A>~IQ*xx%dTG>36<;HnTy zuL~Ur8Yk1UG*eMG>pWUIB{D19%PLOh&j^ie(zDPkY>wz~(Hx%^^Ze+XM}SB93OV_O zA0~`hG5rR9H%)n!!T$1K`SiN7N8k60n0|h%1)m)h3vL2odrsEFTbygGh|~ zHjF)^t#3s<;f5Kd;hyOWuY?v~eR(0eOa;{0XB}3=ct;aln)#Z^U_P(0jiI2cM5G}5 zWvpxM_BvTxE5cQ^!1v_i4JkqPNO^RZIROw_`qwLptWe_lUN%FG_I&$$}LL?QMuF6XLlufvd`P41C3bYYyy zZuXbhrM$uY+ef^KuJ2iS-Hlf^PaZx(z`f|y7J{f889FrGt(%sw={dA#P-9< z>79)kRAYJ5x-eH4Viw?~W4!woquPtmzXUcZwLEOjl82uZ(u()}x1Z+z(@zh2Eo=Vi zr-(={t+%;Ryv;8MVth}zFcvn?H%lASy75`bs|0XF_L4J7oZOhRt8TAL4q((f)Sq5L zU-@N!%n6i~sW^bG$dkCSAd>oOO=fWE%qy2R+RLetLieE}eh(^Zzadk~lP?5*avodg z`{LJ+Ykll+^1Tq=^LAGz8sGSvlrNbsD2r=}S^(=58TejSGzdyskE~XvjY@}}cs=^U z(NBU_?N5)wq9>#iwVN(64a?D!D8Y^pc`NM!r8G#7ll_^5b|18bKy^w(AF|ID1tn=7 zEmIEd{1BjE96G!eeOcO$s-ALDXOGDNk!c!4;Xq#bN{yGUhzbLAX(UVQumKiJ-{E0C zzMU(yG10+&D%R&>zG9S(uQgGN&5JhLjH4yM$mcdH{Ape>yi~O>9u#*nU|%kQ>M|PK)*I_^eou)paIqAA+Ryg|Z zkx?N@%Z{LiedZ;G$STUy#nYeN+tR27mVPm!tKW!cKe+c8h}b8<=8?=xc+dFR+CS~3 zFifV{XLUC*7JZ+rDk5q|NGj;ayt-+=^|Y$fOzvWrCj9I$1oHIyj9e3B;XZ^j_Mi|T zEhrO=5bfmD{Yc1hsaC2!zysscN}XkO1*jje zeYWy5n7-KBN=N%_?OD36pH^+V=B+k+F4KH^)u9gau?~3E2<^~s)uORB?d;sIy5)U( zDkwBhON4~2N*YC=gW(;UKYC&6{T8)dNwzTiKM3Tm(|P8fZkpa`dH46_$NF&Y{r;TT z@!ZnU^77En_m;aRz(&Y4#`MKa4-0lv3q~Ap1XUql458lw7q;?=3497giKX2zvNkqp zR!V4>k(|Ahf67^2>7_Ipo*wQphm{pvW+VAPni3;ORNHZSW(EQLi9}Ojy_iOm;v4$8 z;SabG{?v>Tt19ZjlmiS2VCAsam!lJTNu7W$zLp|R0W3_&1-KzJe(K+`-Z<~77B@1X zTP5VlC=cBN-$RmxPs;YbmG(Li2~~7#9m&x5S7er+6+KX2Ok`Ut_O&z8r|E0lxVkHU zi3ZJxOwvf8!V+Y0f$_wyihuJ_)?_3U(Ye2y#;G;vf*f|V+Yv5eznp5I3`7LTqwAtp zM8cU-sO(uTRpCyLwIKT@NB>BwJp&B29Qx$bBQ&kb5Yt-zWI5A|1Pct{tq=Gep)GvF zGy&2Xj0WwZ&P2h|anQ;qWl31kW<`i2x`Nz4!8Y6sRnyomaphO(Yj-~FXHiHP&M;Z> zx$x6+Aa90^-u4L_jtb`O_hXqZ*+cyC^|<|W@7k|<8fo8<_P>2akj z1H?qWx+h|~TYr3qjt3aumcN?&f1g%@zh_;8KH)vZU%q_} z9O>apbLQJkVPX{Dp1G^H0T4T#A61}_4N3uH8wY2K^d@=36qWkgaoXYmbgxD^(M8H> zn=}|AoYwPov@26Pwio(Gex@Sa01#K%hN`fYHWyMw=rrR+wlD6Hx_9>a# zVIo+DH~;o)i`rEi%wj?Ef^FQ`YR%-5rQ9!Cg{;C@VIh*R)l0A_Z^`z1@gV*bi3xBK zS466eIQ&IvZiAUFgysMmoJ*0N4|U3(%LJ&u z0^8iH^!4J&lTbQSwx}pmywh;#MK?IKs8uDhH=S<8{^WT#D?--uOW?BrjD(e-)P~&l zu*8?r71yK3I7PMZJLZM;x9&TiMUhVj?t&$kpLDP_$|;XpddYtY1=_z-{Wemxrr;``N}dZVmrnhP1U^myF2fJ$avWuxQNclO<+gyDS&O@ji06M7m# zt^&04G%b19S!oIC`P5S)*1^0%AM})0$8!w_Ycm4RMgUpALM!UgML%!E=x04*;Cx~7YIaoPZZa~3X-x;v@A17 z{coXhK6Cuq2}NfNU$he#C?nG^hlwr84NN@qX_9rBXT9JP{)oX_ZGN5yD8mRra{Y8p zpvF-F9x5Y{B}cPld*+LI_pbfk(C{#b507SVjlJ7D)k3WvlfyeSj1TjZ25hS7bj`gnme>o#9IARjjWnF`D78#WsdW4{=C<$jQXw z(A@KAJ3ZXj)qFnAa%5u zlSO>nZ+z_OAt2)<=gveri!24C>&!{Z^#c~-3izHDjF!5@z;~{qd#{I(v`01ecmQO3 zGJ&g3U-UgV35Z^Je;j{5xSt?(I_oU+%WNhOA|q38 zIpnNTJ|vySNdQtHy8|@_QUWo$lxdP5>~g3nF$sZv+SE;AOYlD&CEJ_fl?Bv4tr>RZ z=}Uz9xzB5An0TMI!by?rq??BywFmW4#%D3vL=^vG-5BS$(Et4UWTy|aj*=h2jBX4O z#p&zubmfC5R$MZxV&jpJ8;R-&8`DV9u{Dn7`hc*PT!V=;2T@i7zYnzz@To8uD)Lk` z#yLc~2#*^7#aK$>HbZF}zoTF>cQlFl(&d;+U{5B%$uZxY`(Wcm$_o+aL*33DGMpGr zhInaN1fUdhUr^keOvJ}^Jzn*76KRB{Q==96Fm>62-$6Z_lyK56&t|GG(~XXAj80cW z`9gDCy^EQCl*fW2c=`pfEBc6h#N@kQ+9Dsc-b}~;@i#sXhkWyL3*IT(W@BOgvn8g(yWtU9R+p#S0t5zJ1~8P`W~zM1=JB&+O(N)&IXmHULR>(Ar*%By!OF z%RfBsAvLK8RRCir#pLT3sqYdm#xT&aJlVVTPEiyijB+Zsjd*2B7hGRw0T+x9wX+8f zaBEia>%G8A zG@t1N{{S_c&9StS+AtP|IHD&$E%!OhN-BMe=m|O@6jpgDPWyhSaC&-gUzY`N6d&PP zV}b#g9+k$2k3wmfq~R?c8LjqWo&x#0n~Fat^@FwTgk9Zk=_4(Z{OH#8h$#Y zMfZtmo9@UQm@8d4a!u=LQ7$?-wkqdX94OPzprEH;LY71&SfJqOGAp+v+H*M@=2aOOpybCkHuHN zcWk(9F(7nohZo{MfnlPT3WlKd~=xicRpq>-8>kqPb)L2-~z@rVdpE!BtH-0M9AO3 z32`BJyA(2qL0X-q6$GDhw_W|LP5~f*g9z?y;aiqcCSzkUj0`P>1J9)`&IAh#d;`tT z+1rdAp6!k8e3WlZM=Sz>S*x|lB`bI^9OCn_fFr^;?AQ5+TKNVOUfLM>1-DEi}4~)o+k}2 z4Y(gjw5QNWruu*drqRXky4G7YMqLy)idM&#oihIz_u+l-Z_}rfS!(#7OuJ$3FJ>_(b4s}I4`#9ByC`xm?Kyfo zA?B!SxV|yi84bqFfkIrq_)`G|)6==G3@naUka|VFc`#5ET5h2^>`YnQLg5FM z%HTbPL7<)AkYH%oZ$K(UHJ{BP>KV!fi#2gCkfl~;u-kZjcq8#wSJ}>zAGnGagj>nU z9C)qp;Ah@YiqjwS*HEhyT%0G}^$!hFhzHSZwYmJR^BJ)A*jaV_>RfF%?W_)RP^8Tk z&U|DOv`BDyB3Z3{(0RY?e~nxkGVsGBl(q=H)ZGF`h^fPXd@jjQv4}q>vwtijvJMbE zn8c3S;TnOG;Y0Tf z)Vv7Wxg%_zRZ%5ncB$CBlI;K{8N_Z>hvcNoZKQYrsp7p+B z;$71S%M*#cz_P}tv<6Bs$pRO|ljH_UFj_=J2^PyEDS8L8?LD_GE&InV0V7^$U)=d! zl9s)U6%J#&NP`))ezs}M^}bz{aOHWsMa($!fhNR!`$0q7{(_sX(1wuQQ>OI(Wc%P?A5*ZfG8SMx>)ox8-=pI5!WsmiA?2lV_aL_(}E0Quz0|V0G6e z-(TBXT-9IxtIpWxzKHOo*)r!bR{Y4A0v_K>Pq1h}Ec_aX*5#ik1uqjuYbf@&`3?{@ z^Uu~Yuxa=qm%tb%ih@r`{Y3gD4FZh-5|U8f+Vlt3Pg49mf^4#xtQ@@Sx_gTbMsfid zS*LzV#*=};hcfV_o!I%Ez>DluT-KkUlA8rnn2915K@wF7Si_eT#vSRLH3`WO8-%z? z5t7hqd5hl`G*nA&_}C8;1C%5uRVH-_ba*0Y-E1p)KMM4vHmq5lKb=46aHIP!PZwP2 zKQP05n?zk_mR58>ZpYx%^OmD-T){~}7DwlrQM0tPSvfN}HV}8h8y(|_WtlQViw{zb zigW%APB^FEd07(ZTf(CCRJNa&`?%^7OHPz3^$Fzw`&Eugm@*e}zrVZb`z7{da_A&W=!_Pw zK;<{zR?PORy$5o)eyXeo`WA5ERp&dw+c~Y95q7!YX+BtL*RBvFS;G(2ZM$~bSIs`` zOteSzf)Ai0Bz*`SX8Vrea*<~rUy>Y2q$_8X^|4h0nkW}izC7OK@{WIshvqob(BSpb1xP1y-S}Mg#iv(uje7rSWXYgE z%`$4Rn|5S}Z)k~+c@ZNKN!aB?J%bxhq}1~ZSI@MVF0IX$T`R_2K z2j4A;FH}uCO>_O{K`WQEAt%}l^`B!-(@NzI1FF_^Jea0siTQj)+~N4wc{% z1fq%n^ibop2WLbBJMq*GQ0eW5ZV=ZHjZXbx-wZTdI#GP)&(L6rFQkxkT%--YQVZsp zyPgI?=p!{J;8f)UgDZYsiSdQ!C{6=0dfv9$D z{AQt4wOdA!yMw)Be8!m!;x*uSa!PrApkBlx9n2-Vq_3Nopv#bs;E|vqm^1|ux9l7} ztOp8*aP4u!V>fQ?>Yk7dSI^aw>&}4><~~7`ha#YP%y{m|az)A?4~P-lX|@e;DU8_i zU&f&Aut@KiLbC_|{`QUQGla*gQbyXP`pwd3r2s{G{}f~8Me=W~x62@bmcFUh;-G9x ztMqDG+s*{|O*JO*J1x5xXaJ7zHA}zRs>uBfzu?)MC&->i{#}WD&!Z!S>p-!@K(ajN z##l-Kk&s|ST2An@G$@my;w1iRFXDZfrteW6#tV_rTOZ5NAKT3bwbhbq=aTvRvQ0p0e#E#`n&5uT@zM>C@6y>e>l{hp)iHCNX_wBF z)3nuVnXwj>N7K6l`Q8xPbNl~Jr+W9!_wnVATJlV|fB3((oBLPf|e``Jm{rHk@Y7WY*$f#swjNIZ8k4R)5q$_co%+olZNKLkU^%RA}h z!=mbd+)9_}1Fu;c9CU}Ean1!bfK-n@zq!<>%e1V!0k+B|g07BX);mw*!+>|n4+ z^j7nw>*n{sfx*CK1h!=@JN=z3gi(0cI3oAO!oE5j60ex{V2lhYxm(mWhu8x*?stB? z9F$IbydKJED1PP7Z?t^6$5U$XRNo5rnyJ2(Y?AGZYbV7?qW0*2WCh=%@Yr?ZRt<$< zTY3s?bw~aokkka4ET}jiHeeB2?=EzUF9S$Z>0T$%T293}ZSgux6h%+3A-<2V!uq|; zXr9I>!BH7v_R5XWM0M*vC6thFR?59mCKuz9_5M+A2WnJXB_YTwK2^ll0-vI3+PpnK z?&M0#NACCLmPh^W7>{h~*n5&J2wUfI9%b>&pv-I-!C>(c=kl93@loq_B{DDB#f{i? zrOPj-Zl^&Yjj)e<6S>j0rE^N4Q^->y|sjkl2Zns>Q&=S+V-AhW$QW+H%UzydT!)ibB1PqrR+Xx zdjg`v{@356{QfU!daKY1)A+YH(z$i6+IyFPz(y#B58^rw$&t$&8B>?SdqZ0Nh7p^g z(xHt<1AKF+aDEm-FbY6>1M{F}AfU**shhXrZvvu(!#{$bJfW5tWs|cs2qpjmD)ow2 zVw?tjga*ERejc`+9z+;!)S=T478s^tfJxD4D?d74_fSO(hzG!dMZ+3ScX!xE$tl@P z6?#ymkN?DgGB}Wz0!B-SKATh@n=4hD7Zov=F(N0jv6HlpK?HNjuMmTtn7S#i^O)5l zdzQeOBAyxjBO;HE7tO&(Qf?D45f!tIeaQ5d`kAW`ECmT}_#)uU1Fbat?xzRwTJPX@ zAc;7qBS$~k-U_M%XLm_8{`T}2G#p(1_$fq@NoLo$`%JaplDM%r7sd^sr(etNWypYz zIM14MQp-A0sz}9t#5TrIqt=vCoY~J|+7tpys#kd(XK5RTO5ze`Y~{7&t5b{cOMThq zzoNfeU)hW@qt^$@#pij6PEYFGTqd4Zd3^u2FQi+;x40{t^SowZX>G{si|iOggoz&>bt`(H<38b}#3a zlkJIj^4J9|Ac^nf;*oJ&XTur@99QX`maf_j*_^PjefT8eSAVW1LB; zBszAfwrs3{;Q+`1D6)JleIu@LmM)gk|4{@jjTI2R_w3N`#{7;P*GXtP4Iu09H zXPEJ&K~S&Mc3h?~wr{l)U~#T8zr~_aX5t%LS2H{IG#xeK(r=JCZVDjNfeJ-e0cW)#;E&E40$-0k(cOT3epU8)hCIQFgvx>@1vLCj3pdzJ0C-bPEzESU&4eB~5 z%>JJIqmga7(Ilbn#=0y}bZrW$nMUtH7{wp8&WMxFD2;Ck+Hh?b5%xTT9H`i2A}b$p z&~YrLVtRCNr~_iAX4PMY@1GhCnwRN`XggJ7SsI-2$(enp;F@vgzfr!8JwX=0O7_W; zcCtF{7nM4~27M>EnXyp%kk9eN36#)le$RMSZOM>G379rB`$|smwT3syMgQciQA=ABeG9QvJ#YjKlTjQkc{iGdrAJ zEXx`;iut3!^>ol5)otbwixy2ndPPh{1s2&oPl7TC}LVM78ioC4{uR*)^vz|XMt!19Ad2fqOAdA zMTG};4q|cdUXg{smGM}eq~#Ef>S*0LkV$EZ=?`P{7%II3T2kbIIx;6F^Ee69%=T>E|u{-w@azW6>4zfyQ_b5Q30FyIT% zxhD;L!u3vXptUK}fq z)7GliZazO#&D<0aP{FLzx-yDnj%o`9E`W=pq8Hq1*nrl}oec;}wD5ApOAifJsE`Xa zqh{tAW=^u01U!TwMx95K1MKhdzeiQA+0?R#sa+Ft8rHTJ@i)Ke5$u(gg&+BD&$D39 zCS(#V##5}Xx_ivV8(e|98i(6qho8n;4t(ZP3WLZjHS@VVl*t+PVTc^^dUDmz*4R{ zd<4G}`s+u^iGHx`&qG^R1WwWTEwjC*c()Q0KuHiC(KvtbkjllHWjZO(7`5vK%$!XL zm=jQEuvKm0&+-wPxo?I* zOHv6crZC<6mC>gX7<~|Rv(V9JAM#^FiLz~oz%ZZ0-y~)z!i3{nYMvAnVnk7b9FViM z@7zcK`j?N9%j=MS*$IE^{c+iP3%AFh+#GO(bdt<-ahv;~h4kywo{e?+s+#?+h1j4e zGVk?;xdwi@4~QVSBA7exf@AdC`J=Vmt`v*_M-}Eq<9#?0Sj0Wd%>B?MUQ9sl_AoAE zxp~gWs(rit$7SzJ@DOsR(d6hB*C=Ys_C7Z;`BAM*s&VUxV<1Zzxh2_Vt4G-oK1Rjw zwI#31uHSU@Yw!3tU;DlCyLKYSTe&7vs@9t!nYp%m4_QIuS2k+0dNQZU#v)tG&*QGd z?2ga;+LPx0aS3q#M*~PV{zmw(2JqCEZ&B=9pE9emwtd>aO@yJ{!0;u^`07 zEFX~l(=&>|cU6IUo+T8X;vykg6EsA#KR*>jGV{d`}++XZ_~C7VnU2&YTjkbdrHmVA+XP&gm0azxatG3$PLQ?K2yJem>BbWmN*xM|LX9 z{KRQ~!X+Qdw65M<2Z}(Na0vx>y zw=8-$PgUG%7{Q{NRM~0A2mcN-9V9p%|H7C_?mhRu8_;U-?uMDt_-o7Zb2rZ zuwc0_Hvxo503endH-Q`kXLX4c8(ks}_sLE6p>i4B`d3d+IH|2(m5=A&&<&+qj;Hn2 zqRDJpk&bp5T@x4{x?uYBs_6z<(d;on{SBE~87q|cYxHyt=kEbt1P$#h42k;l1H;6{ z=~-Sp3nX(D#ejKy$m658O;6tH%bzCJIv%!<8_#^Dx${ZdTwLa@k&9ktu3h_$M+6z4 zTMv~q4iI>z7p86BhpXS-u$0dKshLp{xvvtk>t53e4*%V41b``KI$#I zL!%D%0b>#{5y`QFt^x#;2|bB=ucDixH^7IW|D2WKM$nhTD1)%2fb9+@u`v1$k=$JM zCk;w?H4k%u6zKO7qgZz@F`0P{U1UsEmFe4xNg~Iu{z_(O2n2rQomV!4YU2+8zTbJVn~{n z{a)7?glwIbgAD<>OKM@98;GQm-7w5dN5OJlRJybOL)BLW#JMiZV!@r@?v_A+V1v6` zaCdii2ol`g2@>2L26r9Y-QC?US!>4wR^g{tLv*CJz+1w1O|oYxo8_lY?fH}$?H7f-BK1sbis zrR^nuyG0c&zxgz>o6?q8@CqZ|Y@ydvu+PK0dQ+;5W1o%P36;%i8W38~WC}tOXg-Bt z9A!En_wHmEDmI?;?e4v1>)7x;q!^_QXsByWxNAATGFV{Px%Md0y83vaf^6y(tDU)(+rVMeH2J>J(&gW+9ShChUZPm|Ju^PL%rckaUg4kPbG3at^B)0yyx$yniRvZ!hk#0Nbins*%4NM=A{BFv$)_sO%PqbRC67&CW5-?`KzvEd?4Nh><+4A(L+SQNMK91C&IYMM)*EK4^@xqc zo{e4n28abd-FQy%Hp+9ZJ-~9}k|WEkQ&I@RKumUaL%M!o(unL-=3i~Qnj9x)w- z*XsfU-SNy}8xqx(z|h3@%0Z2(K%1WlTK7i3(MJ@F!4~+v+BAK^-#-lax(Tg zxbNkagQ)?71ZOsq@a73c@1Yj;NoVN3!{^7xve4MWt0zhqFt4Y+)!nm0p2+q8dn5Lt zR%vwmC^tUgj%@$hOl$zp{5oEjJKFxy7{?=%cd>!fU8*HQ{rS#ih7jXc7NcuZteBM&LQE4QMwziJaC7s~@T4Wu+$zkK* zAMQs5A#Icy-bMn{NdpN}Zo`wI?AEavy7m|-#o^-Z@8axi;yJI%#W4*KBIw>3%LgMc z7rJykH5!}lr-pV)+^AV9nu)GO485huYry|*HC9R$pYNR|yr_5T)^OT>+LR+qU`MzD zriP{0ml{7xFpEK%7o4R|&?BVlsy&>te`z6;GI~=%^7|fLmO9b$ChMlYB5;2+`y4S# zK`=+T*^75c4vR{i)iwow=XB+DZk!%ItW@BdD#%VVn2Hf^Y&S)^5&meYJ8?Oc){N7%5NWSOYq&Xgc zd)EKAUa_KHShm9=05pY?h;Ub@4u!c_k znZb6W`zSA*30K;czQELl>W7MwiIyn41 zUh2mg3wi>PvG)+DQI%p{yec;TgZOcS0oIzt*KNa=!f_uEtQoqDuI}ccoFxH`=T}$5 zmpC<&2-#ZRY?^BtoMS8z>OK$qy4{8$q^+T)DgTyg_sV|RlO0Xu`)?7Q>))-LPh&J& z-@kp3>k=g2Ll=s{`(G>5Y?dhG6~sDvE0NPMS#$jLNJ@$ptVrNMRx+vZTwpgm2Mr|+ zT+j{{yVa+pPSxR@R1Me$%1vc%@;s41>hBOCCd6DhiTSzKdbi9T7n6A){{aGX=`E&$ zRs;~(IvR!LoV7RlG`i%Zx;}zC$x#)OG^qmp9J3@W4#{L@VlpEO(n$0+eZt$P^jeGka(H5pX9>)ktHws z^MU?5^1mi-iz-juVj~7iKJHEcav~jNn`@rSRo7x$EMhH@H)6}3X=@9xa7j*7ySv-f zDMFhI{b_rhsw~ISy{xArESMyg48>19`0J*=GVr)l;-X;g$=u^iHY_ki7cI%?N6|`& zry5Q4Q=u8ZtD9WTFIcMa%&?$^+|}IKQ_d5r*d}Z!kFt#a)@j?(Hm7iZ(eo1vST!zO zc?zRFZ55Mguli$cRj&5#@{r!V5Wipj9nELSBa*I{E7C-(9 zgq0cPWW>=(D$4F%k#Tz|IZD1P)CDG@zY-Dc*Uh)1R8= zk>GS464;QtuVyogPXT&9@;3bMn)aVn?X$<xbyFj-|>*;Kr z@`l^U%ih5~$Y%ryz@S-CKt$*Tk4uLdWKkbLiT=8x1cGe%TZxkiRUw)neHWibs}o=t^p>nxgvemVY~q}&jDT_iqU zOLg=zfwuO`gs{m-W!DfNw#>4NC-j!4fc4O7B0 zRo8DrY_qwM@qYDX0ND~)@i6NG6sa_Crp65^YBu!a#oVCnN&+&{TPR6^iJ`gCJOnGh z?kT@nMjbD)Et>d8W!lp#h~=KLg>pt0)dVnbt+ns$PwnJ7RQYx5n>vwb66frHf@>9{ zy1WF3lvyYS&Ns?6UW`^Y(0A|0`T_DsOSSRbsbZcV(g=M}s2amt>s*$52?k>Rf53|V zJ6pXOzAerC%LA>eqj=H7wOnF#5&F`Ky1(tJ{0uutv+=9R{74uI?P+B&ZqiM#V#pt1 z`uT8xbOkBDjdr^cFF{Dx%_{3WTdC z9YpP>?y(p6B=MZKv|W;vNR!L8ZB??tf~fIG0wpAkEJFERjZ;gW%Lyqz3i0T~gC34d zwG_|dH@_8O8F#k_m~%!$EGd?RIbf)!XVjUY3@WJ={je=}8I;6jB|iTQjB z_!byoQ}uYM9)ibLYV87&8E&0JS>m#FhNXN(C)^!5b|XS@?oK{ zd8B4}2@BjjC^=sOl71W2*4lx*tU5=@?AQ<yh8^QKj zWu+$GE+4V~k#CQ~v&I$QH^JRX2A8txgZ@c7vU&abGB`5@-}c1g|AgLrJAZ}VD9x4_ z|2ignHS%1PQyug>LwUp5!M)I-jdHla9EcS* zr4$m@iFI!&Z~y?srdhwG`QyW6R1nka{pz;2hneOEq1PNNGn|qMuR<#6u1Y;ux}sC6 zWb%pLw^?H-K|xrl!c2(#dO;xSYY( zloqbj!36`}>6!K;lsmkPevCDnw@n4BGHkY&A%X1gvgY@T2a>j0qx4iDBw=((vnRgnvuL%4$2Z*GSe3Vx zj+c>>tdUwV!L!2;4-TF+?u|tzFQq%KSIJvP=;F|Pk?4Y5l&YON`rrVZUz*&>$B`=3{-p4TsFLguz zuI2*U)a77Rs(bN?R3xlf_Tw~@ELLZQUj682n9qsYpQM+;c>Zjk)v4ynuB4{;v=kVihxrqy!L`e* z(bQvbWS(#!%7byg{W+A{4^7iVKBZW|OX`&^mG+m>j>CIlmkFq&2b!U#vG3EePnOpt zmNKW}%R-PEKnM<=6i5l831T2JJ55N>5-FqzSdlc>)o?caI z>F&pav%*o?3Fl0o>w%wjf6R&Yb3AeV^oBQCUdExC9qF5ATGvahRfFP_4ba7wW}VHH z3CJ5tmRx->6(W_~)M{WQOG8tgv$S32UijfPsy~EqW!8)HlHvZr5k_a0@(adU_kl&cf4Z}*z-_%? z3IdEL2KYCI!|h9+kx^gGkWaB1D7-bBMf+eeqSU*j3D@7L9gXd$yu^j0XnmNO0=GY2 zqGvi#t?jW7uyH>Y^&q&6-G0=py)zDjqw~O{+7JRp30BvI)EPxqyUC{kZP#{NSz!H{ z+A*uHz8+5-$>ekA<*esezin+Or_df-y}@qtHplV*pGZyrB+~ur-d_u$1)>L#$A<0O zp6!QC&SiARD^w;Cg@yEncz*WJ%JWZ9x}A5@_J%}re0ok7ZM{{o!AJ9cqs!J@jwrxJ8uTZSx z$+8J#eJT-Pa*ac3^SQcD^jmeQD2D8?P!?I{I^(S99`h*W~q9?PBBo#X%NWBRx8+tIsnG_ejAk8SO}fOm?D`45^Hc zQf&$bJ|I$P@&oy$E*%lqmxH6xTX_YcDkjs?ndtajZND|b`NXR?(*!Y8&g!+wKL!#E zR*R>7c$~O?!+tg^d-e4PaMdk41D4A`A=z?zAuwH>`!t~xg@=0{TjlYogl==dnTp_{ zgMPmi2qJFQqc%~6-5gBT7FlSfP_Lo~`IeT1dnLH;pCQENFd~mRMggvT=#_!;CFg#G{&YCEP zSO;h{rXF9?uS++;1SZ@^-XKvmZbpp}(ornp*&>WB?>z;r+Edn)`k)Ml=Ql#Qn65p)_`Ex56!YdCEDQNieAF@ zDiL19L8BJhOTCUm$eUvkl+|I4ZzGa{nv)m6os{mb64m88a1zC=O_I^&3-yj7MXsbc zrjE-bULG^8AQT)fu0eCQRTA1>x-6Ok?3XQaf39wc^i2hM&{d3xO+tD0(Y!G9Y4bd_ z@Iu%>p5(v*f&*93o0UG?nkn9Z7__bx+L}HIiVl!D8?DhGY=jg{i9YxCvsJqjI>WY% zx}`okgAsk_nRWX|{^3Z%()o4vKJ-GVnBQWx1~Ruzz#)$BA;p9as8fh!XUM=LXV49tw0ol3vG#Z$OQK}z^z-$AUn0iY7WVQ8=v~=k?@rnL-M59Ot^$d|ovpJ`HN`;2}G{ zSs-T5@`ltBhErL|z^c_t>$L($o3vNdL4@X7I5NS8S^X{LU4eh_XcySA=O#Sith{3M zY|`YgIGNKtr22A7<>e43mKf8?z%nPpK{i@s?>&ksgoA@CozQY`qYD#PVLc}%LmzA~ zyqS`pE>2Otz|fhrAqcuE)k<6z*|tDfbjrIkznksF1tYAPs6Dh~d+d)+K;G692?EUS zX(m^$7UrLl@4K?HVDR4tI=8c9g6opP!LZ})e zQr18Ou;-OSD>3&r9-(@qrC;TWZE6h~=U7fdA#jy=5aI!DVqAql`UA)%Ve}X$GYyWj zjw43(^xsuZ+)+|TM15zVg@z$nfNrMQGH}6d$QMppQ{&m0#94f8h4-VODTV_XnVlLG zxbq?JDkMEaAcc3uIp0c=l*bkW(~Of=Drv7Qo|ueldV`TqhQV1&4;=nv9;$?7ecL?# zIBup{TZ_pe54nt)QA#!Ji_f-%OkJeA3#a|Sodu>s6dwNHhlGx%OO&qm_Xuc?x+AiW zADHpD`YThFIu8`TN43+ea~r+tx4H7f%0RI;2&&eN3`pP@gqTnT62NoeS0uW7DrLI z?|7Sk_gI#CdwcS#ZC~|$5^czE3MlbKm9HO(fWZnJSb@Z@+&|lVdJgg6?%4$zEGu@bagGwFp7*>>rL6RNBW=7m!N_bhNVl-d5 zaGg?mYIK}dMOqL&Wyar@E)z*g-JmVrZ)r7LIf&pnlGt1B`o)TbnZl5B&ORZ6^4@D7 zY;J)$d5j1xGYtw=ToiQt#hyn}(-2=m)iS<1!0DUJ!*~-=Cjq0#zoXo6(5x(=K4*sB9;X^-PCaUQW9D{uJ6E1%mCn`j?R=$5egX<6k9wfHx* zFw>KyZE7-PhqIHDP!DhOS>SH_L|$ zyw-@1)vPax1}Bh8S3dj3BRIo#`qud}cI{Yf#qo7=wHXvl0QE!Te~O4MreBO>2i=PV z(O)QX1ET)?{rtTCex~h&LPW4$)rLtN`_Q~GCG%KMe7)75m~GSKnXK?Tbuisw zqklzM`u@Nv{utlI`NYMKVl!ybr=2O7zzpANsCIS3Fj$uPd|`VJI0#)*%rOYawr$`t z9bn3VX%>|AN$Iw6ai@Y37)O_%CRX3%dsEUbV zeQK4@qX_F`sDzh8WUV@dUNnvqW75XRhufduPqE)EpfC_XX5!Gm;LNx0k+)txgp#%B zO}#d>)D58P6?_Ds)MKNG=-%?V^xja~)~Xn|qvU0a1NVn#js@-)!TM z@x#Io2PL2|c*M&V2?CgVKW3y>M!FMh`^A7bTNZ-O0e*s_PF zB$sBduy^8i(Ex6fEC}a6lB4K8qp5s|H9!L-t(LOUbv5KMl^{Wg?UHMk3dYi`^~p2d zq=FRT@?%N;TMl}P<-|Gr+l-e7bD52;+iI-ST}=CNY};{};n`dMjOUrs^|oJw=U3C8 z{#J>90HuQrf^^?U)i0q50{3%kC;H+*W*e?`a8_4rN|zc z@(3?-#2gj&jrK)jdTjRBlZG7oYh(!sfu6`_INZfS+1jP1JuZu}ovmom@0^P4_YWg$ z>`%SDvNfc6Buayf=^iL^2Lx^2yKGFxy95cG%Ox)hba%5_&B!Y$T=%VBqrK3_G5v-P zKk$9rm>OIojTKq&mA+V33C&%dal58Wxogj1sw5gjFx6E@^B*u%uBHWwR3-MFo8qq+ zjTbvKQ`u51c%U(7P!C4eJAb9xqhNQ>JJI>${ID_68)A53D4sypGh7G@fY9Im897*1 z`s>fpLfS-xFH)md+7E=aKlg*8n3Fxc;)31{a|`bYa`xlG-50E?x@Zt^pFzTV7qPI0 z`8woCsj3`%m?g$e0nVvS6hbSGfEB{XR&xIKK4+uF(RwAvvg~lPr?cf~l=1fGNPiL- zF{1H&2Z#gHkL%U`arQiE5!;hWZH{M>e0-o`Ee}}cN-Wii%$7OU`1UJ{PGP>S(tW(k zsx2wAb(wR9zW-49pAKrA!rhLxF%Ud%{RHLkoqZi!MzNO%sbmwHaEiAi) zeA?@^1kM3X`f70$Em$@K@_km?pNad*0rS-hDQc4$t(wO}{VDpoW4&3kaemQpP3Z*b z72XtuSgKr{cXn4|G$jI=Qnj}UEXX2a5p^C;gP|4V$DhrAa79T{1+>X{*HC2}cCu~S z8vJp=U+l6EEOyP$vCZ67iwXC*Zzpq5x^70J3oNW}g64=am?_aU$X{E8LB&cSI61;2 zN2Q4Qwr+8z7U--s7Rg!7RYbXS6{=PN46Bq+$bW3q{lJGS#u~bAxCre}zFcq5#c3Id9em!+vw<0WFW=rBRrUvW zQpA}qe)irSiT^^0F08?MW#a*;mS7aGgVfwm%*oCyz7U5OD@+ z!OWCp8|WS(l&Yr9pUK9$FL6HpY^`ZRiB0{lh}Xl8zNficB1r3h1pIFqup#{xxO&5v z|3rH8K=bKzp8T|FGb>%&Ciu4Kw`&%OA`9(+42$8bSN0kJgJ!VaQbbaksV*sn3@0q6 zTNgwH2S^GS(vO#@bQ6gh3?ea+5MOA=PiL++l0%+1f!SxT&YApf@Klifd&g1Mh-0qO z1&s5#DKXP^U*bC#+~gKOMRwUzr8W03pE7v(yH4hSv$V})rohYQxfyakCw%{`t^2q5 zvb}?4E34&pFQz|KRXv7dLXjI()$li5@1G%m?4_Kfy$sW$=dX=G!%eetRFXNn?I`Uo z1iF+uYOs>DoNf>X7?Zk!BleJY`)ADVitRey0J%uGdGTgwlH(lIcWoo$)o*ARiq!nZzDk0?RTfW0S5wm_yqd z#-?b+<~r*-Qspplh=PI+mE~{@i2`<(=K-cDQ;wbC#W|-RSH(k@tg#r2=zR zdz7Q1QR2{tvrzCT!Dqnze&T`Z;*iK6eUuj}^t_RkOm*l1CH?!qt?X#y_Ij6_h4lnR z_0KKkdHY?+&>FWxMw#b-4P!F_UXQZ>1e8;IU$n3@tI#iadk)u1Xm>Iom*}Ut`bha)=uKV1h3{qejlf zNh2}oIL}}S*g0Z%=yZgih&DQ_?$VjV=UiYbZR@|~_@c98i+?XWbvd(Y=B7kc`n?yJ zCQ8?r9v0MFgs5UT@H`?+`Oxu|k>x8odYo%MChj8Xtotj6VO~9!^L#ydQbkF(85Eur zQ_O711inPE+NY+}JHWYVdh zu4Sg-vI^xhsVBJkkD*TzqT~ZF4+oHju;1s7EJfyJ(pyrj{i|ZqYY4`J9X5*WfQd<( zz?mqXK?$oQ<=bzWI2lqyx7X0@1LpxoN*5V*533SRbZAXf{uX{$3=NBw(0^ON)w_V-TUP2U>k{@#N_-u(g? zAd1*~R)ce0Ba7M2=GgU7@P}a2%Sg{BVlTIwu}xjyktMU<)UUo+JOAnFJ_6h-^cTc~ zWmP1R{(`udI4q*TKwd@1nqdVAXbgB3GVT=Fdk^FX3N5C)}NWPujyA*1poVDlNjqYebv$A{-WX+<{lYC z&}}tL3z>e^7yK=f(}yS>qmLuqX%?Ec1@K0y*1n>HyCKTx{^inKNw8G@sO;Fp%-=qP#yPM8gTfQV)@^%xcotgw#J|Y;{m4 zYoTca$f5HZC$3L_cX#D7%f`&b)r#<*5*T^)$ub^Oc|1n5t1rCXZXIg#WVz>PJIZ_s z{pdxJSuT?6^%I?`iygZk6SDZeme1>I*Xtb5+I&A3XNmpg7s6a7v*wIEbhM4WLG$Ox z=^DhvOVx!(qVYkO^XPGUG3P{ zdYcz-Vuq_+oedq~aKli&je=z^JFgxc&M=stG(Qt!MtA%?49w0ljoTaNbNtU;@G!gN z8y=7+l^S-`e0mGuJ%-oBL#jz*`$2`Ilw%8!lLBd;*H|#M^hYz_w3o3wuhR8Wx%Iky z>i{0#DS~!O3qF-}1twgj5g4$?zZR;NeMKoL=@!Ev8zd1mv791`Ml|L*-pa5TO(4$U zISI8i|1*BNATEmJ#Jf>{%_{d`i;LFG@5xZLe6hPOVnaB&{zLgcG$vH1? zmc&>5q|_7lPfH9oK9xevKcOkp4o;zO(5r~FEg?vED9@M*zzL)0>3_O`15S{nKLCrR z_uoPw_mQPuy=i~DLTE4&zyh2fSBB*zKta;epk@y*rQW2F7Dtx~^MQ2UU=n;x>h6)~ zk{a@8H5-ipUOM}+^-|*}P5cCsRi*Gy&Jt=Oz%p7TEGO@Y{Jh63q`IpM=y`7;)|J+v z!ewu^C8JJd$GJwuVluh|_k_|kIP+9w^s;YuWWRgn-IV`!@F{EUtEoXn_bv|9|J3SM z>c4+oIa#A5w773_IBYAdUj8H@qyKCFD zw;fA3x=g0FP9ZhEG%vCpg5m1J2Xu;1@&9<}_g=$=+1})M7$mMYxX}Hi5yCw}QP@b_ zToo|E9~E|D&BD_lrJXRLtYO24yar9<>w+|;6$}_4t?(hka}%C%UJ@tU6%KD7xi6C} z)&S)0uvWrrg?PDGi{wBVsI-?Tv&0hv`PA?V$$bwAZRqF>#(TqE8LROTasw9#b@y#9 zs#Fctnf*x#JvBLkr==Ob6>N_1F}4fy-f>pJRY#P=(!ZOxscqecds_9BHRRVpusiYXT%UWAmJ>l{qZ2yNbQyIsO2gze_W)D_Kp>} znlK(cw3WvZrVu@LRj;}`*Nn^0roBS-h=9=2JgHD0{;R zJlY5NCmHQ$5c`RquV{_D`r;3kr;%(ItrL?r$5eLfd^qhY4q|ymo+AK*u^$TlZ`?k| z{}{K|8d=hAKicdMqD~QNElb;Jh2~hcSpqBGX{9y*C_%sKb)4PIW<<3;lkODj?`cg~ z@yg4w8uDC_4YYGX#4I*I=Z}Mz{3a5Nvw@t+A#`VMamC*&a+<&0Psr2o%EBf361S{V z%@${45Y^^6YRq>zbm}Zm9O-63g+HsQhF9w0MhVeF5VXGwN$AH%$|D+_*!lvhI*9p)<3@v+$YhN z`cI1MntH1@wceuVSe#JJqmx2_GC>GeM@_M%tO2VgY-g0xicI?SVs}7w%9@9Y8cmf=`#EEubUW+9l!L=C0!xFur z!)!2(g|Tzy45)tXEA_euR66Di0OY2cnLj@tHZm?#EsU6zP7`>N2Szk+%uak4@}M~< zM^`Dc-EudKC3ya0_n=sLR>V3c;b}17>J5P(vG7oj^Pj-|^JhKB_#4c^+SK}ge&Yp$ zT5H#Ka;zOgVq>hHm-)T}4jgX6y-!K^V2vjr`y~9`u5t_s@Xj%)32{p%8iqJQ*kZe9 zY<34NWH1#k)wa9y(}aJH{kehkx04X6b^GrA%8Wi|L&a~yxB$`UHo!pH)5OFJ5!((( z!Gsqbo|qNI)P}7HHh3y2HacpvL|S}QR&elh{=NxSRhh2lU2Cp#4biwq3WUph>l$r^ zA*L*u2Z!s7K;{bz98?fgY*eOWn+iok9-l@Bfp)Hk(wxL^qUy~We<8yIwE3SHw`lK4 zoC!`bW^wjQU#~c;9iQt~nvEtoV{2@5$r}=)z!Gh0SvZ3-h-FgryYouPm!PH2{1K$! zmo0;ouA|rlV3VvMocX#)vOl9nWXw72J(vrA`P#tX_$ARV?E(0+=!Y&4-<>bRi(y80 z#xN&le1E>xw1NnRXBwHkqcExkE|L+r9HF31Y>Mhtkt$e?#>74!1?q5Z5P*(LTlK6m z<8}-STy;5#+g4Diz#Q6Zvv)=^iwrZ@jdzeP!laTl+G6o;o{KQp?5Y<(gCWBt_80kI zK9uA_hx}uy(#G4SuJtd73U8b)i@<=qr%_VDX#1~SPuQ-#SsQoKj)Inz1ZwHku6|9G zo|cwW;l!Y>H07O|#L2SMeipwCF#2u3ZNu4q^3ZMLvh#UJ&(md@bL&AxS2w;~4Rqka ziCXA+Wz~*2(r#2U+2O9`TFXMK&I068Li;QpTvY{9#t1wLPxuDU0G=z_JIuWn&iL>| z4QVKpP%_k8c+3#j)2BefIrA8vqR6Ym6O>;aiQS{d^6k!j2CBVJ=GGlse|fvHx95); z#Z_at6}PZy+fMnhta_o2Q`m3*0}`i|0^-Fp@je^!CF(Fb{h?yN*vbkAJ<&&isw(r1 z2YaLpmy5d#$?|QO)mZZvbju?Z`Ao8%3Yq8g`9QF0rDzI zk}ISLX)q#>dxGXivM+%;^Fz1dee*IPfnIGbZVN8>0`7`cvW+9Jt0D^?52-IMPi=1S zL&4PyRqe77k^Lz7zT$EJ)%~=I{&YnM&hV_1v&X{z2Oc}n^sos}Pao9+ZEC!y%YE=h z!FrLs;%xTaQ=(k{;M)eao3Gyp{TRfl5oSMF_#B&)V>rGF;Gy_wH40(xC>IwOsuM$R z2n)M4hD$Qc1CDOpuV2uK8ZN42`*iHd z6!V)4O5dfsip6QEGDY^2BSeZEDnwisQyBB+)=_v*vbg3ys-;H#m&50raD^=27C!Mz7SBey zm8sNZsQI2!?Q?c6k}% zGmSzqtkTD&+O4u3c!?HXJsoE~UBg4GVFA7fp5CZS9Zfh6KyINX;<(Er(O{U&vbxr> zP5CWgEQ35%(G)|fYy^tX;I(x`L9pLhejg0>yNPT1(`A5{adNJ!j|1-?BWeO)oa=jv z(D6_>K!rOFuZ4rwEE#dT+41qG8Ujz3N`V7=2KNZ%ZHut5HVIa7P9ltfte>lO&&d7N zE?DT5KKrgj^Q_d0bnO_J~zu0zNv2; zKhI}GWi3jTcpdiH?sF_yL*hh(F$}l>m+5}=wj{qU=*ZJXXj(00xj#Q-N7gV^G-@En zw~C&Oh-C4uVPG+YON8{7qL5O`PrpDvHKodJZosh^lC~VFYSAS)vSY4K!Qj_8%$kZyku?knNX~2?qRd%ed@P>5Oed(~;|3n3>E@$0 zfB6}*%7n9{W?q`EmRlAd01iIk`|j43oogqF@PEapi{x*7IA_(({xh;~oG$WEXNW*q zoexaaHNk{%oP&4&{#arZ3yG>Ae#ef56SsBKQ z&SjUsqS+`BGSdtJFv2Ap|Mjj~%VS=x&0G7em&rD_M>YuY@+ZE^t{hqFp{h|}z794k z4PC=o7nJ(YNTY!g6h3+wzsj{5{ljO8fu>d~L-LbvqOyE^6g$wRQB*5F2jIL>vOX zqHI3xKq<0kv$r$ z=MW6~)Wl2((O+&@Y^G&vh&ai04LYq}y82TxfCRv(ZhYP~(Hxz%G0_HKNROl{pYsZL zA>`<)$k9(THGeXhKxcFxw_{mAGgv+iJw71`H4ySuZSKe+Z9EX(JQSM%}S zM;=#E9Y1MD{lk8KfDx}alpx4ErjREb8R9Qt=KCSW0`C7*h4Lq!oOyMxrVt`dao#v< zlZ9Zv$%Xh${2TXf?sJmOiWEG!f-o2bq=0E-f`nfrPLW#_WGIvSC^t=Na^>W=d+%CaOy_c#|JWr*b*S$V+uLcf#-W3mK_Z`B*;vj97|QJ%1`DoK?tm7F=m> z|8~5ja-bzBMx8Juc@L0B4xb<254$gj?NC$;F4yQ=EMZ8Ef)r!4q@9hcD6ZN%ADjmO zvE2Fa=a%s}eZ}d-k|$ge=!j3Xu7T$q^WL)VVp=@8h&c;Pup{K-D^&hite_BXveTwXhbJ~hi0$(b+2N0+N7DHvGh{~Hdyzv1Yl=95DC zCmgo_gad4TH1GhA1Dr_W*4ulv7duh@GbjV5h;Vh-62PZ^m~CvrBB^>fj#MACnns$H`|rq@;fx*2A6Mj9YnlUVFUac-7%8j4rx@ z?3%pdVUtvsDEhSCO{N7IcEH_fEy^5!@$#&{y#DK~{8sZI2m6q3X}s?~QNwk}^IoFB z-=g%-+7A`#s(wxj^52h(HdoWg3|pLQ>{YRNdTlw3+Ieri3o=%pj9i!vG(d z%S5&u$8pG8>*|YeHkdiqGjlb-K=7{!L3??5Aof@u@n?0HCJ1S6v$j+fe&e!!t`QY0 zt66f|aUv{9)$p)FA7+vIZXuS)y@QhLuQBJpo}WCN|KmYuTBJt6=02$Vc&|0Bt)z+9 z+2J_V!71|yQ9#DKH>iZLaCfwo$}l7d4Ac5a!|{{L>fP!oovE1WkMAN)4sFgLjVdz7 zH9Be^HC3Z8mMXD!Won)hhU)u35U_SJxkg(mJ$7IcP7SLqUl6?9Td5$Fl}O~*H^rEi zh6lP*5afAeKne@zJX0u)0(&4{P(P}!@gJ9?Z*GI%NOUo`>!U|a4yvZt+mD(QCpHuQ zZ}SS}hYxGCzk(!A_MaHI;`*tcW<9T-`?x+Fl~(#}?%EqxCM2WEd7LNEq_K!Iy|TEI zJLH`$H`g*sV46{NGOu52h7ixy2%QG>qk{EP#^EAz8-b-8LdY8Q*PR`(=Z1!!5I7(% z98!l4VecO=i3hLjL~s)nKEa)#pU{V1$A%ILWhIRId=6xE4v=f(?-->MJMHxc>rN&< zuH?Y`A~e)0dRtzx5FiD=p2S; z9JsCG2CghT0>P%z-;3++$^r4QLIy8$(2JdAxcVjz@h%ndzap2ynap+TL$r0=RJj z)Z#2ye8E+rqBH`YQUq9`DeQbp+2T409uVP;47s4X&SyE?)HtEx3qk0wBO{SdpHYL2 zl!Ufd=!Iev!Dlw*5pt-aE0|T~-NF)JPBqz|vT@yS?<3iQwZ- zlNRuc`Z>@Ie-sfFZb^}nZk6r^QBq2}LApV@K@b@l0qO1@7`j7ZXryE4 z&Y_!uJ^0+H&;I|9_rw0Ozr23(ShKE+wa#_M?~HX`v}0m@SZGB(k8JooWbDzNE(V28>zL<(F(`SZ}@5T=|x^j z&a5NBpTMZ_0usDPjrOzQ3#4DivL}d0C+u98pt>n*MJnLt;BtKq>TXE=(y)9p%LVHX z&^kiRN{oBBtF_$RD2&Uz%xu?H9JF+1YUVM=^!dx1SMl`p7Q+bhp+07IzNHlrsuB^n z9C_hyO&eC%pT;Yp_veiBeGl5ni_;7&^Zk4fR!^?Q4j!@LS(bm-uO=D6u|h5e7KY|< zUk;99v$Yc$iMUm?|B zG7cdn&oG}6SR;lLE2(<$`;6?Kn19s_b8-R^J^xH3#U?zOk>B%EZ`$HgbVP?G&E_eJgYeq`{MWD15BAp^REcO` zzPbrZxBkv1{^7PDEbPJXNmFePB`9f1Cbx2t&8JI-RL6 zlpBlYsYdJ{cN`fp7oKe36Qw%3PcVfd)I*KeXAQ6%!$n46%cQsGX6K(sn`fIzWnQPm zaX6hxmv5fzWYMt(!`^U~X@mDCX!Z*{&5l*OM)5XB?Got<)W4VIri5bp5l4iHU!A*c zoi1Iz76GMAAo~uoPqAS|$d?T<1FrEA4OiN8QruqMeAE9%=#@2eK>LJsDa59``W3aB z@+G;VTaLtXU}{$OCuuDPRut-bsLbd`-u6EH>68FoapGJF!H$@;rss5&i-5TgOPPUz zuipQBRr~zG_8z9`#m#=6CH!;Ic;ZPBX^#0&9!E`k;+1V*PSLMZ6ZKb+tp4yub_g&y zALXg}4~vpaWG(T?r(PjXEhgx&_IF8)G{u3v!#}UwmWYoHoTBBavQzkBSan_mQh@F+jMSb-wP$jFQ;@Z_dye;QRG7*eIIX8WdDJgx|0Vw5ZH zr3K$p7p`oI-~`tk>f-)4B+?><>GCpTKuF;A)s#sp%n$sL{P8&9i6gohd1pT{*X?9z z%3MVfy@+dk%QptpHx@2MV@ZCJ99>M4e4B}RrF!5Qx({00fh9R$-4a)!EIy|0+Ui^_77v zw%@{N=?N$FiwADC44duj67&mJ$r-lvQtY!Ze~kI$f3G+il1G zdzTE3@92h z3~qk?DeL*87eUCv9dvD>c^WX}t(8VWnO?w0>2q-UIztj~ZgtHrBun)0s9EwKl97XGW3m{4rEHC5u}W*kGk9*sg_bpvr0~#de8{38qngv|Op8^c#=E>F9z35B=zT zm36pBhdRD3aul0n$PN=wLRauAjkoa!PKs(5TOz*6ARX?_;IydyEMc)OaQc>&F+TTu z5XK9(5xK?SZ4gKVIm=g7(IUV7@TY91#cqNDSjQ|#rQjR4q&Yy@Cg0Jq1t|F~0zDqo z5iN9^*Kts1Vl5in+jsEZH-*znf;i1+w**L!(jw8!a^#VNd=Y)(MP=Tf@&>>;FwB= zyx{#xitS)*>sp;?bg0FgCEerL-IMIO)`>%%;^SagwOv>?!T#=GNb1J zY4f?5E*#+ZyE^E;=j<8d;21;JT`zDE<+d|Ety+CUrD^x!ENNmk(k+K93n$yW;9}O~ z^8L>00gpC}?U#><u(aI|FLtz3$$eW%aXj-OINsF1i<{@u2y5zm=t2o zwya`VLb?w~)3vF|RM!yx$PcGkZ3ig^e04UgD_(qR$?vGznsqdo$Ts2{h{F#u-ND(WX6FCXMZ9 zJxV`Q5~t%;6Pt1wTUm*nd~GW#p@#%=wB}zR$LMCTQLZ5;e(H!q$_TuNXTvGy3Zt;B`2boEvr4vI!c}piEHJXWQu<{Gani*EsY7ppk{pDTdfzZ>bcYA5Zi27#)ma86KA~+qH?0mP3(8rU((>52o0$^ zs?aBATWNQEk$QU|s$OfM-NTfb?~OKsQDbpVh7KT!wK_M96Y4W*m~h=$F=J?YXb>om+hZhUGL0OG8|p8@33;TM(lh$? z!>4Li;tOus)*|Ch?ZWLT6oLwuDeD>9^A$DoROxyY*+K`>W-2X6^*mZ8p)a-96}RhZ zdPT(Lj)R+FlKLetwE}bg!-re})ZEi_j~fjJ$Sv#D&B*)=**;i?C%#uC4f{w&%U9xc z_`FwhUHLuUim3=uTXAZ|@!VoS;8&|cQ0_5_!@R-w_LEUSQyE_+cBNHgY{a>OlS@N5 zA#XS5LD&OX#dk)oh``a2zUxnHP7DP0v}78zQs#8gI`S zU~a(}?irTrGYfbRK2{;T?bvCdh|=?>Spq~)n2~)bh;#F+L!Dik_^sYdI2QZ}42jtsz%u_VU&dF1jWnmAi+{;G+ z=%dE(j@@SCYz_~JU4x6AUB&et)8$i(SL)W|mTWNDZr3G|M;=lieTtXTC|BlOuCx*CANTWR z_|_!(C7I8Zhh{w7-%ElwATJqp2AM2gD=`1f!$Ou6MZFVD;tiIJ{Kprg^>ggn4ycWY z`et?_pDb@EZI%WHHv4}|p#4$H`LKlP~o{jxsjsi{0) z{`NL7ws}E^#*w714rumXb3&cqwfY!YVR6847y?WEBc_3it2k4RirzI^VzuLISrQXs zvXNhRw0;2m0W=jo#!K8UkrK+Uc-_1g%}jJ`=%IRST6aN81!3K#GNuLfejngP>_md8T!Z)uf3JU> z;AqWOi;mUXn%H!=DD&gu+T^qeSWkQ- zJz82==gNL|tWowgs;_?awT7PS`Vh<`dF*MeK0q+W)M)|2%dWR(^!laXWDva={T@h1;?|0=@7M3xd zDzdAEPU~!j8|(6L8d@<9MtfobHN!HspRX$)7FRx(S2zII**ft*nex;WTYuTMru11* z1x@+`BpXKa!6YB{h@_EV{bZ*- zy>lV@5RMJc^g@?xRA#Mqumq^HM_@$kdFaUbU;}Kk3e3lGnqXC4blc@jtHU`gda|c? zHpEy|SCzo|h^!XV#F%|#ghaIaltW*4G|~LU6TcB=QQ(|ThhU{j3U*JVCSq4h;cl`) zA&j>w7yTXP+s7qt09w^`x)9aAIx0ekR?5pcFYWfS$7r$fnSCCYDE&l47aJW~N7N%) z7J!dlr*ZtlTeI$}Wqj-55@OCmynI?cYg#2Ch0TQmmm%X`1p;_1&g(;sugE?Bie`GT z!;PL7yP+-ezaGFo8$}x5^;EnQQ6(}`Zy1S9<(FjR!u$FZJI3zt4hRVJ@^2SabU;4dWPG2`0R)Iu=Ndgc{c^lhl1re zcl`*C#FEDl7sTE{_%~>_2x|5woytYS`nxj#;KecJy#jlEOCOz{Jj4-QO?4VQX0oY)-CVRkZhFsYZ5 z2W^!4C)RdCb9^!R2aZdDTj%mR5E!1Dy=NGO|^?P$O(Jtr9AbSt!y_MW#GdA@A9!I{LCVRBHV{ z`Aoiq91<2X6eDGuDfE|DRvFPNn1(O4Xx6+4v0CS+ZgnytDDsoL2(6nj9%tdhRTvl1 z+znEr+95m7wc5=NapJ% zj++9KNjD@0#X??)V?lG`0i}kkO8|tmatBPbG9NGSabjlY`Wyy&8$~y{M`PNr7#T54V)1TZadrlT|6=sJ=(r+W z2_;iRy592_S3ryR&AK-UiGbS*D*VH3@mD2Hmjx1EllAv!-m^UZ_LzpW{Y4Te8jRNc z6D8LGRSX<=W|kbx6fxU5(9mZRy(~pY;2@*QmLV!Yq3OujE0)eJThgYHtoVr=Yuv#; z#*K8(Z(c_HYWA7MYUMwVmnxfgz($vzvt^*B9lEon1-LaAn9y6@Fko6d*HVIpS-%t4 z_#xx?5uxcw?+axVyltidTm@&-Kj1d9IJz3eoHUbX6jT{Ze~{COjZN7f2USazVK+;= z$!!O>hE15Sa-Zly$hGe&0*9MA7(UCl*#~Z*CF0+tyGHnR8Cg?i&=9#E98OA_!jBd8 z6Kx6T`lK9fVuE5L>j+O27B|a`qSlYUe(*Ye4oE!(|NK$-^<>T(mqAE$KUd`j&MW_k zeU~3Vf9~E~K6>_!p*8`8k+Hln2f~Q*2oZ7i$zEc<$NARJ?2EG?PDKo5R%)U$wWGT% zeEB=|X6$V-Rm%J$R%YT-&rMwhDS;MQ|L8!8ENIm-k6p~5sShzu@8WwTM-t|pOtfbFXuL^?6Zp68(8FrCJRkI9QyJ}8N4Tn+zPWAb* zA@di@d;lRG4+rk+980_Vki(t32MM^lX>(ANmGd7we!hT-pJ9CoLBL0}aoB0Ny4)_o zz-y$;i~F8VZ)hY4G>teU@C{S%owZGyeH$$CC|&v$+D7 z2ZWG<2IC^@x3#)79P=mToh(z!jzyv@?K6`NE7kv@kX%zA!0b1>PS;QQTa_*5BPOjc|#{@TfWuvTOBdg)ZOe_;bfTu zcB1@;gJj-7!MZ4Stw;9&EXm7MX9+0MULL&=E1^Fr38`Lw*0ME&cr6$!Q+oa8GNJ;)|u9!>rCwswhKJ@imiWs}V;N=3kD*++f^wr0d z!=-#jo0)ika7HMRmpfDY49imdy<-UH@Bed;5=fkpvZS%+OGkqk^KXW6%2l$!1W3d( zMad}7i8(2HeHE@IN4rj4m3tWT%FMl#GDNGp&X~oeemIBMF*@g)9TYEafnG<*@pa_NVoe(qf^0g5^r=Q% z`EaJ*y1G8>#bQTBOj}8uz?sO(ce`} z{jN{o@~~qONMZq7{xWZE%X*KO?$lTPXM|f#nw6RQPdN$(_o_bia|;-Ql;r&2(d3|N zq%3G)fLzoVFS*m0&tX!cj$9<+aYT3Y4c`bS|4ZJ)^d&B;V1M`WB~$a1RTT(}1?l_3 z7Glyy2WClh)>CT1$X8991t5FD9dYI++LKC`N)2$eD{-^b9{ZyMGp@|sL~n?NjOXtkTI56)(vj<$Z%#@8 z-msBe@o+>E5IY2EeEC?_rr?OOc$BP?l+IF0#F|E$Ooyz?l%cfoQDOy0eW`dolW&JP zfzyM+Q?aB(-%Nz!7)vZttha5?x(_9Qt~PVi2FDxY1D)=X%W7Q{x~ne|3EQ>kW-bs0 zF3tKzg*pWYrZgsWx*02HRZPb0jXOUT7lYg9wZp}C*<7_Jy7mci54$W%Oqc3XMZ29= z#I1V+-EWBZ;_KaON_77e9Kr7uh{DlIW3UMW$Gxw4j)LrQ*iFkP45n3^ofP0&-qfsg z?2>X`gV{qI+P5HQVgcAbxwK`}GcnJ^I*aW(oVl{qEz{v5=250Cv^Z;f>mkiHyDwtP$L?CCro zV?vmORGDes6de%d5?x+ljXfa1L!CN5`I9iTY5XS}zqf}f>E|wBEl%!V5kKdraNl@u z{NjD({lVxweSlmiSNSE(2~D^fi;6=HB}1mtNQ6~Ltl@jJcVa&(?q2k_S~#A%Je>BN zdgC~gMR;M$-yBh$EjP-QX-*t zOLllpl*xUs7?jwq9iDumTHt*`@&~H;l^|LEll;niLn^Mhv_|}SORRT3U82ne#NNy0C3Ra4E>(Ha34f0 z32(u4@KPEr0>A%>hL*ukIk!P!7w&aQBUM)vft$)!e#&R0o3KJyXtk~h&VXojn)c4K z;Avuj2Vl}+q5fpNWkNx8{S3f&oJ(AeLlYQ)6M%9xOUi{+D`aBbFu0t@^2@Zqc!x}# z48&;OaMhB<(VCA63~Xc2D|nlls$I)yKwRP_Za~1JN?2cBRHV`Hr8eE|c{YuGu_<^x zp2P@^#rdfi)*s!xM|Ed^x<_I%?n9pN_FFU?H!bLOD|{C?o7cgCwYZHH~zcGgO)FsT6b^@#0^`K|VkA;bnOybNnGJhmznN0WxV z`UibE^T2d!BW)Ab+#FhGjP)rNXH+xedmi^~;S0SZ{pE4?`ESw#5RhiQuUBoJVwGb% zh{m*hdoHDrkbt*Y0nxE=>1Zw9aUX7B9Ha1k1 zmJs@+#M2-c*BT_lIVMTq?&n!C17+4x))**@^H;lQ}l);6uvd359itQ-t zf_i>vnQez#(zKLqgl1Vx<>gdMJ;^uk4*rbv;sUH>k7Yl_!bO(*him5W?zo=GgmwE~ z685pNT+SEtupG`4seB9xGpzhoD!fq1<$A`aVV_&|HAj{Wz!vGoYa3qU0GK`IGRA>$iQxsi}SUa0JQc z?3ad_xac##AG@YPlKu(1^4@6=&Cs&pTV!WZb(SvZbMFo6s%7=I>nH~@S?Jq2`999< zr~)J!63&>96G(5mHY8M+)ydbScAF1zIO=J7vI)7xI8F&y`|CH{u)}M-EwRGK1>G() zKco~rBe1lREJH0$xzGqOq^V|BJAt@7)vBx{BAuv?Z6X|y;5^|jw>)r99(UEn{o#6e z0ElhH{_S*sMR+(#oovQ(qxozwk+*C~TLnP!2imI@*zU%S@U6Y=vx+nNvxSCKc&yD` zXwX6h=U?A;p%POKrH;a$(-^q?BV`m*Bj3M_U=6$@M>wO|EuemoVN{%VK+{dtCc(1m2ub0%g`LQRVteTq`OA zV-g=#4!+!1-nL%;PCtv0IM-S34m_#1>6rG#biSCXmibvx-@%rzmQzljpzV;m5)(~K zluBJht8&uHA^=o!|8ZC+<1MW@`$^}ana8DIvr4$;nT~BX|LMG8MsI=$<*ilo(nyc# zu?4eX1zWi*n@#`^;Y`|U&$s2HqqdG%QqloNCMR{V`{ly9#U&gIndgiob>?^Evt^rN zznfHu$K&t`GB1eh`Uu0xns)O;%dU$Fz5(PXrKtQYhG5wIR%s`hU|qyXyY&Y9C()1z z{NP}mU1!5#ba#}n3eV$@OC%S4ejZ1Zcpx{Z7YK3~?&WZN-dMEzH5tl7*UXUnI(qkJ z`*WDgus|!Cuhr15N_B`e$YRc_&?>w!+&Zu#a6qIlS*WhLpY2}b-63YcXE@0*7U@kw z@Ashd(1&6}5GS=finjwRFfEgTN(RdSwmL2)ND6x0dp&Ldugww&oj6`*bBkpiOwRbe z82?>VY%B>x!0May_y>UVaFe01J4Q-OLV~M)BcL7}i}=uM#0~lkcS_|MM%n*G7*>Pd6 z+r-;VaL2OY4zbK*d@D^zVd)T4^7z?vmF4ug%Z`9WR&9FcdClXamaUZ(jUA!4G*Z{) zdm?=TjrBRd%VzGP3#6!U3ojU_nEdrVd*UK+x8`LgZ$5sHb3$yoj$U@YT$GjPXbRmz zbMJExjIbTDk8R7fjk1S8KP*Qwg|}&*@OBypj}HFK>=tgf~DcKu_{Pl_nHHm6cc*z z0#jZ2O<%WA{l@rQCEY+5k*HuY&{u`~ZA{%&!Y22n%m-G%_Qjgz$;;SbTWpg{Y7*Nj z&P&mDgZ5mjLn6gb;PNrr_L(5DKh9AL;I2Uo#z~*a>>np|LmbRMjaFd7*uPUbkqEtNBE2C4~tfk3-&3L@nUJWl%_#Hyt7jD-0NCYIQd~ zC?HJjAg%P?u)dH%R0$;pkZ3kPJ|T8?vmlj0mtbFh$|9~oy20_Yc{WoqUC3`SMZ@0e0ahJhZqawJ)&6nX>a~+RsZk!mJI0Wsc;RvM`;FajiuZAsC)W zwrlz^VdUgJ--YEc&%ui|p^}ol-~LhQCEt8)f~^w#fJJ94XYDmmg2y)XM`h#d-M3}0 znhj#~JAuj>oZiYkq^1>qp9K5sb#p6kw%abM&knvkPANArfOTGvhiu6P-6wO++c3)ATAF&Q9Llax|nxV~g zON2Kb`v$RFgQRsXYy5Lf_t;Q(SGFxZd34GvRJc!by3h`|Mo7Ls8I8b-USlDyKc*K6 zJc6XMd?}Wd)6yk9)t3u$lI6qByh)@Uj=H*@5(hkm!9Qp5D+tcR^h)jtr3-nz_?ZK_ zR*2~3JtT$mgvUPe%*6s0GQvH7__kP3?t_Iq>|FL2S{H+vnz{L1FV8kcPr|i3Ikq@k)R>f^`@kHe^ z-7bLX%A`&!xlui2u40(6Mk|NrD%H-%fkuK@EO0@3X~H9j)sgZncp$~5eIdrz^qXlA z%J>Tx*p`oB?+CU@Qq3?#uIcK{J3pf1y$gGg?F+5#8EtJHQm8gR|4gktX?WY>*RHB4 zCr@C>u~U6h<^k~qJQ~uAr~V}N`1iivVB*827wy^R{Xrr5OuSuag#iFhyuDn`uX_j4 zbvDjGIpLXje6cG(l+HS00tmG%^yLo&kYbuH>lHcwG*F4I3aV?fAjlU zvzhkfi$FDc#Boum@(>wR7KOKv#_G($n&df1{5qjv;`992YBox(q`PkWOdH<`uocC2 zI#qj@Z+Rfa?0RRE;&+|rugwX=TZxeU6|p^6$2?!&s|=PEfwx`v^g4%bMo~nzzrmr- zc~0Xg!fJ*$e({wg&@c>lNqP$#+Jhu->x|F&!07E(j2+6G=TV|A)vD~Uyw2e!(-aw>B8s6;a&1;jV` zXT`A;`a-EFOmRCp*%DA=Pj<*u2?PnmKo7SLKfy9WxNlAe_RyV~tfAkdUjIph!maND zEyXwI0hq|b(x2-31|pv)XQV_oFu3pZ>2~f*@~s&~mwPjN)7o~12bnK(A0TP#0vZ6c z{7|b`@}OB$6RctNel*O^t|{Ir4I1|L?Oc3|BImZMW@k#GnT1dnn`QXz5rtuWtqXIN z)cb#SFEKuf(BBrU$xpQ%c;vBik2g2!zGW+##;-uU$|U0OKJcJjOYuCTXxD0s{=4Q@ zhzoAGysSmAnf_H(Z!jnCF2S}nUxNbE^uA<~yp>pqic4P#{4nT(PvhiUnaIbc82qL! z#fm5V@k^@_c%i1^(pWPCX2C@qJp1|$cQZj4`2(xLg{)Ry8BKq2 zP^aTHQp{&r^ zkj%Yn_A8Vk_lAtr?;ItqgZlSrpC2H@ zZD@(d)>%hvDrwW@>C;Ca&xmes{Yu}NP~;r@1lW6$AqG}?jseimLy(F|Y);P5{o!9f z1_@Ex9%6kx1Q`$;uE&K{neyR^kPS0H;-rD-qFx$~%lw_$^{({w2Pbxcw$H9|bfunq zU0Ak*2v{V9JmtbePp2?#Wp^bv8Fe>iy?d`AgQUT6SDiicFsQTp=a759?3elUa)PTo z*v>bakH0sw{~F1q@8qWO3UGTgbqjUQjOKvfVhg~0r|K~x_On$8Cra5b#+W9HY@ck_ zKRGfP-jatUU6fbPKy$5~`rTK4nrgB}u&~fy5OsHAV<0`wU46+*~Cm65yw=sfu zK)yrWTnOfG@4+B4Vu=_W0Q`i_d&9iZZ_jUU&K5Vz_YCP(@+3j}#pWeyyQUWAvP4Ql zAIhvayNN@F`}zx_qr<&?0QxMiKvv}7Z^cx^55rIO9lYfU+st{?})&j+^k>4of7Cm&pQa}1S#=)XAz7G~(HyG;Nu!I!m7U6(6~ zv;c8kd%*&b1@!JxiP?XzKb7FYjgZv40a#xe&9AN$|LMfohIM|_d;?kRc9uie^*&l% z+&s#qs1m^qWZ<>P$PZwQkX!pswi)#P#apv}L-d{|t1sb#yl%ibzOm8NVjDowgpc3BaW9K zDYKmlG+TP*ZyfmQoO>074+D7Sn9i=_orW0dcgifRG2j2eUU1@nLAb5wTA4{~<&^(p zBuN7hNP`zlBB79yK1u;>dGOV`v_q?Hyy9#9z)}vT0kclhS=a{m^1eJnj)|(M64*rDmuzex zs%jGsuML~%il|BYXAu-K1gjo!ZkQC@98Abzgg3cT=|ejfw>n;;19lSl5SgR?f-ns% zcM&TVQ|$X{e0TvC3o@!CV9;5vc|^8u4}DOFUtp%*eqN8P96DRfvRCAuEH-1)e090M zbm)4dRI1I#^627GprdDPZ;FtoZOxH9OfJ`xQe!*O(7-tPaa)J_T3cjBH-}wZ+B@n* z0U%Nrcg1cMp^YMQO?D+LqSJ?p97QHsvet&wJ$EK}9o$YtGsW@bpZ_YuKDvuL9O2Xc z)fAo*>$8WuHX>B{l~A4i-adHV!~77VUVPru-o@)env%q7%w32PO45KWw>;0ER}y_Q z;SHNu>>U&o@^H9?F5bZ00Y|~XZ5PBOfdV7=6WA)KB$hbEM{8X_-DwkNuRt21W|}os zCyat1b3Yu|8ML)_${vKSg z5WYob{Wj{P2$=d@5&Mb(TZ3%DY+Q0jBu1wjk*X|L>61t1jyV!5a-yx1V4VS;*7f z$HxG2+2`fs*tR*pZPl+FGy)uE+aQek{mIGC2_Wf+_7xY#m&6|8L*Yor_Ixd3E-Dv8 zMr-rx={E;eIVPE5;eq%xY)_gS;ENsN`gyXkwOUnnu!jbUWw3%3eoX>H2E`4otrZ|@ zp_@xira|EHE{CwpJer}Q%ir7(9e3AYJIw6woQ!V^)7>RAUF40de{Y$=sWc~qbhBSC zbbbIS5&bDJAx=LdQgAV5?IH5^A-0nTccmoAZA*zgKGaG2I(k&`nKkt;E-|To<4>pn za+TRio%`N^kMpwU)fgq4Ex%no=emEKyVK^h3h^@kfLoBn+Fz7#`M@?(g z+(LJK31K>^oXVxyauG^)?nsXpS5Ex6{Y0i3m|v0jvQofr-g#a?fZzT4ItT3;i@hol zFJ?)jeH3X%FWyd^#gydPI=uHCbNEh59_z18hyU^Y;4z~wcT)3ZfyUvF{n8_6){SfQ z-Wz-(NYu)=siP$@MwxdcRNEec#zV7Y=`>YbM%mt}@)*+t(_St$3DbTO6(u*+!EJjM zcc}-m;lZt?ZN5E+Yr}T%8LSRB^&YSX{TH z!T|cRdKn7fAE+~kkpI0COe8O}JM%moK&$(Ea9@~wzq%Q=yAOHNEX411oQzziH}b-F zZBz%n>twNec@J(sZir-T+;q7^=*e=j(rEjmm2l?c z2-(=N`?Xp)NU$zB?yC0VG9~8Unh{QLM#L$ev+bqSo!@J0dE$q#m;MFw3M_PETXVL5 zxWBLnGdkff(x_igdD90nfTD4jyPWUqH4R+)@5@a7UIrQR^_`ms!>`c)yY6d3B`gm)jJcv*dfx?)wYE$h8xXSZ{v+eK_kqykotGX*7nv&jwx@ z^%Vh$cxC2kg#EnN$;PMKWp@CdGn9zL6L!9TJr%54d-HJ?)9&5ln~z}pKL`f?*6WO4 zN_A1T?5~wRM?7*VM5$vUy)7!ehV6L|QWgr)WuW|Vec&b;@J0~%V69YU<*(-&oK+Kq1d;Frd&bhZ%#=lzEl5^_q#5Y@ab2cUgdSa7qh@1zOe4r5DixUt4l5XSGaP9 z+hq53dYnI6WRC!`f_MAMW4yfT_u3ZT-RXFMQ)l_ypRwe3@QVP>!2Rb$f2l&U z{r5<~k`fHp^%*+yAlBdO{fp*zHXD8b4FpI70|W4-5SU_f{15Xygzhu|48Mcof0)#O zb+;)jHEj0(VG{gJ@GCN;nYYc_eC+!8$i8HztE3f4KGxl(oz0GEi=&#DWN$trJU~Q3 z{_`IRr1o0BG5P-*`_HWE&)m+0>VIbbe)fMK`Cp3t|Hm-%hk ztgVBAxhHHaD*9SdR21|YY-wO@rVj%{8=kFGfakDQ>7_dFzBL$sXg!fb3+s{y6Bu#0GRJ0*3eY% zi}*c_CpoPh!WWoWG}QPHqghy3s9`2Lm#N@EcBtWu@^Cf}!v*etlkqDW^B9-JI=NSr z5Dqc~U800Dh9^bD!M+o^S7I9({%t5?{I&Blj~NQ#rgr`i52+3qsvKM@&?HYoS_v(? zK!#Y;0|Jp8loZDfCtj2n2rqom(9-sNvu|8Th(d$0C6S7Q=g`nT2YGrmBNdk^qoGaV zJR*Qoz9eHtluq^}}r@ah!|9dL{UbI;Eh1`as72Yep` zU!dh9ePIxRzu3T6EDiSeuW+kr_kSPXmxW&VOhHsq68Nj22iDiOfEZcY!00;j0!57( zzfrMKc_q!OXKBu)`_A&MK9hsF74#Mueg|IQ&|Kd}7vx}WW&z=K5Fr2S3SQtCdYYLW z^w%XerUK+DuU>;hEy4OAP9_#67IHxp5D3H%erLcdFZSZs?ZE#8$c=1ltazE3?d|QE z?Ae(t!G_GNJUl$iENskdY>dDaj1Wf)8(jxR3kb!}LVlMcrVr5r8(Y~JTUvmi9o~O_yxxdGKSXgp8@}PFacMnv>;_eBu1oEbl`_tBn>IlD&_#rZm z|Lnm-vheng-`-PEzLU+WojVX}P}rSzp4%QvmZ6zhAKO)S(pF67wf(Z;%(ryRtaxgm zc0d@N8CfxI@(Dja3I;j+&gTf;Q~Je<`*I8|ct23|BO5BEFzm6U&enMG*MzfCbxXzx zt>bqz*r0p=^6^xp4%c2rLKB7sZoK=k6$9Dtf8b3p-_7DZs9AKHbL2Ql5^{ITGRk-n zvhgmLMl_$}*zRVUXG|TuCH{v3awR|tp(#(x10%+h;UvT+4bezh84-A&P*L@c7>k!b8s% z3_fXU={S(kd55f$iI%y!`QY?4L%g&>=EXof+#p=%rfg&=qg_7R>YUTF5_avJ67=sV z_PyxeYdbk2?)1a3fM;lEsGEAr&E+n$9}!rha#7b%6D)(ZWY8T)#89a(Wie$XpIi)i|`u6dLzo+0@827rSr6g(Dxk~L$ zP42YAVo1qyj5^BqCflq1wl34cufFqN-qKvA=YRb=v!IjWzsowHWSUaM&VlE-P?IRx zRhBb&b(9=ZZl%d+-^(%0xauW&w;_2wop-9+#7cqUls-$xza0`dUy9P7EHgeh=wj~T zSxv%0wxmgM_;_{R=N_{@l+~4AIcrki;)@Rr^UZb6e_+IV2(pOf!= zC$uy>S!%18vY?k0JpXjAljn`W+n(U=G84w=z8tN*RMN#%dOl+_^r~dSATi#xcDo{K zHN~~pZYX`ux{cV-4#{@yFvQZOWhH>a<>oN8vZ7$cIONKR2=;JbgvJF`ppE7sWpeuI(1*S%)cF91WX+ z=Ss3}3@Sy!1$756&)39-=-jV2wU@iu`^r{O8ywS@owthpTsGC`O4#fg(I2sWd*8h4 zc3R73dcrVanCiN8GG&P$>|;l{l*)6#4nCPM?Amp|b>>+NX78RI;m?mCMHfx0>*ZG8 z9CVe9T&^X0B6Z659FNpJ*`l2pZtW81oC_q#)A#yhN_JGs*}QtYV(OhY zI%jy8%M!&(>Qx*MCNkvzEtKh z4M+$FvF)(j4*9CfH4)BAio*gj&QX8=2!DnQ!&8KN*NztPH}8Y14hc&}x3yy#fluNp?Q&W}=jP^6Ou~$F`MbZ~kHD5)MYF|!{ zEqNl6gtO{>Z%?$Wf535Gy6z$)=Z$B@k89i!NfmQhy6lS?M!MEuHo;~pb+T)cveF*r zOBSxmBCbYKEyqUMi(#r&@j5}mhfigU`0LRr%`npmzCqoRCNO^S2Uh$5cDG=|9f+k=WkjAr7&&B6wYzWA2V z@{TB)u8c526JSm?A(EQ)`PW`-Q7H`y!T?=h2Euri@ZT7fPIn~8q=N-eBTrBA3*EQmgzUF(3f?$HP$#B*ULkhFiI%x{We>G7O&&e)H0?vdYW>wG5G_=qo8&0FPZ`}#xT zL-*5}(=8wD)f8u@8kK`&D{iIQ-TKQ(4OaZEgTrJSD;uHUMLk=NKCJlE5D^gHD(PVH zET!?>Vd)7uQXSSuy{nkPs|_407cbq!>!whhDpeL z#m>sQU@l*uCef@%ZOtM^nFB>3s%5w4&|xzKX{bZnXyIfKuU2xiKwQ#V%z@`ycr0n; zN*2v#>1yB(TiU@I69c{#ZCXW-Sd|5-+0A+|N-B zNaV(T4oXsS-hItJs8I#Uoet~XS!GC`tK+uOEJ8?r^ieg5tDWD{EnRWiZ?;ucrI;Um zCTyELI)C3P;>v79Wgu&9L8UVg{l9+qmnTlcL}pMQ_G>~kFcO4V=*;5x2L8*HI^j5t z77Bq7?<;DE<6X1$^UVDyn3SP*z5M%!vsOxXFG3ei%WH^ZKNj*_!1X)2O*7T`)?28n zazE-vI6Y-!GK5}C4DpTu`3;!X2w?$q!=>@)U+aPjyIu)nKR=3Pu#;r!Kh^y_@(w!q ziQCY`fTFmtc2QRE_5n*a^3rPElUJ5kawV2uL2TfqG%b3308#Zr0nyB%F8!V91%sTY z1RD=ly|HRxrenQ*UePD5oxlGm7=T%~$ic*X6=U89DyD@4#T0+I_2(PqJq8NT{T}x9 zu4Dh*Q)6(ny~mG<`Tng^;f-G&q;Xf8T#YCGOBZ^;Ilb~&(D;`Z$$RX1@Ws~95*y_C zOxR;#8dMda0sAj6EbNM%#;u%s8d6IAyLpFh01QlPN9x_Tw~jrwV{}kFp0(zl;0?_o&b=LaR+4R1nLEX2~7j4<3(>Zr{o~3Y6-f9E3M^Mbe z54hBW#`~D`DF0N=HG0_Aw{lkVYsQ?3(Jq3_Sff^NaP5{P z`Bvm;ALgN-6olrbxEyqp++1vS71Zv~jh9!>*iAi`lKB2z<<+ZKoCa(bOtGcbGx&PC zf_tYtZ_SQ!INFR@@FdcjkgQfUyl1SKV(+v^nj5n4aLr1B>C%X@b~F^n0g#7~&o>a4 z*!^n%;Oek%Dzp|rVKU#tNJ$xw01Wr^mL}CjzGBvCvpt2Otgk&}7hM-{Qdw@pT(|TNvV^WBnHsLZi8P&4W~CwJ^X&|F ztGYY>mHXcb#r2AWVMAU5V=80TvEc5oOWQ#LfHFzRoZDqbykW`{2fOKP+ZP>U4L7#x zh;YpOQWkB*_8&g4Q1i^c$LX#g({k>xsNJT{N^$ytRJBdfZqG}$Y z`gl~GLTJkg>NxcQk68jZo6dAU5<19gZ#3YK)$Jzq@o|=S;#~X!tj8Z!j;fhXln=@9 zb>P?U!B6@4os%cK-<-$j2};E>MF%m}v~OI2JYP@)aZJRn;F!!EgZx?I74E-!Ju3qO*+?~MD75dq2KS;X_3#fj+%RyA? z(`OblwqqQGVl^$8LK<3*%eYe=To%*ZrJ^bt&fDe703MG*=NuOnJctPUl-0zG{FLaP zAf#a4f(KvvZVd|IKr!?2=2#7T43(p!N*$}sg(uLC->!OM_mxqtj8=_YtVX{p=6PR2 z%fPrAGHZmD*$DtoK3wk9%7*f+5D;S8@%v$Pw2`nI1c$hfY1&U{^!uJWH1kLBGj)pk zq7`QpoX$EI9`DB)>5+TBpaSf8h|_Ad#T`TLc~2Gw79Wm5gP52Y40L?EFQEnPW`1P~ zF`vL%n)lMWVM>LqS^fD6_^^ko>-uz#*ih;<1Jy(lOm=&gbxuR^!uTsrH5 zQBYySO^tvdhUNR`q}?F_aF3H=fS~F^7G_NLPV2GgApbbGOu=JPp>^IZtxN)UJ~@$x z-;!v7OzrV=Qxe$<0DuCnO>NF$5uGm~aJA)G|CIafwK*5jY)YVB@wjcQOdE-F941Wdb2m+qc)D-8>8eTGm-?8Q%a0mpRkIt1G^Nc zTinEe6TYDY%#x5XgyHT)@}+q_n#`73yEo`B`oCmT3U^rf$^VZq;cvVG;Kh-%Vy-_S z1mWZd?V9}h-`L@3PB3&-SMBtvX4CUjL!lba0X1 zbuKFgH|_us@>m9NFJI@L^``!z@t`-SSwN|*DfPC1KTL_g0N^km0IrVR5P971H03?) zwfnHkZv0?%x@b6jV4{%&mxefuRU7>2QZE>>lF(3$36tFXPu11c+G3>?q1+-e0I9@e zAO;b|G9sbNWVDN2zP;gCA3wKxQYcVB78CMZKFKsry~pPdz^yS5nF!L&deBK<*uK;e zwJhs?5#@52IHzHqrFb+BSd!&%Q4G~q+AXadQn?nM8z7$hz)Z1bsy_G}9sa9Vn0Iz)hOkKKoW}N=Ir~(+C zd!l^Uc1`K%f<@4;Gtts4<~jVTHt2L35(XtfBIPn(bf}r;>lgp<BRJ9$a<#w!>ww!jsl@pU!x02lVJ5EEYk4U?++2s4@=q zE|kjVg2k#Ua^4=4VvYv50oBj15~;;W96tpZ3}wm20!QE8v*wxpVwYq98c(+#a330F z)66dOs0U-QHzwwL6KH7VI-yuyjzU&~Yv+e2B>=jyHx*wD;hHtNfs$Wl zK-{*{7xtYpT$Nw;#q@2yL>xOxd{Xwt6qYb;FUL3Y74o}QVj~2`uA10ouL;%@y_xV^ zal`HP?!mgOyV|I>yDJai^UT^N?HevN<2jsTwo3a1!I#^WUFWN*mV8V7w_d1B;e5L_ zLzA;9=M^rewR5F{gQ~W$a&2wSY1KkQ2+*t0_@Xk7C!6u6wjL@E5!I ztujhhP?dAy9ZpafXK+B-ltpdFV5Zda#~`K>C*>2s+;_Ri3LL-T*{wU=ny?%7Bn^?& znIP}zc4Jg?HXcgO)7c%_&Vmuq!8RT-?8@Yv?&vp=n&OE1G4tqv1 zUt4`R+H1kAT+GC}#ll<%$ep5OCje?BYuJt`LdnIB<1uYZb9Tet;7;J3KR{8X!JK8o z^_KsJdF70OwJ+ME!TjsBjIfxAQo}Cbl}z1KNWTeEV|%bvE~T;Sx95gQp7h{9hD8E6 z#;P6-$~$IDSOB}RbcR2=(|W=jKxw55kyKI)r>o8Aq=M7mxR9)FG@$V5(Ad~`e}}p| zJV*cb&LWy((TbuJEG(ns}^+qU%=`DtDEqHaGOjjo32Iv+}yzHW+DqN z03EGi3dG)J`C0am&q6uta5<8%Lh>AP=~DRol1;Hj_C6xaNg{gg07mVDrTgWSUH38J z+?lV>ezN6yoP!Lp%K)OKLThgofY!LcEpe4|cD2D8&YuL-cYs(Ur##v1Vx7A4S)O+q z6xca`)=)m-+o=*g0fIHhy(YvSQgS_INFaitZa;S8l$yFdk6MCZJ!O3L?T0~x`DM!Z z6a7fX+g)$Fnfjt`04h%r6xQ$IveVoR;5<1bh2hK2wX0hV!Uy!Sd~SJdq7CosqV}aY z16*=O#ut)@UW6$$rvTemW$bhQg3$aObAZF{*HdzB{!)y-RDiwwmdI`>GrZzcKBhG# zRsoNSSJiP)u;tJJXLoaK-wAbr=sX8CXWLb|jB6m&_p4-|ac1{6bG8?=B&I%nt$VzD z4!_%3#Mj*Qf_xF?$)~aRnweiE9TZsYdyjpIF8>fYH^Pv65ZjHrD$(mAPIn?f{PzJM zY>xteuiw6M1bd}lcfQ#t`NGyv8>d;L2YImS1#%hxl|s`IXdZA%UX4_-8st4a zJ@f%3tg{SGU3c4TQ?Owy` zwS{hTAd;AFbMV^Tb$`EF#&Z^jHnvN|y5RI`JnCPt4wS(GW$+n40hl1t|C0&&!M>^# zLhAfSNHqM&bGlUl;VM{M%YND;RZo_N+x_NBrr`g(l9= ze1CP7X*f)4H3w3v=pSDM7$r|Rp@7Tvw%X|rBP81yR$qWbg8^^TjaWli5Bmoy+2g}{ z$jIHNp-ZO$Y*5KW-V(T4FbifN?=`Ii1XB8r?GYhng?tVrK)2-TU-fX!X#i;LDIkVH zl%)6(*4<&3k7*>^@M@LNliWAqJ9=F*J2?sH0dkOFmu~DXIVcQ^42!i`RNFlS6?>|e zBBknT)DDkS0KLLnI#p0}RMUROC<)LpQ~()jPV88b(X6-?ujKaTve1O!MB5u~vT{;t zl6sq>bpR(rO3k;h>Cy3AKR|1`=kZ|wVJIKP!Pv!|W3X>=w=l6U70r8%`_5RNy9k!l z!uZ*hrDHBgC-W-a9K<%X0|>yBZ(N3Vol><($FrwZFFkV0k9R?Lj1at4a+qwVd7Q(6 zx1cl2HRnQD2*>tWlM8gsnZrvIKBn!A46b3@A;+RCgGzqsLu2Fv>3WdgCo5%R#*Bv8ZrXJRk{U%N71It?b4>YeuMQdgR4Q%O<*U~|27MG{KtqFF zw*5XK7PI3V$uPGpp;|Ndq~z?(^b^0qLSvi`X`k1E2I+kRhd)eY6;;@A9$&r0)nxk= z2CX_3gPsKaHjaj0)Y@_fP3nirStluygp2S1WfH*q&c&iKRW;hRGpbi~+jXBmctdn* zW^Qgf_N7j#!FusKasl83o8Ge$MF^bz@Xl~6zp&xLdtWUg-V|E7;BPF8V+RXJSq;$u zkuq6BWP2ocu##xmImJF#fPDd?28bYS+%2}N{V;bkb1V>+}U!Bggy9SDSGAky=8 zaVOrV*B3z^v$ZknvhDtS4P>S>H@1%)yOf_-26P^TB@b(}t7I(hr5!(R?Q6R03MA6l z@6}B_%*oI10VBy`ZTg}U;tAZxu=O`T*SO04dYOT9arAU#15p~qa3)5}y{#3c&jCqPn0oG|z!Mm5Jj_Xd7W2x+Zaagq05AoYP$PUOVdYo$u zDQk=Ce39Sbbw|XATLc>xo25T(xG5{MtT!|x{6+;tT;I52r6}$U(rj5+Xk-^)8mr}$ z!wA#HN5(b-DE22?6~Hj;)7rA?e}>pG)c2lPe@EJgv@I`8_`@x)NmH>?n zo^w6zfQGEgvDyX8YWh-P(Pl131LDg-_)^IGy~b#O+&P6rjDu+TRee!9&Ee76-t}3V zkj26>0NqV%(Wj=SmH|v(x!OI?W216^rSWMI(g)5fE@Od%w-GKj~?|DcF$ZCF6hj)n4Q;2)ldP}Y@FmVf^}vUJ1c%o(r%tM^getllS$)Gl>i|6vNhT}=uJ{kGrgafYU-6V0Du+b~_I6Lw(WDlF~J15mOt@<&1Bha7}^P>1c6pHv5@kLp9%VYh3_f^vyXM5R=&Tx}MGZDW2@manl94(GRsP z>SoP)!K1=`)Ri6V4E4e1`9Xz6kims~P4;Ht+{I!38$iM2z8CoR9tPM8d2wRdj?;&S;_nxSMYY@{5>iw0`cmkrXAq=$zJ4y& zYdbNqa0rlcVfm^|HV$YvcQR2V(h8Au@Kx2~T2wk#%a3i$i1xQaSp3caORpvC$J!80 zj9Po-MBl9|eB{UCH$3tfpGm`L`-&hAuEgD0X><^kZ}pRT{OoXZW0DbRcOYO?g!S*{ z75p3vo?2Kc71{X78?~sd)fe^dNdmvTXr3IP%_Iuq8x#vxIldQERilgzAzi3_LG%5; z=WCh_Kq=-%5w;rt>V`&PN*LXOHx{ucp^gsQiSO87alXRYEE6lX0L^mr{9 z3g1Ck1(4xiXy^E)un*5C`RbN~lh8dY6P40!q2dE^ATb8Dw5K~0yH)J%7Ca}5Yf|9JWa(UDl(fuc`-H+G~&afXQ-JoUVwRw zetfi3!w}YtQJ2{D=%3*Gh!8+i*S-n=LF697PWH(XKzP3lp?JF5%X{fXTe<`g`neGu8=f{jVb-}_W@1~$S%IS%w>HU`>@q7US!kq^@ zY-19?x-mB%X0~x7QjOO}`J_zS-WJ7XWoe_9y`NE#EU8V!5%Rd0xZ)Vsgt%SNcMd{PTjb=k1*MWB7(ad+-lz0i8l zTa6jkh4+6u6a>z{fcgnsZTt*$o_@B~;p|BjY8d(k=$<1TO0vFcrW@N=)sTY9rSY&| zML+%^ET=sgj<@6`rpzg4(b}Bky-Ad*HrgfO@a!Ax?%y4aK+BYrA0ChUlQ3Ve=mv|B(SX-a}tXAPNEAzAb85&Vw)KC=sE7@ z(F{!RKO_V67io1jlBp(?Cc;3kKHM% zKDs%?`snBEODjgUv9Xa*P*9i=&aONkMIT3qH@Z}Emb^5mmAdif%D`PU?DOwD!%&-^ z7dF0j7w-&@b)%>jllqGPq<7?!cVUt zbR+d`n^2zsv+C26u~WV=FVGksGB{56Gr3HR6!GBX2?>17H*>w86JF=|0qsMS1AwmU zT+d2n3KKYq3$V$Qm(&sOTs@5J@ug9G_E7ZEc2&QxUv~?B^;l5r#~(f6RX<|8mbbhx zH;lwXRmv}PH2i%C`W728txbCH-Hb%}&oXAGr-NArXJ;+U35ME4f{)Hty2E@yuQlx1 zjpI2L6H@C-51kGf2c5q846<4%bbJU*p4yylHtZcaM_)SnRYx6L>@`}Zr}Mex+o?6` zy*@m_;dsM?wyE%2voQ?Lmz_%_ZI|DUKlbKlaL*AcscX?zZ1mQ_Q`azRaw@n7^k>wa zV54bE@gt(4cw*c@^Hiaqq8jACRKz?@Kxt*u?|g{re$YYF1>^%P0YE1P(#z8Z$NV(y z`f~2J{%Ri6Jsc{)|BfmGoSEzPyv)i+ltyp=if@3(?4Vy1Gky-5`nK2>R#~waCZv_( ze&ZO=s^`mpx&?_Kb_LjHK_E~OUuwnIeyV*0O{`@24iGYLE7T5Mf&9?rs>RUK696mC zT?9Yo=p6OAf##d#uYORFc`%+OlWf9ToC46);}`oG&ya+rN&Yvl(qX?x^hnzXm2IH_ zm8x>@>$srAOF**f2w7tL<-2wCk%X;KM5aZYL#GZZCg>!32HlUf^2Q>WM5O5Hx9@Ay{Y^Z@o-)i9Z=O7JkguRVY!#mEaU31miW z)p!rwimTlIife|_kHje(8moYT26`#(?3d)Uk%MRYi{eg*Lrk}fdc_$5jTI(A8_598 z4-JT3DnO!=teTPKQYE9Ptk=_Y9B77q$h=G@4+?8| z(Wys`0Mmun+3#E!-d(5ajg16w<(*TV&wsgPVMADAIs;rqm(8R>uSfi#mm?)DE9OiZ zP3|0-BtF6LY)CfM-B^7M+FwgQe?Y~ov#Yc2DsK59~)Qo@;?=P-@y@KN)Jp5i8 zGGt_<^V{JnQhQLON#y6(4Qd* zo_lt~1L6~`gO!H$j9AP3JwQrDLBowxt{{+!SpulkDvxS+D(2jrpSci;CUX~)2O4bx zGB5>@@?3tdJB>){@>*~|K(<}*a!aosD*HP&H?5lX(w}hy`oR(q$L2b2SI)WF<>75U z;<88rQ7hbk(4U$M1W*!(sqPf|$WDfDeXSIFk`m*I_Mv!~h`u^4q-$}$?bm!;4vM*-mK=bVO;u$<>57~FJ z&C)pBl$E+%asFQMOk<&V^qC8!`sptx2jdC2A}9(;a zO`L}-UOf1c^&s99pC6CJD1@ShUQlUrG&CdEQZY2mcZ^r3U7FfdId9~AjN-cW`4K)b zlHE#N3i8Sid|3VC*jV_-?pl)(w!i%;?mZ+kAoR}(&}+CkE@VW2D+79WNUY{`7PW77 zL3Z&Yb*mzdZe`!y zV?(5zTaHO$-U5QKO1(1f*}(Cc%rR~EnG|-v)!|nu{Hi3bM*}<46P)dT2X_Ly)7bfW zWxZ!#xGG?XnIQl8ZGl=#*E37+5T)eOHjXdZjTM=(~^r^Tj|otjJ>wwO1vT50--#c5_r~uo-u{P zk85Zl6CXTZV{FKk*t=Q<}(zE1$GYqQ&bGC z+z6W0NQM@UousaO##hz0dG6|${MYaxdSV|;dO^X8)iwN6bSm>)qQhd)$vyWnCz8td zi-p;MD2%m_!W$-cvA4r&^zOGIGJ&NF?-5!yDAhmmH=b{34#NAAEP`I!TSS50jEns( z9~p37vKp_7J91x{cG$ zgX?yxJUKIQdkt@{db5c34r8PNF+OTkGc0n!e-G?W#wwdMp9{hg`ahPvxmDNVI0@wEdl2_A;q|_aZ~jZHmqIl zel9fZ@pe!8Lhp59t)K179s|W(f(#n#+*NEi-hm9>8tNHio#u>Jt*eh$^drcgjuPE} zON2dnEkgX&MP_zv)5u;O1J@NVWoL3|v!lf~rP8g$T6ba-yr7(l(r0+p`dok$&Qvu_R7X=V zaQi06WN$BKgMh4lGH-&s6^CV{k8}N4vNs#$WbmYx?wh`*KQOCPP=_LB8Aks+jH;Tga8Cn7QT{%au{K}5M zv3jqmK45wvnrewJR{hf5nKLz^ELG^V;EB*<1nR%7B=o=^pe}-511Xq4!RxVPn&=#c zS`jhiGlL>t#G9BRJqFdnd2B}Fl#Rlj%s?$4>a8!ivqD)I13Nqplu2^saEW1rm3|Wr zGgI`MCg1lfcEDk)f?DFCtbrAug9R$*S z%^QK;+@^t0Rp@!j;&0By1cZeOS=YfW&go*lGCI{ph+O8DQA!LN$1-4jBR`a^qdz4O zd$jw7sBK+CB=u#9L!5Z?iaEz&!BwQ4b}V9cS$uWcW@E%q8K#Q>!oh2dkDsTSn!|EM zKHeuPnhw>tvfs@8PwkC8> zL+G!w!ZTR35AoN72-PSP&5L>L@m4g%4v0R!#?O%&z_`Jke>w6wkIrVKFYR!=eFQV` zL%hb;mvQQCP4+~4K;i6cO+m}gcG4ZvP?|DR}hYSbe zB@BC_>q+{|A7^1x9GzB+8ns;A*UtPzJRCDH15QBHX55q;>%YHklF!22A#c2?Le5xn z51v=N=WoU)Z61ko4rAIXNR}~fK?4OT_g65(f`u#`N53&J@{vKQNqVj%#<(I@2#&1X zF!=FOTHv03bEGp|e7hLAeHeIGnbiSbtOU%^PX@-C#@;tUv60&oOCQWyNR7+6aNzG7 zU{pO}NmtIMn!<^CkrC<{ZznTL+NMGF`H2*fK>kK(V36ycIFAf2rAea{wJ;o>#yF#2 zE*8NAQCT2G!Q;+Gn$ytrv>0x_{VGXZ8;!n$XEz z1p|?2B;4SfSd=-#-})vR3~cM*!iK8w)WADz%=c6y?k}ka745pyGZ%39qf(zSyi_MY z%?>~6w=w`m;R}0@=xrX;y_|2NwE;5OVfNKj@OLckqjjE znyaw30Ij27zN!e1u7iS1Hq_gokfM#L?gyb5ZyALyzNSAZ>gUEKS6e(ahKEAo@;QoX z2{dZVzl<-M8!V4&_9m&t*>nB$Tk-tlIi|U(_@Z!ze>kYNhh9pQrrOqQv3x_%6YTSP}f6A?GJ?r*H(%vaHP0v zkrb+2$NrI=G23f-J0(M`(_Ep!5wQ}^)&Wb-dqg!N*7396`qZ61tY9^5hJ5qVPdp6= zu-Z>$@%~AvUnB#j(oMYg-fw2d5RMn+&}k*^M836cmhy`sgE!Kf2(QSOuZI!MjrRCW z);?lgm3&c;e(AWqyzpq6ei1}s*YUhfgU_!d8O+0)@J5;F#&8=T*u-H4h*armyq zrubcwR%ezuMRcrLV+++X72;1yDx{d+Yj^SNlPKnyqwKDC9e7;>RHG^%5$R|< z)a7eaUh3c`=0wI^;jF%Nb~%)LE@P^#BX6l|atvkQt6k(j1SPm`b-GA@p_?kGajBQ& zot&~^K=K^Fm%X?)xpy+eB9`CUS|Ky!|J~*p8sCb12d}O`RV1utr>voz>CEU?Hu!hh zh-54rF+3s_Ed*8~wb+cCOf}8&?E37c>tH_#XXmqc;n?>~#)9i%BD$gRwEdYKMgLef za6b&Fj;FmWH^tBDAkg&7X=IB$vsZX3;#O zoYpk)GV-A)m=7ryw8+1?Knc+36|4Tjq7?u~r)`;Z*@csk=tmp%@u3aA=EV31o5{UH z)Fzj$4-#vON0g`Oj28C$8bwkFA-srs%a5E5MqcNPiirm+@Zcpjm9GB?;#iv*CPYk^ zIqF=tb}v^Mlzlk(ghM!;TRgtJGaRqph&&|luQ-uF0?y=`#ud~P1_AKznlq5yago9* z{yRa11cx>{W|Os-Dj-=dr*JDLmX7j%R+te2JPj>pM;{hzXyTwvBv~zO2D8&T6K7A! z1w*;~k^K9OWP@`vt>>Azt}`CpqazH>+;K=L;)oFi8iUC;&w*(rxw_r{6>T?MXWg1@ z^XOSV zpGa_~S9S?VCbpGRMBMOKsbNSCJfRc+O7Fu0yF|W~(zS8xCG1D6Pvxqm5wsnXi(B8R zq`1#2qV;vEuWjhTv8R2{1erXo-6x=OsVUnDhq@Wr23DpbQc}`S4s6x8c4EFvbJH;5 zfwtVF68J(sTZlD@OQ;KdRVf2{fTBi1@-vck5G@l~dK#OKe&Bci1* zej&WS7|QPe3RPdM^uYPuEy5t)-p4t-$kCbj;a~JY$}V)Q3L>)GdwV{5U=pnpm?lJ6 zO|7{aH6X;8ccV z=g1c24|*?Z^o8?{30`S#qbB^2ry19$o`K}%lq$3jRh|6&X5fqzR9mvP0TtH(vHkl` zHhQH=Ao-3#Mot_4=F0y-Nyx*A~qRf-t!?6|+gkWcj!@Azm z6qDpw_5QL6{e5ttgomg>8FHF|0ciA^62#!`6>hWVFQkI8+&x3}vyXyb+b6DEEORGz zD81)FlIS3?UYk@(&21ZMUm*y4z(0+-@5KyPqf!5Sb6gW|HzAh?BiJe0w!kfi>SeS+ zt}{IgjGCMWkqKAr7Wj&QUd_6cbN z*^0L#xCI7DK+-krxJ?=4k8O&-OuV5Qrci&QGEud6iaH;qPYN0bbt}@8PgM>47)9HqRpfA#@>dp6 zGCGu%u-OSw!CE^wPv<2{8OBQ)#S5AD`BFSh0Del97^Ux!mZGf7G&cN>!%}=F7H{zl zs}tct`@qywKde~k>@RMklG)y*1@97LBSafZ?Y_b@t&p{4CL}#o?0jWn^gUXWF8)A> zO5q|)Lf5w*WLNP4)hT)?QNB-R4#$&kPb z;=BUVdn)VB7J|S4)6zj-SVs;d&qtjXY>ba@S3=i+0TH+|#O$$T+APvI@&~8Hr>no$ zdH_2xh+BK!1c9BSg@+wO=)`l{<>_rX?YGr)-HXUx${&1LUcUtw(uJdcAsvs%YSv(Q zs@s>;CfUpINXWR51H+6YBlqOTyq-_24BE(yU%oXWAvKT1^n3YyRZ4TM-jxLUW+E|O zB%6^%ozE+q#8`EaCUJEg2XX4F=MLKKDOxAJ*)+)2PXmelR@9A;++v(t7Zo@32P&IP zCT3CS4@KOaFvSznCzLV?=pMBrMW*P; zw;u39!}CM$Zu=j~k}N!4n9tv+3g>s5#L)h>XALE!tAR9heSmq)+Xy2dw5%&80&>X@ zGMQaF;A#MN{0*>F-up8x8OhrTrnAm*LDJylvdhOhmKGMFZ__+D_k=}A4I@&RC*ve^ z(y;e-!S`+5lJI}UIzWabu@C%(k9=!{qJ(6`_hw45xPlfZ<|Qo|XM0>Ea?NQ>W^bg9 z>-04T9%A-owGpDXF}3_&iE&vzg|p9M73LYT_}0wKOiy`0vRb+TxV+3f5OI_tj&~<=2GwML#BHy+mSn z65<{&9)FqIo;BF9Ibgw`{7$m)EuK)U)RD~XP{CVk-y7Jc>Z$5kwOgGvwV`}lM0^nF zm|IhZ1(LS%`GI{d*jz7c9M6|ym(#p4O7{0p;q0>iS_hWOX`TR00|WO7oW|_}EAOz8 zt=5V!L0%Tp9?Z&{VmQrqjQJ-j6&_o&bcG}5q6yB&mARZcd8%JpHvaK$jM%) zsxHRCWHSoVbaP>&6mz>8Xeu!i1x2HUey`EtQnsJn=gxx|`~{0#C3Tv-;K6{Vg(6l4 zC7!`R8@*`JwI{I4bDc-kE}|&L>bbc&ZRi4Wzl~LajR`2oFo^-_g%76@w36NjEKb#F z9zCr;6>tQyU7!+946*&R90uPOOOOz-Qwg8UMe6N&Ds)9~htFJH{}wmNWxl0rSLe+> zAbxb*UeDcjtO}m;I08bNehWHRuo(MU8m8ThE-`dt5cuK$$)0*1oaC?&AeVRK0_=wo-UtIM(6WG;eJJxY zF+pb!$H+3Z(6TT17M>@sN(~NW;i1~#N%Zofmo!!p@99o&3f3}9SRmFCYmr~B-2qSA zNBO$3t|{JAG+50V0Zs9SalBX&{;f1qlg9=N3ShV_tQ`3WvUOZB`m?9yXknq>zmcTl z2x|I^K2p(m+EO|z@~Bw}t4=!3TRQ~RTBDKuLE%D%>Jp~2!vb-hlbJa4DFcb}PY`rmJCd#EfRK5eT=glmkVSY8JeoQ1EF~#_C^f}P9*ajlcU#oSNQfgl$ zF4-7rDixx&@`4PYM6c(Fj1FLIDi*iS7Q>XA%ta_)oC^bqh81?pJN@NGrg?dx@!51lEBeU||dB_E6|n&u$#ZuhqoaC2`q% z)?~rQZ;08ZP;6=mEO8vY0T_7|=(Z@;z{+5OU?M& z?S8AhK$3t&+AE*xx7HDYU(m57#*jY-3Mu597QP8GW;(Nyq#l{gNjTd4OjJg+o&0d~ z&8R2ngNz*mN6LMz0jxT@{S2n;#Xz(GFqmom-r%tf8nN6+aUF_HD~2omlaJKCdmmR7 z2k5?=S!AP_YR-`&c|6K1B?#SqPf*{>{niN$zdh3K!%S%Ph2ZlK*1CA@Gl(};S5g{s zrf$l4uY_2llI*|_m>wb4?;Ua?1xSo?J14wS)_iT!37)C>$B?XFFAk7`QXDMZ{Je!VU_rCmaD_mTL$jVz!P9uGE5Jf{ft0x0r_&_C?|Bt%kWeaXBd6CUiJjVA;5~SO?Oy@l?M2B89_NF)UQ)gN~C~<*ckJ5 zNaQ$=O|bi{I!vF4jB=w#cRU$NEh(Gtrl_N%NJQJlu{ww$S;e*ckO!> zX#_ifbx0uCK1vj|Aq<0hgsJt^usVrJ2R>m_olcoA8t--otei@YzC-r3Nw0+AKd3@L zMYK!AwrmHh;Myae9~V0tuE3@>P?OyO(jgS}(mGK_QDD{kd&zejY5$_!;JfG1Pekh} zWM-XJ*#6s0P(k0OqKHT0@1Wvirr{>yslDuc>h;}ydvx!qekQ=o+xEE+fHV0Sf9uZJ zi#d-`yL4G!9 zL88&!}(8Y=R;TKU-^;&wst=&|y2vnWgT zaG5zNa5G@^j!y%`5*!oSkna|v3Ye;>ovb@Vrj=&RNbpfx*zG8Bu|}ZC7X0PU$)P&3 zaB8pox{tona|yl^ovg4L;mhehV4V_YW33Yt?I{<^gnx0PAX+HWz!^@nV%D$Lsp;ps zc4~DMCrXala+woFRs-?EGM*z`j*UES(bu)+V})8sSMBr=(V4@UfJmjpe6?Q_f>Sa# zL%2TPU%S~{ubvHq4tHEYWPWNtzxWRKtg_gs5`=r?toa%OdyqZ?=p;rFYLehQO#~sd z_R-Xh{xB>3x@F$Q5QElM%dPA|wp+-*ic~Ff#6t{|UFDM)Gz=%x#iNOA1-}67L)P3- zs}u)hsbL!-4Rd`L)yAxdW_?(LiK1MVUH< zuHBZcyM(})^B;MYST@P}y9kOV%ssxXoSZD!KMpTy6n~6;z~UXX!~bz&RinFdDJx5V z#MLv;D6$zUQN`2yOB;L+8pSe*)bCNdulPC#Nf#zVtn)y%#d&gEZ(W_>KhZJ%@25MH7jlU=sCx*(lm_wx?5}f<7QV(un0n@Fw!~bgU0B25WFKL z#=gFq?A+R57~%r!s_+eyOoL#XJq~fxRB!vsd2oY1(%xpm&2`*qQwh{?aaRzU;TBR% zbAU)lhK=;2rOF&~98*RQQ|lCrU{xNHF4dhmGQs|#VBAxBY^$vtL!FdZHXr4a+tO1m z8W(}M?|Uax!1GKl?X8L&|(CB`1oMx*4*2d3pV# zdFfKGoK#ixAezwIUi8N&6zL3_Enatkc{2UvELXT=c;NqjHrPK2+~XXwW%(Cjulf#G z$CO1+>79w4c^U7;Z&_zVpQ?*WlWUQS`qTphHv^;m`+R>&{fQkN=Bsz9Vb1s-MxYFI z@W*`g$X_$8UeX*MX)CddHIysuh@HDBM;9dPHkNLSOk7MzI-YP>c{xqg{BkiJi-rMw_dQ4>qwl;Fyb#2i; zF+Y24+89V>T-XIj@8fK5`B!d0Hg4JEBJyvy5@EODLiFGb$i8xrG963j*oMM;)(DRr zMjR|}iFx()M(_y`ALGKnZRf5;g}Drwd@oJm{(R;&S}M8?^Ixm2EBjCOthlbq^w)4o zpA;1=)%AKH9Ogb^Rb1f;(P;j#&HjmK*d$uf5v_pFb)&9xWtMgGzD}0xD_>6GK=;U z(43?u1=tKA1iSsAHu;mn$jZ(3bJgW2;L?YBkx7O^@S|J!bSKq$wyr2j!J}1KGPUuL zt2<{dztbCA%=}sOEH-Axf#)b*!)d7{`3*3^fbhC!K<5-w1CR)Jevc{qFSHN#f`9_| zE&{f>9MJyaVUS?c$*Q?PUK%)_ncpix=wAZ~x2`05tooPlsyvaA*Kv5`7nQC|E8P+A z;WE1yM>AVv4yvd}b*1D&DTkf2$G^73tR%Rf2Ee05!s$e|t zKqtbt?2Nlwt29gg)HM2_wI}0@JzZ>BRuk?xyqiaMk8q|7EmL&V9CJvn(v;W2UV%RL zzI6{LK-=0Z#i=^Sb%qep)NV+iu92hbWc67FN{ z|^b3eTqjCazcmScHT%H0t1!XF-cvwd@bPG9xYWUyzq4>X*T9pytZL^yvaIkhiwnv({S8j`f!>n0StEc>+U(;Uy+RvhX zF+B4WqtP=F;ICYsQvcZc<+|^@SxziFVn;1m8&@3p5@Bs^zvt(H3!rX>=$Bqf$*)_; zn8jXX&QP;M9K)c4=?4b;gUt(1GJ}xH{wYE@M|)p@eNLua6`9cK5!byV$@83%uC<#^ z=_`pz8O+OOz=K#<#C{HG&-K9^5prs5v#`U*T9f3Z+Pe|Dg{9?hW%O4d%XfVW|3GVh z3a}OmaEJ8V29NqLOPOT~jzL#I7QSDCs>N6?z6^t z)&nMYH$s5Yz|T_zJgRv49^@`#9P2Y7=e=}7YNdu8%Uc-`;77ezOO}i}fmi&=wa^i$ zdd+pn`8%X6KndIIH_(_lxVYVOf}#fpXDBta@TcNn#ivkHQT^V?DlOz2Zx^%s8tn4C z_Ioh`ySDm#wC7)rDFnysFs+M<$Y^5PrK&X#5_}LDO`W4H=DBXVgM7BA9hH~$1y;02oLU;e(L)CWzigU>ltLy5swOr>C3BcsPzxU0Ys z_*Y4#4Ju$n04wsx~!4}-iBv^N>(GbnvlEK zt`J${e7I_9`SQM!#qGIO#FNW;2v@tDpM&sjhM=I$T)2=X?NRMPl_%2@q)F%04P*!l`zD%k@DnN$L8<(I$psV7=-{#hvxT zsWevUp8SI39CRI-J6OV$sr|zr${*jQzQ6ns!v~*1wcu;*dL9=iDRLmw$G*Fr-=TOF zk>L)PXzIep@VQvJ%*RbV(JjC`jq>H^ z&4At49PDLMzThXnOG6S^58{>QdSz8Vxhrbs^N1 zoK0NhSQH^??KTJaxh#C}+qFfqH1vx8Pj(*QFLI*n&2IUWZpPT$cAj06EYf8BqpfsT zNTSLp_+99sqpb@vdB+>?Pb zg>wlyjr#t2^(k-7I;`2Fv6%4)hx4v#^K$FlsB3=@E2w1eq=Ba)%;e{qqlw^1IwN*e zt`v+?q?sUwc;2B{+EWX1I9De|W-rWkB7#k52)_ycVcoVrmP_A5N@hs4*c&RpK#{yo zdDca)qc9*&QR*2)oy%5OAMA1gX@J}vt1$zyABsTBi&N>z@9-w`$#*W!QzPPM)8%B2 zR4__>Ouz%VhF+VrSYXZY&x(!EuUo?_Q5T{z_zT$=;(AQ>m3jWXVl0Q{ye9 zlM!ZC+gI896|K>$2Gtx}H$G3!8Tg`gu7_3k^ts&JX~jswDBD{?v^54z%C56wd*1Bc zG4Y7=2i7`7>9#gs>O8$iK=Of%}y z!xs=ge0CTSxN1Gb3T@?MUcJ3zdCR9M)`O;}a5pFi)zWre*jo;+O!=I+b>hS_C=CDC z{jGxj)0hhY@^bto4tb-icNkX)!j#s3k>Guv?58h=_2A^JpHojkfMVj!t}vm2DkN(!KD`gN5HiBab3B+A zhNdStke3Yls>Y=!P3_WGKo*&I`#}Nsk&LV{C2aL<$oqhBL>j1|Tjf4hg{mfv)q1dpAf^K z{E)RyhZjpF-I6Xz4)osS=4u+~m{8Xp-HO#X=&CTTvpgNFJ%1MH^|4V-qvp(eJl|E{9grTWJ`|R9rJQ`Gft94ICCPn&~ut-MY z^ph0h=3_I7qy(O4a$Dr<@SXA6S*DRZ%?|uabqM_sNpVraQ}_AH>fqDj@qrLo<&n}X ztZ!t%F0v5Qu@H$Z``}#2Q~sFhEnt1Wx?PvP5{ntHhz(~v++%=4ukU)x-z*S&mHG`% zl!$*WRy@()ZJ)3FEz!*wBV%szM6=FkC{E5yIRZ{uQ_61FDQuq8vLruw|!Px@5okw`tWTxbKhKpTxs25@6vc7|8e*pHWp7v zs&6YWs&aGie-g1N?my0;NNSQ`<2P{QsMrx=^yZK*F_>$O7AI2;%NTkVQEYlSFBiM! zv2el)yYo>TS-Q}P$l;xbNA&L`Ytox*uEbW^!;9h3%%?Fgt1*P(mC}z9Q^r|`$*6~Q z_#X*kLSRwNPzQ~`_W-HwSK0FYAvB-!SOzKNpJL>h8mhY|tXr!Ywv=s^luP4je0w_m zkY7K*s)d|qTGDRoo1+Hm_v_f9gc^XzgZaqC?8H8FvTq{tD<5J+$3aJ|2%tdV_i^=! z3VZSf>}!;(x1+;c#tCpa+_+4S;7?Zs^qgM@kr<|l6iJ5qqGDBBR_OTpB$USVv+Iec zU>Js6(w)rVuA^ky3+pBC9~=1!Ole?zaEQnu5jtRLMCCW1t=Pw44H8X2$cNp9AUXy1 zDs&!3w|ob;xu;gWO1Y2Zg=i}aYBxVQ!tYpW{UuwROt@M0Mm9+7S7OL*N%Dm*`;Jai@a zQZ91Qpc-)4&S_h7Wyc)9%4`@fwYGe@J}j?Z-&YP=6uf5@aBV#Z)tEUVl{y|_u7k$b zMRq?R7E-vs1{Axh$UjnPP(1~9VBrn&e={7Ym5w3ir_zew1LQsG_EH}e85w_`so1Dn zQ1(Wi{CTYuXS4u9hxS7@Sw(}j6dgf`6T!b$kmM}*>^)wr!A3Q9#P@;E^E@3|R0|`W z!$4q;RZKoWG`5E)Q!H)KpV_D73$XP0mzi=A_SuDFF!u-kzROnhyQO|hV152I2T7k8 zTf1fk8jhow!x1iY45X)O#uiF+W;)|z%e?QS!F3b1le;~uDYxs}0?hwR?9hcMTUG6H^vc-BXOcg7pW{L3CQoikFsfzm?EF(*b%`CB#7 zF+tJi2rJqWC~h zpylc-3hb5V#!)9Ldq@@qZCY32&fd3fxs^;7<*}iRl}nuU&P}>bFSXQFz8O>8XWz+@;!ko_Z$cG;CRE(z!jJk%Hj)vSe%k7O&U{^9bz4H zX-CCio)NinAt+M5tWWtOta$@#l^|49As*ANoR6>y`Y)gRIOPfP>Ron^_CJ4};}nsP zBPHm`(;E}~2&8u>O%+oy4g(QEl}`u1bs@Go*L%4&qMx8O-c`@inv3hT$5M`~=)_-I z^5(1+5IY5W`Hfnep*TchqsyGNG?8w1!6Yj{?(M4U-mhxYljP_X=RY;+%?uimDlBiE zSm)@4Ce=~CDBXF)T8UL2Pwqzk*78uk2FYyXBTYxt$jz54_1hU^<+Boay$?8q@`D>* zR92-dS4TV47q83j+T}V?#DnL8bwgc8o%Nm~T&~kWKuw7yb$B4Mo$(<$hBAP^zRGYu z4BN>=?PTe=w^kDlbr4NKxNbDvD?xc?Db&-ft2szPV6t2UpuSV8{0Tf5*>NM0pb<|* z84&j;dL~7EBnk$=@(bzcBRaDOqi~XnEuVW^LzXtIq|U?fdKui?*IDe5(M@fcpj$tZ zhc(RLru@^k&enrX{JhmUwq=k1!e%^AYVsTqGeMS)UuN|v|T7PRwN`T4Q!}f40k7grsKJw z-plXD4V}{aHe=kg854#=fv$PDcW+0d*n%)Yyx~Te zGiGuTkQ!6frO3^0lB#?~?=_)>STOTL$+-tGt5_zO_|{R1B&Va-9AKjSnBl)YSM_p* z90A4AwQdR%5FFKkVwpQ-KTHG#*rJil+;h0?qc(>4CTUa~JOe-i@*)Mp*bTH()5iP` zcnx8C{lkWZpkGhP3@b<8O(gw>f=0*=dCj@vqUfE;E3HQryui$(sR5)EB5PxP@Y?*E zpg#K z!sP-_m4aq~G&)#qLi+RZ&tfV;1d5{!o=FjV&D*GiA^Ezf$i5`OYXxY{#tVWb5d7Fb zNg5zCjNYuOo;B1!@Mxe$6K4+Smwl|hn&26p4>&nm=fX|BGr(%=4n!m{F}{$s=NIlQ*>QHxW$L`iDM z*Sez;W~;w00xH|1_1x+cBe~dE*nl#|n_wAn+UwcIYq=%}7$Pj-J?QE+=maJN$?3h_ z>IoAGdAWIjjiv-%W|&`QZlLslP_sM4_f6q1-_T-wpLdF~UXQXW_Jv+AV-ytJdN2x~ zRu6>gdDMdfaPe^Qn%3}e`6|LxDRBQxoWa2S+TnotE0+%Z+P95Z1|lM76a zy33H(oY&O$ECu6C)?jnU-gboH1O;}vHTV2rxHs?NXknJ%DNBM4q^Kz)C|1!OppCYo zxapy;9{wIPZi2}&f>`HNRiGTa3!GzfAx=hh)QTcVd@fEV%o?E=NHD$Em7$H)$ocXp zL5-3zAz7pNIxkBi@U%>WR-YTEC~Xp_izjHH9#v0o<1CzxH7!T>x!k~hWx#-afUZNS zY^Bag-?x@0(6OESbT!?2Ia0of%YZg>>YxxijttHZES>$L2;C-c&wfg+fT+qlUY zQOvR+Z8j)OPul5o6D!v~ZK*VI14>r=K&2swZB#dYD#B`%`oT!oduwX5eows*Qvqs} zkI844NNCd$;qqQ2W%haGWS^CJBBPFc4KxjF;(S8^Ndei&4GA`Ioh>RaFF!J2_FTFF zKW*2?OOm(CUnMy0hZ4HQ0mJg#E;E-+^n#T%fYrLUeDJI2(mox?YnRE zPzd(L?4BLfd%Zde@dbqxb%KYcxPEl;5QYU9NHKu+rqu*r;j;j-_NZyb;TgDF2Fai* z*5#qD{>=9sga4eIe|K~G`;S4j$~O?dVPpDBX=BWqLmH~wFXmz;*rU!n*1HRTiA^In z7ht^Ci*3g>vL_t^ZkRXoYaj_v`RY4n?i-%DcrUdYD=nVeC78C{uiJVzt;*kSmNdo^ z*}hH0dOx0uUxrB$=Qx&mx6NqO%%7G$9+_x|sOTPE?sGo>F26j&`bnu_%WY)*)jNq( zaNU1Fv-zFN72RMgU)wU%Xa_`XL_p#pq#D(m_o0{^vj3bA$cKq$0<5+0rBMB_Nn{5YD^0L zQB*YubMDHoY}iPMwR6f|Fb%i8lVBo!GlY^-z+uKJAr4z=m)dR&OIwId)jlw&N|dlC z`vR)92dGVO*3akhj6K#7Wi-1rj-n89X1_T8!VTEzy_2oXi$aV9uhnQoAkWdp%i4x} z^|AMb=SFx?k>Hv6EP^f&;=uP-&G+_Zp|N9r@WShWKf|XBl6bQQ+)jL$y?A@QQ1Au9 z__DO0=v<_(g9f-g?5+AYA&g8-O+7}n*4c;zJ)By=En+=1(AkT&_wD@biS9k$yRr~5!0@nISeB6w;ryRv@A)p$SJ`8+zi0+x6m`Js5}-*Se=`9<(TdU50Z z4dnj>^W4!N;SSWNXsVT>OPy{6V5IDA6elRZrlZ1fF=btCM}oYA`B1~Xv|Im_;peAA zXV_x<^Eh*cbhj6E9*>_6U5cTa7CrZDmwC2OOm^!2okrih{DNi0(S7zGRd~`uSfrzL zY2~py=pEykkETmSWtoWEtA^Od)dlPWy=w zcByG^Oi#>0xAgfl4VWO|XHbj;uDFS|F<)14tknCc07JqcA!1oUGZ+pSAt195&pwsb zX$sK4$#>xt$8MaTt%5^HyK_@Qb^|ajFNHzj@|Zd41k95L%+9dRTdX=-ihEpzyyv@! z0@Mxa+-v2WZ|;Xk#znXN4aaaMo76tr)P;ZeN$GB7w?8Yr_QKCI&Yg;mqFvkat}C0i z!^3vSP~3-Z@~H)fH*oGFO$B;QHfhS*!TXw(3F@Pk2fO{Q71=%{+1lgrFJFnWGBrM} z-*?O+=z)5UewS9H>R!bsH-&ai%KG@+NclQFmQ6mE9cgvmYEgR$Z==Pe5WfOLT9NIA z?y6%lbT7lzNsX1D4xLc|zT=|L7P!4_eyy1C%hO=v7Q>1IwEzi#~v2^UC%L|Pyxk{}tm zT}Cdy!3m4*bkFU&J9q6|K`>DU0S1M*1P^#8FSo!pT7{mgJH)SzNkrBUoJ8E~PCGY(8`px$ zX}Y(bm8t8m(Txh2@Jszte%2XTg97`kvjpqF;IJlMAy79;3*(JhrT3X-(VswcD@GD? z2sU7@e+3=uTzIJYTHS+(ex&O@&Lqn#_*^BFzKKR6YLDSLnNxBu<+CGU7}ZkO?neYF@Yn-Gy{v$5QwV z?6Vd9?w4Qzir9k`@qN-59QQsvfr-9PVK72_B>npN*N0o2J|Gwc@nmmpj{SmWKBK*l zjE{1Vr-N55fl!sd=t_G^Y|#RuU6#e##-r)2@;+P?P&nMtW$#EZcP_5T-N;t7Gh*%M z>SMcE#lE+qgB~yr#igw&kq!|w9y6dlIixTWhPe#toa#9kFH4i)l6;D0EZ?SEk^EH~A zSY~e!Z{k~eZ=_3ylE`S3l<|B`r0ejdw^Y=inxp5CI7xiSPu;8Dr)`?&X<&D>fKQv) z8JL76|NYJ5p6K!t)+$=U1N@y$DeNrajyTuzM2>%7&ZbXnT@+<>Bh_HW3cUdIfl7-q z>FnZ{Tlx}O|6i-n4EOYtupQfv>U#R#EN|Nc4O>TM>%SRI$8W_XkA7VB{kExvz>@f} znS)0e!i7wiReJH6qofuagjD?*%1bC@2)UZWCz1JE^sozul)*J&AHAC+Hvd|cxOnCz zBS`Y6<(}Dt7AEgME!vow&%X~`(IYw- zBE3|NHVu4-PmQR~P`D6CxSZavm1m6$_O_btV%g8;?Sqc2{bJlB60n0hd1n5u3txOc zA~K-*`HH(J&?s0lhbc`zLvD4V7GkZCXx9A6WN}S=cALr&n)r4w={WgFp~W<0b1xNmcqH=9T|L1*p_}? zL1?IMx)a6d${i@lh5Gwnn~J@Ar2ZyU_sz770#ATq>15~}4^yy06Q9Knj$_ah8bfxQ zy`*vk>%xoJ9;t6sP}gYH>h>xW(Y@EK;#hoPH)l4hS5kng4IjhI%jhd>*VhO^UDo)v z+r%8hQMl{RNZYcJv`K=HYH|T zcUS6SzPDpvLLq_q)LsS99rDExg(N%IO%jFJ=QXl7Z#c=r6tlytcNT1gEpSuy#gRnx z5$_ky@oIHUsxU#g&eKanZ{NDC>*1znq4?bn+Q0eJE}~-DwiGdV%1^_iY`Oa)o;p_h zoau|){gqF8_0-Ak3Fr_g-!jVFxoY%18LXkX_g!4`;kB7Q&U&0HdPI?b2E@DoZVI{E z;l9p-Es-u>c%l%sPw@bzojyJH5&s^6f9lQ@M6;rFn6VbM2pwuedjMv>nazZgl3>kdH{TNKr+I>h;vB)`^rEbvX^i+C2q7UB6qxU_?N7zhAGH2N(q9oOCcI4QnL^5EVL>ES2E1x ziWn2$BA*(B(>4;_6o3uV0Xw~iTOKNzi61l##{fkAkon1Wq`=z{B1Wb2jJgOQZdXOMp=R1fh!C9xS}jT|LQ{9;;Qpb(+B6_A`wCDJfS>?+9XGE>lp=m5?hM&9}2ylwBi zEmHTJzKTA*-fgF5j|b~G3J|XdlegOB3M|7X^=yFY@nd0nIo^ljBz$1HYx!5a=QzJ> zI!M>%Q5_pKfoH{t*PZ<{HkQQydyj+?@OTXP_vB9rvs@Z%qg2>SHTiStKa}-QH+*6% zLlPQCAi44Bn;`1=IIHdz0gZ#Zb7}aS&i?RtIKa$`!=e;&Ny$JS)_tDGi~aX+Pb74j zxN!ir^ll7SXDS0gU8P57)+HSjaNnzh3(^*|9f@-bV9ok>Uj^_)#qS_Oq zbsRxOG%!d>!AwE?1B9pkd0Sa}<^`e9dNJL6){iXHJC~~PJ{(rleK9DGTX@8Y+u1Bq z(^1Vt9Pj&uckNFfnY)!w^QH<@Vwa{4L=`N9kEZ(upnbHoWNx#ZCa7wT}!>CFsVUj20ys$`?G@L{Z7CW#xUS-V_pwq z3R~CCY+iS81O`SufszL27@xP^>2>`n_7OnaQBzWXftfo*E9?Hz(8k7{{_epWBNWZ< zm67EBO6Hf*5%mad2aKAe0toxy(bGA(rLNb?e*41Oahjw=6VEmL-jtethh8;n=XXlj z`zo;2Bc*ig>ChmZm@dtqs^m_sIfx6da#!%Dp$eZAnssJ0wue=iXVtyiqm|WX5jsEW zGN;Mz=c&lHYa88`;4gbu2uT^RJ_ju8 z*&z29LgcNm+F{PS6y>RI@)-zK)MR%LFo~ZAaz7hrMK!a!x}o7*Lt%Yso=MTI=4B?J z&t{l3G)rC@_T1X57@H2^LSaeAMKBBllEgH5Exz{lm5df*w7N2@N^<{2OzcfI2|Bh2 zsC?q?!1E5$Umw77l)!7?rZ$q_3@&#i+Up(K6D`qr`#sA4lpK`D{xxGmnT)_uOHr6Ki9aesz-{rp3)=cX ziTP;IO~bZG9B1K1Ny8S}no z#|1;gcq8D%2ou^Tp00nAHBUvk;@`g5&Honk1%b?w@kZ z4$b7p;Oie<$TfNDbjrw3*OI9|=D~!J8YJ&OTf@Sp$W~SFY{lnrGtho*5Fvw|3Z5dk zg!g$oxljn8=9(#kEsdRPAz#Q^h`V57g%@$*5p)pYg-0jYVw3IUk;Cf6nBwQ=SOvYn z&IIiStYl63YEB8#oi7OcC2f8eJD>-lrb|iZ^Yg1js)v!tSpka_K1Y{s$54MDa-$88 zBPT&%u=?@hl3%6zM4&`w#ngzC=ZlX(MEAaS1RZ<#v3>^8QK??YD7H#*4zNF()q^VD zImj<0-O_0URYWCw)NLBzNYv|Bpwu-(G?79+o#dU}rL-$HP{GaYuOT0s9Q%x>VmyfS zg-}gX<_rJ4Jbsox;Y9$&`X=+6bYOU7IElcbz`&;&pEInty3J)2i68Yc>@GxKmsud0 znEB@bzd|^jD1=#Kz8CC4uF$ml#Ol)ITSy9!9yt=HTf&pswgCG-eW&`Za~#U?%Cr^H zV|a?Xo8iR-o;2I+wNq$*auas6d&Iw-P`#tHI5fr+^A9@m2O-gJ`X|ubFGmgi4Kx!P z(DF9bt!L7gl?4aNJY`g);WPbsX-EDeiX7JfGbE!W{K9_6>+a7@oA3dG?j}-5Z;MTI zIq2kS6;~`KrgxAU<~;}z&`t;i9E#X;SgCN?1(Y+qU~uBrG#){!GthZGo|N`xd;T*0 zYo(}5<`J)#we~KzID1s{{BsD#!^I{3y~lRQ-Ky#2Np<|_K3}ulO*Aj0qT$ld%z>di z(x8v{{HaWur*Yn9y+2=xN|*JX*ADPd`TH}qxKxTz4|&>^!2W|v@^yA^Jr+qi~#GBS#7Z-K>8so8XVwTd$4E&8w^8tUh z4kwE+J-3H6v%=b8vC2?{ysM}mcX=%Jn@r-3fu;i;#mo?V;qaP|cR}wKX#pt-jEmkX zF*4(D9x+tj0UsSuf>3!~WOAJo@btlw-J*;)(Pqi$i&LDK+P3&0(U^|rm{IYrnf8)>ib!P=@ZEFD0*ZVh+~ z&CqkaB_|SqRQ$2)EA_=^Dm>JToVw7f@44)qx{xuT&~GW(=G$4Gc(84j*6|i|{n7?0 zq;#bL+;97}&J35+wCD5v%cD*6l~OZ_mIVGCZzo360Q`SZ7ck^*$M&b*o2bW+i~i@0 zNv}mD8wsYUN8;A|MxR+B{FW9}$@AKJl2WiX?VpU?T7Td6sSC&9lviF8Rd z$uzaO9HH55qjhuu-obD0@(7<4Cs_CSRQig>pMea5G2LV7aBzFpRHKlcDlagMh9fnP zb7V%2LMn^mnzJ@j7?P66TfQo%cZgVb(5s~_)&!?{AztYazX6a_2*?Hm6jlq(d(@$y z1`k(XIMRr;&{&uJz+&H#Lqo(Hw|Cjb(W@S}?-Ftokd*C4<_&qO2h>wA5%XsZ9={@$ z8fFV^cr~kdZBeW%QLj+BkZ65>YZ`y;gI;hgY6T!%-(4(M2oYS$x6wS~iHa}DgAzA3 zdHA{ zou{D1|F1#-_ol${YI`-vK0`9`4}4Dnc_0OitriPkUiPsZA-sSB6Q*u}VSTG-5q){6 zf~-6WLL9I7J_iZ+NsKrcDLbf}udakZ*a{U&4wP$9!g3&hTj#HplMyG+L-VEf#=wBP zL~+#nE<=tBIHrjByYp9B2~Rz#mcB}XE_Q!vrq-4t4jh$3HFqJ%QPw)YG;AI7Xy5L^Cqon|Cm^0pS6<5%3^jl~lS+iBhnsl2XtlJ%gb< zrF3?!+9u=+c@`lK;=7?;pbeg)xepq)r~sb?RT?f&+nY9KM_4tLT7pMyMMQd4V!?7Y z{jg8m=^6lA{v)na5eJKt)T6lx&{k+F0E|lgx6+IL+!@z5J&{#^1Jy(_B5((#`sO2f z(y(R{)2G7-smpqSg_O)5!U!d+s&pM|hR?MyXGvNT&@cipUj#Y0J{pPA|MFn5prbRB z+t@j7LdRp|gUhhuj}7E8vh^7L959(;z4?uRPq&v+gOf(l6Z>0qi~a!rI*+u9cG3ezyPz zJ)0{GpBQz&^Qv(~y*8bA2>sL22p!KBSL64c>alwLWX;CFI3NN`5 zRJTQS2B}5k0o)2tXSfnANeQA+i0KM=ZjD$o8(y3HM;CV+d}{`8L=)hU%JAp#XKf*Z z?&~M3Cbw+<=>miM!2aVR3}1}UhRD(A?(xHfvuJ{v3l^B^I8|l7?39g4qJcE0*oSz` zk_o0f30hsjY215%2uLTJp;}h2a%-j!u_8aUGcP=}EI-ccQsP%t9Xe5>@_D{r$5bo9 za^t?V@>S82$Dxcemj@>OX5Z1F(Ld82@1*Vm#gOd~coQeF58EjPCK}4g#wx z(_8==wkQ90sn#K@L*e{)!Cu3}Uf|gu3cp~|&H}o*s=qpH>p1BP`WX2iY}x}T?p#0c z2Ju+|K}_nmfFCI5fx|Q(XI$=Y^*kMop{t&3EZ=-QT~{j3()rIE6B%!EXy^9Q4d46N zE13*jL6gYceatw7jN7C6jN;)P(L)`?=SjZkeW*~j9d`~!5i!7sACE6v*G7Eh^TuMP z@cSs~KgV6@2vGp&htjsj^=M1mxH6?k`0srIMh6v>qB~w_CfOM)Wko5mH{46$$^)dT z)w!;Ia%gsj1`^;>6A}&a1SBIPm`qE1YD%C;&_?E#cCLqJb2P>wmX}~awY=Kp>YhftvEI&AH0BI~pFBh}n3w@W=t6fw+Iq+er& zO1fX*iKoHlL9cZoL1eQZmZV2&?anA1r-4DvEcepZEOfc+=&-`VBDFGK&0vM{G=Mr8 zvl}xFc=bNjQ~ClC6ImyfV>%)}wf5yh4B)WW_O#G3CjyT>XOY_JpPl$O_=rMF+Mg4C^ltjQ5lyk+I%3?Y z+@ zWeu$T52{%=D(JA2??ZdAdBcbpl~10m29Czm-%kcP8-FU`&-ixnOLl=4_j8O_gF7n< zZJnhm(&uk@qaRYkVSe&#!<%44(^Kt!0SQ3&aNeF+1Uq}rk5a{a%#|X8!3!e9Hzk^& zF*@oFfM(xWB4yy$Nn0T;m{HJzHlVyd#`{(dCp|ZtB z$eWj_yJXe{WgFi#Byx!+^b2q<p%FpX%k9YAhA~of(CtC(GxRBHXD8=pjqXT7PhrU&z+LbIiixS99vkDpCZgBLRWJ=ds2+-T`laSX_r&Fhe8IoC(+bs&AH&>>cC2-0} zehjH)@0&YU718|cF_AtZ@Nbm^5kCr^Dq~JV z==S$uV}&kEX~B*CLYghU0$IdW202sVcz;9;3X;$YgZmZCm@hW}a0b;QDeu;zY9PpV zwrGdKukr0jY|cJhv5hd#?bt7(kQ%)chC%ltg7DYwqv6hC3ovdZ+6U?zpSEECk1sbO z*N{+CLjZfYjI@)XVmNe-GZini5ft$ejmTa#`ejsco0(s{LqDK2t9OZ8+oK0qJ7V{mZg^-}6|E?6UH+?!x2pSJ)T(%!|dYs!bH$8}Mumskq%m%Rk zMUdW`==Z(`&&sbn}|j)YOn0dlv^4#&wWlDhR&O zD8U+>*4;AHI!jNaV5g{mgrRo(&1n!K$r?Q{fuD;-LR?4Uf{rBIxar9B1$ivhF@lCH zul`0A7?lGU9e8C8Xfc2TUkYnmIc&E@Wd zNnxcuAkshFcqT_Z9>MX&d4KsSZ|u7Q5+dU%G^1yDf^3GhAC|8AfW9#^!%ucG%lO%A zxakx_90?+Ci|q^>D5I9X@+X&Rp@9e#Y0jDtTI7Zj!d~?~c~<_>DW450X#8C}qQc?^ zP*`c0yTfW-puX!)h3CrjXc6#3jUhAVC+miWmhXMBr&v7TuezfAw79a7w_P}fTRs4% zxsFQ9yd_m_ot9xeiU{L-G{g)w>al^Dd5-3RpP7wCDIfv+MT;6k&pSJLV$U}By=k-P zH1gZ^Pmj);=M1jyf&B$1AkcZ%ua_j_?rd@6m69ajUmVcq`#)T*b1?5i0n7jpFJykI zVNUxqSnTL(l=)uY_rTT1wB^42;>8>({cTeQ4d^Iz;8+*}b_>D~Mzu?BT{Ype%YLf| zDp=yq^Spw|Kgo+=k=zF2q37uX!B(i%e>s`JkVvPOHjZ+L5vy6bQwa+4fy%E^kc#ONGGij1PF9#=jH?U9AR#sv)YTDn0P>FydzB$N`6ZibYGp-VtIhLCO$P{{!VhVJfB7`nT=;Tz9$ zp7(s~T8lqs!CJt+?|tp~g&Tg%QzzIHG?|7qSy{$;>AodbDO;tykWl;g9}DO9>OYN{ z>!SPGGaez~s`hiY9WUI!^lCe%I6K^v>5dKx=33+!<=|b7t;xE|shGwJ>$T)RDKs-( zt0z9hZm6|b5by))FxxlD&WFO_3y%8L>#%H&sND4 z=Ajk^_q9%m-*2nt7~St^FLJgLQBB{w!Be1V19O!P`d~^H2)=H{`#?5?hKE5;mq$e7=*({zuMq1s5rC|eVOT;l44#NEz8;{yu!)5did_i<87bkX zh2sHEc}FY~?U(a@A-$==MJ>gK)`G{Vq1hy!aw}u6*n;o@1JS81clN0k) zR-~M<)+I3}&FmRJOww`$P|mnNu2v(EhEWe;AT306TNPDdlSzzwvAr^7Q#oltXLb@W z@n~R6Z}WGaynKh5h#e^)gz@Tq6|kuh8sI~;y@5ed5FdzKNeQD6wPhm_I?AJ7Bd$f- zEhkAdEMmPiuAE^lFxa-(9P`rg78|6|!QNivIZ#$$X1qW?Yt&=7q`YAO%O7c57dr|W z3PL@lY(1ugllqO5DjQ$A84ER^mpNuJllfn#1YDmXXVQ{VK$2+*3rQdt>BMmjswG+q z59#3)Ge_DSmXMMfBVj&D#@9*4+ugE9eVU%%t~^hNg&JvBETcJ{HFEc6C+56|$Z|5U zkFxA){{GhgoL}UKg$6fH#i&M@iGT(nSM6tiUuMd%4A=%@`)s-b^?W8Fwh4RZet6xUpFZmU!{lM<(iq4;?{lkPaWo9W4(r)JiPy1A}d}*Y%mnL3$YG5V~uQ7jf zucc&Pn@at>p8yC3{k=;t#-OWlj8h0Wj?cwhOQ>Gotq{lT>Zke;iR*|X zZ~0@aUu@l;u=xHWP=vZ+Zxz1G_GmQ&bOK>nfB5g1NDa*&3FRBZ(qkRMpZN>VRDC?c zd#og2fMmApmpNuEAT_O24?S7W(98E+vGq)`_-`IL?x1>t=^t=E6(HV>1Q=y7zaW@xTsY^fJ56!C z8{9_1e8XnFkZwA_`|X^EABQIZMljO*bZ0vc&u{C@e(}Qo!IP6md`AtE-qx~=*glB0cJ6jJ8Fn_bNFnNGhx~5-&-cAzwN}VJme4yC^qa& z#AntI+$0s(pTAICwS=n0LKAPT_jcHznZ3`nT1TdLU+AxHKVjv@NXaU%u*Eke5;PdK zcMnyr?9c^qlX`!X8C}kfKFX}GX6Ss;2OPXdZ5=Tbw!#aU+nl#c4J9K4nahrgr8Ud$wEGTwK_1&nq{;Vkqx|F|; zY7DP8D<(tzp}SyVmv`wi9nChW`9fQyyoEGx=e{^vK?VdQl%AT4msNF+?8qj)Om6B( zrl^iJJE`Ol2Udj8@`>ZJv3v*y^gld%d{|Vxzm>!NV)#YTbud*rrxE+8;tIK# z`1e>1eJ=Ym@)JY80#wV*uJuKqcjhepqvwszj$j(uga+O-_D2MiY*;z<4uz->RpY6w zXjGIgh6Y#TNCK3=gqqQJY4SZQFCaH9g%pF;j4MdiEo0V5Vfn^a(;q5>y(SRL{I*-A z?#Zjo4}ryp)tugad}tJY0@H~!pnZb^vMLu zhExMs20vgl||)qr+UsTvM~^YaWDN>fQa;Elmt@L9LKjkM84z`eKRmA4cIaeX#=WRrd>r_X}sRoLg9w*d`)P zPM;Lz;^D6g^UdGg>bB&=s$>xoFXd)b>B=DHw+Eul$iAp4zAhJ|QM9O|fsCAxaUel& z=gj+I5@&haR{k4EWqJRjU^r5d&oiZU36<;U`VNVREWLl#Z8c@+#aTmmIHRAQu~r~i zM;_j|IoHG8^lwv&oC70fL@DB-JHV*grurz}&*nbqBEhtN^XiZ?WK+BV>$>FQIJ0ON zP)-SW{)^0=8?6ij4(EJ}`$}NhYH!*^VB}|ZG)oU7vUDXV^U`Ghg29k;Ec3g12RPo} zi&>e7#g=*UJv%5R()diES4AV7O_uf$$#!7m^4qhb?s?Aazck~Qbh=T)miv3JkEYoS z)9CZmbZ8Eq9j0PHQ8MV1vbVg>Ot*^7r`g`L8tA?y3yh&n*EO#3zS|5|@{XSf(rhBK zWA@Ij#G7#5g%IDo4iSMDzwONa<-eH;os(;_!r>Y&!n+W5Ry{mvH?&z9k1DcG$zaiU zNGljQ9WpPqo}SP_%K4skgrhHRShNr+C$~kd=x_B0ohpX~8Sb@Yz#D{oaYL8!J*rad zSJTkAPC+dj?WxVBJ*`k1NjvAUN1EEZ&r^@7nu&ca-W~=j%fTy~+uLmxw8Qz*|NNIT z;n-A2u$#xX?JS4qodw_SxeDKxdkh^v)EfF!FdzD@&b#9IAUcbtkZPUqzo4G&DdZjG zr_#6Z_;7hEwth8^;r{bHM&8R)JGkOx8Yi@$#ukJxa!&4Mc9)?gzg9 z;>qpWm75MXE9TG7VT*H-Bo(;B5n8mPk1#vKf7KMD-{f*4a z;dsOD$<4p6&cs9RnM=1#15+gTVS#D;beGR!PHm8@6|8=wGSivO&^#!&4tx&}eE{qYj&RDQwtp z3WSn{x;YwW+L>F*89>DJnjf(;;%B2fox1o(8|@laUFaE!0bSbc_EfI6tD3hbn`C^s zJ`V1ZX)k9xFaeEc3FkbyeT64fUu}CbBgD`0H%qPae0=EekcNJ7xKsO1&R=Mzj=uTP zsE~d3_-;QN7G=!H;Lu&ZpmWM7KXTp(dn+1t4lrB|f5{T+(wU6g#P;Cgq3hrs(Uq|J@7=TL@$4^*^ z@9M%c7S0$0!l(xJz_)j!k9XVljy@TZmN&_DO%|4k?MQf@}?ZU z&p!EDtYmz`V9a|zQ*l279({CGeQbZ>z8H8tD0IIbnUx(lZ(H8dv;Si&g{KJsS)qjt z@>(tA^xiEXaq^ak8Q8EC$Z3T4<@%iKhQILNKjrU1P7B*QqKhQt_J=6kypBnt28}9c z2NO==>1oasqNP)^BSGpo19)OK%Mqm~G42@_rqrz)82L3FQ!izYto~p}Z-{gQZf0CTX-Vz^|^#Ep1IDD1_#J?kHG5^SeEE|YTF8QeQEVk1YqBnPZ2;Yae=A7XrF z%w{SL%08KKvEQhKzB%=Huj4Xb$2=54=`t^J5($>opndgYl8mjuTCJ;kp03H%S%@ay z3902se>1$3%t;%g} z|8?z83U>)C`>;{JgEM4lTLKqbyjFQU=%^@FA6ubzKysM^wi;*LRS#80k+lrfXhmDg z!+C&U^YyT!J9*>Wfm?+Sj6J92RIJt28)?xl-n>Fw;Y8JVauuRUV{@M z_}`W?ltVojLI6bvURCdOk7Q}UrA!+xchtD~?t|&no5erFT8<8aoG8azZn?(SB>dNt zbS>O>Ix-u9AOkF*ph+fA*Wpyr*^3Z0I<1E-8wA{en>HgT(lu?d7a(cUVM)X=w!U=# ziGR=a^YPXDwuw!NHwV1EdN!Rd1@$rOW#2VLAz0r?l8%$sb>N~!q=vxGAj`WQ^u^=?_lsPxb3kS*qP3DQr-?simdXzxNa_#<(y~e(!lhu-r zPnIUfLr=?mxh>oFg1911cYnxfiSXE-S)b+OuuZ_admXkJ*0Nl`^KRhhd;iITZNA%p zsa#7^)hEnGZg~SH2#u=;WFP7&`%t$^FG&e}zIHdBGeTN_(N^O+M_R4AI z*UE#b&Z&hEg6t*;7B`+&+M^GCUD5gGH}r|({d|^|#n{$YhO1v; zv09(K);1=87mCaCF*+t9I1O{8M6^g8+>8p9#CpN5lT#!TjA-h>^#pbd#KQDT zh2`(~R|fe()O~-JScJEzin+)2sqVb3hvy7te(*qL49_zD zIyUnwCAyC7Csjf4+=0+6&%|D5PFl?yFv;W+*huM}l-{713eKi>EYm?}~i1m=Y}LxMMP zq-_*$L{i$my!(`wg{j){mW3fwVgko0GhXARdT^C!=iUuZ^u5Bd0yWvR0Iv;SBxBSx z5pX*ng1uPPt%H+o*H%)4e_U^McAWoMnRGsl8iE^kMj||${s_vE2@cpDMO){f7$y&$~p6_$vlyWect8tWKOEp-s(#cnCu`6%;GLlolm#@vfT zNfCRRCT9vroqGgD=f5cx`S$j;F^^=)CZL)BCj?9C15zAA)80`Gq{@DUV&o^xPF=Xv z95~u%+?7RvNi;9FO7Xbr*k^lppzJ!D*8MlE4(7DeDO8%*L!PJU(@v+taAm-EaV*y? zdKqYDZQ@3Uj6ng7+dqF#s+UmPUdtQlZF{B7$ z^>EPxFj+aCt0Y!4HJ;l*|o z(uLoB*l#G(g_cEZW2wLO#tpa`M&2hryVKmjiV+G)2ndn$S9CgmjRm8Jz zesmK^0u|)NJ=4#&bq8Hv6iD=vIrc}+Bgw9nQy0tM*Ua)~zEv2xZ`-)pJ&CkJJZFP( zUy&F)N0QcRB4j}2qrwL)-zy14d9p?^-ZMP5=uZRvFWp zJs^?4^Hvbbm(o|{&0hP0f}v%qAv%lUkC|Z5GY%B{EuH16A+Ij$vIhlOY{S=CPY}A; z2x?Pr|%X~S>Z6ZQ^+k1q~+?Oj4^qOnxO0EFev!K~$^DPNn}cYkuz zwX#;Wr_fvxl%HQnX1o&i6riEBYC>B%_lte1cam+qe;L%=)2&m1rGF~Ze7)9-F=K7% zjpI|~NM;hm>Jgt)d#V(!PXGNXtu>9>W($A7ow_5y0C2Yw_3$~1g;ee539UJ^?`{(d zQ%C3TB)J?!@(O(J%VxapKJ*#HAoV?Eo|)s8tXC)P69IDJ6{#E}DET(OOZrtLR<`+B z8X6_YS%%hdTj-q$dC3b#{CHPz=vm1B1*k*VDdN*QE^QJz+;oh^TFkXffiK(C5eJeM$5*XJi-5DquH#d3tS#&3U@?JBzmk*YC>jpQ-!#(oWYd< z{RyHRo(o;Gplv_%%-KHdPPq4MT9^{LuinMevR);=#lU%%Tl}(?H!;u-wl@P9YvyX% zsq}veKG;;Fmg#8jnapvMt7Vq(#e=)^J?71F!6T=sQE1-ITwSr8PE^y`E1&TM-!seU z5XNTNCSY}P<)HO=V-`waQXbp>RI@XWuSkgSg~PuQ7KG#6iY{Sg*mNrxG~f~EY(Q}K zY@=H!8sW??=gNY>@()H4YCOR>zHe7IB2}`vBrs=>C&C$YWEEUjn z7<#r0lCwv+(2JH}-@~V?HrA{cI(eR~NnszJoq#tzRo}}IGm6F*y$6zSveRga9z2n4 zV17r6%`fOJMvhXR(m6{R9Qtxvu_eJ&li5y=Z9!?t1H?K;XB^#KIbuwZuJYE&ThwVQ zSuHc_HRSYv3={Idgi3-3Q_;>8oAn!w+$jTV8EDhM_>3laUC ziM3{JB$(**SbV*E8=cWVAaxo}w^@tAzDqC{xo8Fot(La5799`6<@xEU6BvTv z>1*hqn&~R?VutKhX$&n(L($%N&aYAo3W2u!RV;{dj?xN%JaY1ovmPX#lId-uT;%K$ z4bv)dKm-%glC+1YQ+x!6<<_;*`5H7KUZwjp&ULHUvxZ7lxSx02o^clipX7_RA!$!D zj_IU+=I#s0x&r*>SW7k0l{3(@`C>}w+ZT-bNwKHZm1M+<^)g8Hl`NpM5RB^nfB)>h zw)DSMXL=X*#Xlb+B{(?pQ<-d6?(l+0K%CWtAdcFl@h?AoL0w`k8wggsUuhiEam~@g zU^O>GOx#bb=5769E1GxXuQ(cdd{r`TW}M&XQS=bxR;X z@j5R1&P4TLOEZ#JeTs39 znvU)1moScQx`2h^PxUK_2G9xDnqJ2O_Nl9cFxueBt2~=3431`U!uIqcA7E5<^H4<% z$`IVnU(;KwD*=*SN2D*fuo~YEK>yTXPQ!Z~vU}@xVrQJnH=PUw!-DGze#c>suO!%i zP-e~A62Irf=D*aL9JIc)XPQ2Fe3kfA&XGpgbQ4ciUw=wx-mNLPTyd1_AF%x2NBTGR z+AkdoT(f_R`jyc({M)B5D7a#^1G{@O?S3VZLR(&-Q089+%AiH#WK6=1UXE2r-~23F zdPa=}Yl;R_5)}Ct_3WrV_(I8oqw$qTH!}PLS&q3g6jgaQ5zh!9URL7Z+l`aw@4v}Z z`@RdUXo>F}%GoZIrWYry(s1LG>WJi66VueiqYGJir5F!59|(Qluhh|6;GCEP{~`_xKX-Fv#H#rI27i~!RWIlzA- z@CTHqvUaD@^cmDiB|ysD@#(KV0)ImTbpjQTH@IsQ+@nx#sIFk3pn+cU4nsE&iN9Aii-UPpg|7@~)9<7Kn?}nA@id^T z=rTC#;PKO;Y zP0iK}TeNdc z?PYKcCbvT~;wc8Z(Avtng1Jib?$GpWa-!aR8i@Eka5lFB%{bT!}8yme5(2A2gimyYB%gl73xjz-0 zWY5Csms~G$O=LgA*>In6`0H}aZ=}ZO6L2H_RAlSl##T}6Z(UMygHVK}$`D_%KcJbA~3+WYU%-yQAq@}iW z5at9HZ3%%L2`TQH_YcI^>u(Ui5nY7s?x#O!QJxepFip|lkCORuh8&vn=^7+^DMbtC zf0?X`lDK0o4~YqXX7?de#3i%Kb)cToy7!TKU58REn?TMc8p17XcalChk)6Uhun~m zNjjs7l;Z?c$7>1zR*5N3PabSdW=pC|WcRGbZm(Ou=Rm~N7yaik^WMagtE!{eumY5X z;Xr0}Vx^kw#lbk-;Kl9Zawlz?yE`Xk;}*U0|JM(5`#fGM^!}T+7!m^K%k&577Z`^c z2DH?nP3cT+Q)(8?A>Vq>4l_z-&_3qH%4SmVW8Jmb&@oB)3wu8h5MqbjS+i3Tg)nQi zSuuS@u9rvfU7)`y2Pv!OZlHshuClcq+-J`qP3LZo0}PK=-E#`WT{JSXrsz$dvq&gS2cm+5gEkEP}Zd$LRLTCNCr z8GxL4a%yEbd>hhpPK0aTgmRcg&<4B^?VTu>S#rb8p$N$y{b4}4H$h|@y~3W&Eh4zi zQ113BJd9DCyMu>xJTN?Sz}-ai^KZ^>yLsgd9K$^3sx9`#lkv;E=8Yl6SNA)i$!2gs7s{U}5VUyB8eP=3~y1J)4#5K%_C3 z3F&;%e!duw`*?iS|BJ` zEStn>#}D5QuQq)>8OUhShlYuWi&Ip@X`;b#-S{3JltN0*`cBSSYx0**n-8$;auZ## z92W?BPj(8_zXgxvOxejp&GoCk-e$5*10?2sh<=}wlLSn=>oCwPwnu_M#~x|7@sHLW zR$nlxqa0@ahuy4v?sT5p{09a3AN8<_A><6tFn!8z$QxO5EfI{gsrh_M>i)>y^q#(J z>*N_Fx2zY2}>qCnzuiThYR1pyI>!YMaXpwE)x|cJ=arhHS@$qq?XPh+F zC+OzQ==rBN^DlCga~u0N>c{>!lA*&vk)d`G?xyh; zew8iEY)U<%I$y8b%=L2H)%BqO>Fs!|>I$|y7P%kh>{0UD$B=9|jdd>hDH*7iPS0DS zR$A|;R))^_GYxMXS_$DnlIA02iYKO)cLKpwQFo$XWA>23$yxKc*vgfuo-4$1+?)a= z3F>aupTd0xQ)ABGYJ)I;xBfCBO?j#V)wH+eJ&Ka(rslY!?&we7_)bqqc8&K|Odd#7 zz+cRa_K9i^fm4Kl7Q%!S1%Ot8sPd|VHDJx$muOTERkYg^@YjU6jWh9UPsB_mZ)M~` z*U$L4bOs#H7%!S`RTv5^P+BPZ`dUkquV*Tqzc_SDeQR)tjLP2dV;SO@eo`IV`dWiC zuB?Wjm~?H(88N(BM3)oEC&9tWzEZ@wUs1xXMBFUox0 zO%XVnvUppYt$xPUg#`@0inOxFt+H{NDk$zxwp)5S^H`2Fn(k~dL+e`f@GAoETj0$` z;_3N%4)9HdOFljN;zYfQ3>K5c|AICCH&_hb%e^)K3Dz*S-7KI?|Dr{NMBifGfN;4{ zMMqduMc*2ldJ>`=pJXbVzsm;g_z}gcu@(=UCd$cX^pCb=tP+W6PAT_JMQq#KQv{PH zSDVc9b4M91e;gaD=LpZBHs7UaiTA;FCz$MI)(n!iwM7heHxzAr)aN9X=3!h6lCRw~ z$UWf@z1;d_u>Y0v?deD3b=feU>)+34GjYwmH;p+FKR$fPB#!Bq4c77kVH2KS&rRbkKyWWrbDZ?ONnY36o74BoE=qWjFHg-yUoR?up6sw( z<35O3A|y1fXVF=eJdq3l5}D6IOp8MeF0J|c zYELAX&?H%JPhD4bL|EcQNt|dUlb*QOm!dzZO22;Vy&20AaGaK+0wV@|EA?tRH*c;G zXn_vS1DxGhnD3TuR?q~4NEveX6!`+>6P5g&0BD}SmP}#=7VS^_#Wrg9zF#xztVCJI zFe}%dD^^u5kFNnD@sza%&AC?dx>Inx)6a6-x5uoc-Q(a@94_yuh*r(RpqMtg+9863 zK7&TEnb@0G2vmj7k6Z~QjhQ@wp~|a=sx3WB$R+{ZjcHzH=}gx( zgBlk=Q;`+NhGsH@&nRw|%Tsg?+B>?8Xw@5E`S}*R-IUYsE1LIE5~_rtfnZbJUHg&nm??_(v9w@W(ML^NTJ*G!uMuV;WGMpz3Wh@KYW~#%cuAu^ za+ki_ejLumLiw*8<`Ti+=Lf^)t|IXwvHwhqoop8Q)#!5qWV3=vn#BK zg>iZmWPKmZ*24AQA$S z>S#+V0N0>o=%kMz=^Xp3)ykfwh9yF3Y9c^ifs4(zUEX9oPyU!r{|qjja&g~j`l5R+ zM1MEx_9jgM#bB}bmERz6{A?(!2xdFSZU0zsz}MgQh7aHicbP-R3Xfdmd4+H_wg||D zLsA#F4C=i-)@aJK!rz*(!m_Xq{S8u~5XeIQ^bb<%RQDK$;?3$&PL5&8O4EW(Q#_+N z+UWfLY^vLOZU%s)|0spb)D!XxVcgWJ9-_c@zKvWd(yEKP_ujuLL$H)0phNF+F!+{* z&zobx-6{8l{;?6a><<9>wb0ZvA!7DZI;*i^qehyePfl`XySe1Yw!!QIk4mX@nBWX_ z2Ze#}4lAIYR zZP>D0FCs=ln&K;aslLn(p1na zG=nB*FS`Uv0ytSSSiZ{Np`wpg>i2ApyeWcx z$Xyk9*1!cFo+rvdmoOft<>5BQToH5N!o2P|@#5w>>%kS}<^8WPRbN|S0&-f^__6#f zb@M;1m{dQKT9cyMI~s>WlFZ6m*{2Rt>(1vneG8Cj%h$yrfa!EhtOnETL8OIFzm?F4 z4BL;%yry%8Z|MLV5GuDZ(tGTj)S!EoCzEYs32Cx&9Oq;obZ#DAtcRLn%lTI|ZDOz~ zMVD;C#<5vz%=+oCrQ|d!4BAlu5+LBGQkoVgwYQ%My^7GoGJ$NDYUU;^v=?p9@uGb{ zJP&`95Mij@ja>(NZ(s$6`OldHA0h=^uEx&7{|v0VNnFIOYKShyCUs;+QXN%s47}VL ze`5^ZyTey?#k3IvY#voM8bRr`<2x04>EY+`oX$RKC~*S4UnP3t3C)f>^b_ccS(0-B zR;DcGxH~H8D0>uqLlfaxIrvrtWU2t9Sh6k^a=(Pwg;~PO0~+;@@QqTd<+@(y0L!C7 z^=jETNpb}^8JkxfiBAe`*~O=06^3H*i=$|eCa+2MhPI}}Y~nbXo+Hdmo^!3NpLvXz zE4%4tt3rO7k5%CeKS`?`0OX)=R*!B^7XaS*E12uU?Swtzak?RtY{${f=w@r%imFnLIVon{RZ9EKC-8Hvwt)EX} z=sQE&u4Dnk{BMs(0 zu3{znt751^aPDMQ!$v7U6vzf04>sy4SzvwyN>&l(WUkir<%y*?9wIOCo+EuBrlb0& z{yqDJ{Qj6HI`xnL-H7y~e;d3tQcoqve`e||DCoFGg8Mqov2GvO8#kD*pomW{9PfRA zh_tNfS7)FIa;(j?7E_j@ya^$vEEb4BatzMCGsT$4a?(H=SUS*Z?~s=-s#hs6IQc&4 z$1vJ-o!u*Rq0UcsL)m!QwI8uHOgV2c&gKSufBUW>#!>2U#a8uWPdxtwyv?hwJo^@7 z1mqrL#pEtZI=gvB^9AgNXOT0uB$9iooUelo}0%*Gi zHlrCS^I6tRWIV5677`-)&bXh-cYzp~ayJ6BAy3&yM?-BvQi85q(ZZ(kIqhpRA@wej zliH7Rom1z8l6K6BfsiJ0MEY!PqVJfilccBG54**$hG1)PBPg#&CI3e^9AZ9SQ>b)1 zR?|u$H)#vD<{6A@43BbOQj~0PwJmn#X#pCZ;T;d{ucZ)iYZ_%#MQqj~>4J`O&Ff3D zeaC*5j8shU8L#qapQNH(*k)xEw%^_JSlWnOU2qRjxvKQ|d#U7(?T}jT>DTE0o6XB+ z{!O;wTnDND&A$!U2JU|hiwNZ{h-qM=k8uP2vbdp@=H8<1@A3g8I7k z1VuAS_&J2HGPlwH4!;7*fvkDA+$~aSe`(iV)aC~7pzF}|`s-X}*|2qXt z`eitO>^N(23Y+R1dSk1SDL2~gC!z@@^4Zt1#+{%*RsEBF*$Mh6+x7xScKEe%6QE?O zlLF{O#2oGb_r^qpW^kUVQqt~82cJP$KheO#CJ_p)@?8Zc-R%z4K$o$jSJ4NzWMPHu z8Z<$qr$d)Wg389SaY)r3diI?>`_g#$Rc9<7b+2%wplPBp{UlYmE>1R>A!W#i&=O{C zUIpI`43sA{LZvkAw#q!-QXr)uANI0%Wq6gJ#OBGr9bw7dnD7I=Q~b|?v~Y|gYoPU|vhU0@%A3p# zYP(#B@^ymoF>`H1QD4!n5+r(bizGnfy%Z6g2=9`A!P9^m>F+L-|KlfeyZG#}W_k_k z_6Zyo(+Q|B2u8+_|9`s`+4R5hQ{dW5o&0BRna1mMHGmwjXyu+-+R~B~>v6Y(@MTwd zSoi%SP_>V!KM=LKa1RM$PI&nBpI1jozH0b@dx(!mk3KAt#PI#(IrXJk_1BcDf`W6{*yLJ0+# z3BL0bg~WIn(An^=oXKxRzRHi3o(zL5raEukanZp60c3AJ$fGeh%zjE6Z<(uzh zv(w8@@<-`%0GO^v0G0J=vdJp@o|DZgf^gps4K{k(Pbz1Ty+VR%u3(WtA7x#W}ikH`xa?dhA&?cI;(yuOamU z!uIi}2#cz#{Wi@k!2gn;kos)Mo74GVr9Ku!^3R8LY$)tOBfov6EtoJru-Biw@l`b> z5<@rpQE}6gJNCpNO6^C`x=DO-QAmDIcuiXg5TG*C>cXTWt2Zc-N18F+9z_BhyV|*D zVYGYc;c!x5W}d7m$|4&9c&+HHc`B!1Gt`U{zj{^-Fpwvcqii?LwQ{A=J`8@bd*o7C!f}MY?)F|mQ+_TPe4wz z!@)q)^Dm^;{8N<_b}o5|$I#2y%LDI)#QgGUNF5-T_85)-xIwQ9_{s-al@Q~Btagnu8J~#?c%YTReIuLCvW0lnT z!L91&B3gYlon>4xFYiTkV(~((lol~RJUaV+sVj)m@R&>GwA5=@CZ6kMa~Ghu1or_m z-qBke;rP?$Ib`H0!v|Iofk7-W2W{wqO`K+d*Tng>_SbZ^@E{z5PwoY9`CUa%?S_m1 zQ;&Jwh&!7h<;1cVs8AN%dNx{%!W;qO8UJZIkSeaDSqv5R-4$Dnw6D1e% z-Y*SOt6px#gu@{Fhl9EDS!6L!4rU z$+7w`>tru1?%m+2gm8+f$lewx-M}EfL|j5fuy|)a;jBVL&e$i=*At4Eq0wJ0ow|3K z6HFxTJzJDA0Gv@^ef%7&PmknBUTY2W-Z%J|L;S;QOoF_jjx9T?tESe?w2_XPa51KG zmeZQj8&5V$*u*zN2wcp}X&HT}I8O`*r|Nk9t;(9C+g9%atBix)Z<_LmP?d|H^&m08 zHG<{rSzdQ7*=X(jm4eb;zy3!1{^i=hixnaF@vZfSA&fbczFpbZ`F4XZRh7r5tHyOrh^2h1Z3aampiJ(?5Te&M1=|%rBzVj1XNFrPSCrKPJ>YL%fi< z+4NJ4U6;q@XHFCnwH+BkA-v>ao4?YPH*k4Eoq618HD5e5-KD$#9HQ#&Zz^zxXc>~x zx%-7Q>aunh))ves5rfgDQC6(dQeLiG{}OQ4XB(YzUd{5il+1Zxl!SJVmQ`qYn86Wx zAnX9M)E-g_9s3Z;Oqeknhixz3eCoa3sCTvjG+=l3?wtrR;Q9%>=#hcQ@O#0-r{E4% zs*OP6*3!cdFStg%A9dd13ou_ls_FWFyxl3V%2^cmJ+n|caJDk}?^*K6dK$nbw1@rA zxeKve^2*9S4O{viA&P}rNF@7WgC(0r%Sy`m?Sr}#G2cx*n>#$3)S~aM)$1NwPxAk$ z`VxPryZ7&;C~JiDXiBeiB^A^??wRE;Oza+-x%I-& zsnx|S@wX;3hAtmh)VX$En#7Cs92Qhr&tIH}`V5WMUqOF*73^~L6yB)kY?;0il(XqT zrFX9Ckf5I`|6wS-&ZfL*3wI@`Fr7?oU5_OIHC;dwqGM%A9MPU+Q)TK)N#?RqsEExv zj+Eci`O8a32eYhAznQMSFTQ$n+KExz9TlYxP0!=dX%yjMj|iJ*@}kVS3nvrwg*5xV z`b#wT)J`~ToLs-JscP8nCyL1u?5DB|f5(g^E8?UB6Yo@f-RSQHK-s5Ty4=0Hjfp;s z%2Dw`ovC;6V^3L8bfKn;0xDz9c#RRV8$Z6+m`Q8PKV3b-b3lFUwHD@NhkKN$Vg!{$ z(Omg`h5Zt4sD*E&j{gj!w$$v{f>ar`U-rfDB=@B?Pn>S}u|l)Hjr#Z}<^L?|5nk^E zesrt=srk3Cp}4Qv3p>K_?ra`!F(b7W_G@=y#jDugb@b5biZ|F(dyk@l`g3{U`GUuxgyPSvJ`vKe9Rh_I&Br8rwaTg7A5iI(@xYj#I?LH%VFV zh#BwbS!B4-9@u;|FisZgx=4X@FQ6Bs0-so8O8g&`|35|$q zDWJqgPG)&>=tOUO3*^-|&_e$rAv5|Xr*`|t-)&p!8~k-+I75Z{gP!Rx-Dzv~f>5QS ztnmo3L+!VV2T!cx*X;Gly2&Iv9%`@R@t1s=9!Ga2FSWW8N^I76bwa9ahjjuR#^_a@VIL|1zU1#>G zSrS(~9vn}0oL5T|a5EZHN^Q>2b~ya*ue}1c+*Y_SLDPypUl+ak zxzsw!+tU0PG%p^{#hRQT+G5d#WS7zE1S>g794zWUu8rR7W*re`$EA5ROP~wPIaLOPmIotxRVsvpP9?P2&z4 z-?^Ie%Rd5c4+5l)lgC=|ZE}RDL2LM)WBA5ZW&=Zan>sa|TK$|C7WW7>N(**eHXraD z*o1I~n-8mj^8&lq-Sf5aa=_K7#XJ$|nLuady_Cs-dY)`%+CcX@+p%HHev6ged~eo}BpT zf%urmssmqCDpW)M0-ZflfR+2GLo<`a=@=^z`GCmU{BDkLg&P12$^{N2aJAwuA07>F z4EGtShAmUh_ ze0T`(0D{q%FXP^fPl5+~nSFEKwMsmZPus{hkKO8t_ID(_N6Y2;7wGjDr{?m5Li&tR z$BdY77Yu90&DvI@UVYMjjGwrOX>Wa2-0fS$Pxn}bD}y&QrzdOb9vJ5pYOyCct!rx0 zWzkz32d56?dn@aNVkE`fRN>F~P{siD+0uMO1insn>xP@fCX=rableN+Cbn9nS-v^g zGJq=BxRW+{aSz>wu@7>*F{sk8670Ms99ma%20RMn-omebp2?}u-*^54k|h2GNo@#0 zYG}m&);o+vlxSkFLgv*-sg{5K`yD$9S^gLanlsNnQ>N8{mnket=L&Cm?p&J8hs@F) z1L+MGr;U1s*N6Ok5R>txC>(B|;`h78j`2JjbFos#=JX*=!xafuAhZtLr@ii>YSuT{ z?R0*)qQojAwE=85yd#=i={!ao5a*fMS8paZzot6=g{$G;f6xBMeCf~`4qF@=(X)eI z=XQBG=)Hf35j}GzD(rsJ@_X2k?9aHRA=>cKt2*M5nk&7^(5D%#eNbh2 z)snmbq!zS%o=1T}INq~~5Yr%VYcJfvRlv3Y1rK#;RU$ittakNR$*;9~EWEcaCRJhG zG77bVqx$bmuUbcDt=Lpgxx?C>f734$tPea53O1|pr*#({DHAj1Rk+aiIC4q(o^0M; zWShM|puXO`kn)z*zxyt~1@rwD24K4&9d`Bd>ge* z7fiX(J#I2D3Y<&1-G;4lAKY`O6V<^n$!+k>UV=nxIT3)>i6qJ5oAW;!^+W)aj zd-!fKdG&M!^-w$UxhU5+&y0K{VW!IXsV%?X%Ab~*jwN^|=*DfsG07arM(cBOQA$oP z9(LTi?z8Z^VWP$N!HxXLmj?4T5Uytp^ZP2g*2jEp05yuMx1#1 z+c60y_ZHr|@}sO&*n&<@T~tutzai~UN~+f64y|3eJ6A|dfAFkMy(aMl`7_$1Gw&e6 znM<24Fv#txGf*|2(3bHn6^2e{>G=too9CZ8ymTKKL}qx+?$lYb1z~$cXXG=pII#IQ z3P2x+M!XGK39-EmV6(GMy~e1#zRi!yt4}vmj|bcw(}8RZLz|;6KtZtSV6~^a!axKb>|UYOtfXLxI-Hb1Kt~+T2f2`w32g+SZ#=y+M5@ z(hc3|ZdZ8@4{yAUC8W@*RHJ)} z2Fp}#efrw}U}Ttr61BlRo=(U7)3zVG&kk}M!l3!6`x=&Fg5?xJb26LF*%#{PmAHQ+ zQa1zv6Xdy|RGhnQ#oZW_%L06ls%8Fqa7UJb9hB`u7vI!me=u{)guiQLO>Ht1Y9 zsxr4MxmS%XnJ7Igk`;Qce7W+-{){;x^yVYX^b^sR*Vl?hJ5y>RzBCL->-4-Ruri#h z!b)v7K2wn;U&~yv;R`VL2V1_+9?|nSuqs7^K7mdKBh?#PCfET!g*jU$DjIifbO(Mm zJZ(I^cicd9oWf`%Y_Ro`gxDdgT;@YCN)(%klRqU5Mb# znGJrUo#T@INgehts+>(V?Z=e$rGB9D=l?2i{9w#U(r>^0=l`7af>`+&UR|~#UVS#% zBaqoM>d>-gP6o^P1A#f&49jy~ji)%1(dyEo9~FjsNOz$%KER#ZZ~J;Z8MUrG0D}DC z$KRv*slO*E9-DsQPj2Nn--;rIv96bh7(8)>ne0FJcZ@=r9(tiVlO0P=2PFh+scyau1U6zbuTS!LkbZXKHNi%#BKo5KR)x7oWmv8i&5;55-j5j z4vbvM*RLBd3(YO?RTSbPT{3UK@fdLQ43b1;3EF|ST*SfTvwz+mp?6&qGr=#lA+yg{ z4Lu*~UEdtEj6>DEmdl^{1D?2tn7zS2pKguzlip~Pr#~68igZ0cVq+ETliaIRZtCf| zuND}j&5HbcZ!(`I6xjyJkZV}#nN}@c(v9%AxxH|}hecPsqN$Yah$^1=X8o~nlEOb~ z74VP50bTEG)75PHPvLd#SWu!spLD~sna+2!mMm#On^qD|)w~d+-v-&0*&NrUjIRC7 zG*Mdnn4=yiey!T_B`S(d=-s8l(?S+JaSx4t4&WO}M$8W!k2qHjRkjGpu%6U!5361l z=LER2o~VlEzT&odT&5qY0Nm8nlaKw@n#{f0hg9N<-ok8cU&LBs$dzHej}%gZq`fDb z)p4rQy_DEfS^)w~VDD0z?tbskX4!+xJE<|xALuzjsr-_=b}D4pm6nd95rC)K8go)J zb-^&3%UmizQq=6z5JeuSNbYEN(WkhIn5g0Uk>ee=xXnj&8)-`t5jQWon@=CH@>l^T zJ}>Y`FrPaA);p}@ME=LFS|XXH)sD?%R+d!*Mj{?JV%m6lV@?q_Ls*l z8OBe{q~OJ|XTvOJjx3k~u9&&G(J z=g_J~G_*AxtgD}WnSCzhic!XWxtA3~zSp13GPOi~80>izb0r>BgiWYN{2;S=?)GW~63{LuAm^@)1! zzs!>;)SBR*Zi?cN>L2L}3!QAvuC2S}zqBjw=J8X%Nr-nbie>5!m=26mQ-1nPQ6nUg1?*~Llcn4Q zoU7X5vw--%>VFg#-y9fiY`*P5Stt@554Nx$q%7hzW|B~HQ)~P1K z&(L&QU)Bl-+yjbmo3RiMI_PEH!6J?;jXF{0FuFj*v4lmI5JQgb(|+wT;FtMaNN4RE zSkZnjtU|wcT1P*pa_t|9Y}Rn#tM4E@Db%&M{{N{hRQK;+JImV$tAHQ+DUv|oJ!bE# zWw5_@g0h0Cb5=v?FXQCT0>*jWC`cidRk1LJ)(wMOf5}5zHhV7@j4hG%&72d#Zl}>A z0L;u8@f^j&3VA1*tTs(uQ(rO<_tnd4Q`pXNGhyRev=#Ym&#-AY4~QKNkLq3 zXO-lP82DYW(*2|4wr=S5hb(QBt$2=l->93jim}^LX9;s?4J=e}a_Ja*5Pr$W!*e}j zGC*S>`tG&UkvmjcP~kRuXoz?bb&$_BdIve;vNLkEE@U6>J$O{gnzjISj%BV*X2ta> z;gONu)jhAWqmjReC?5au{+{W?r5F)>KN%5?(Z4UOvbOJw7n?y zT2>F)t7ZcrURU@c0PL#WOLwLwT8P^2p0;l%%S$d)0YCW+kz%jEk91T~x3y7p!)Zu< z<4#AFU~G!gcXxMxK%$ZNQYfDCE(JQ(w-nR)gU-T{!2qG1Uou1XACE-C2$ho3(nqHy z?dXd$z%~rMLPI~t`0P|=p;@MSi-dg9tzP7sWZ+JkGqWH;oEcn$t%^MGeqvgZTkz-O z(2Ma3a6O_hmDv|wV#Xmc7b#|=_m0Qjjz5=A+TC29rV(l)?ssNkQ;Tq$-(k;W>816K zu}*}h>Lhvqz@!8Q_gngeW|CpHdRtMvu5fc5(lgx3j)xioX9}@|=Sb z_3JOp(?OX^-rMp+Xa6=UyQ>VUnakF_{{D3<`SJ_I6*N-dClyb@OkB z?2gw*WR;KunZU8Fa~3k}h*t8PM?vKdrp9m+;IxpKJ!Bq@jtY#EsWuAi$+pEmFOcd4 z&6Ul)eq;NvC4MhDZT+MxV;vF#X}37bx3T?kNB8;_B?T`-s&)c>{KhrQ5ox67>0(#E zWV-FTYZt4RL+e%qfvWlBQJ}NMWIY2S8-6EhVB}O^pIVviABh?ySIG~je3fF&=BZni zLT)GueMmmLJ|CSfsbtiKWzFfOD$k>zv<(m02;l7G)OB#yQyC?y(}$C{nYjnF6bo@R zb5dODs3UKSsb#vV^|sEOt%NQH9C)5PT`nC%xzd8=ee`u0HVOTdoZ~d_i;j50oW!ZR zud@L2R+a9-j`J+i&QKkWfZ9({YSPQwb|Y_wukkcn#ejd*Q7d0C9uQoTQ8cB?5rh4A ziH$n!=06Fzs5((q8j>fX?ltm{PkUvNE?ITr+3hU1S=i1U&P6Nm3hd`TAYH3pF6V^u zZhGn+eiMkc*9hHx{>#Pr{ts#+ASmwi-A@B5m4_~hJ-CjVc& zX8|>*O%%142GeAgJI3@3nAtw@S!NQr6%M(Z?-h#Y$?fpgA^kk3gFA}_l8cVy&4>Iv z+36zFRWORNG*lIu;Ewv-;pdZeKkp1sph|lc4-2z$VYwC8_Z?GB>R|Wf5N#q2z1WxW zB$(^k0Y$==(}6685>SI;4ViSz1J=^7CVii`NRlPFi!SCamN0j7*0vsf3noz^z*&W- zMcfsbiXl9=KJP(cino-z)zKs&!_0qQQtsqplLmAO( zP_uVN1g$O?23&NS&$5NP;OESQ&Z=g{9aFfC_fK9%+{uA-B>Jl3geW zCRJz(`d6IpnOe({Odj9_nX9Hu8;IGIVy*5H5vl#^usxubQ%3y5^sXjOhf>P(RoM$n zk2g(c_8T_O4lIm0IM{J(w3Ug`KB`fkAzm}mDO!cd$9sX4??U;$L_nVR+p2U-l<{x4 z$`(q|>yFj0cZUcbWHoUA9_1}-A9GoHZJ|&BA(7m4q9`=f3d>r z%!uEKSA2`u^Wtq=5hWK4L|~s}hI#ea#9iO_-{p?>pY7pwKQbZz1-fQ#1v>0FmLK41 zC3)IYY#s{JH-u~oD@=2Rr?z6btfLm5aL^ZlJD<9zXa>5kgFFUfTAiL0CoA(G^3HlO zKk+ccH1NP7ov|(V%i$AOWe0iNb4whnQy)yuaKNPh-YL1LEA!QgtVx(x8si`<1nBy6 zCO<^T(cJ(5HRhc%MO99980Lo__7`g0q^|IW%;qdezY^}7bF9$)WdaG$~hXy-}g zo=LY=wIDFhjIL!Z{uOO!zukT=?HJMK9*3g5PG!8e$5_p{AH-q-f&`Wl-AA=fA*SWD zm5eJe=?S9E7$T{6T`)8ZvWgT1|4nuh(@aUwbWKc z_a-WPU5c)rlx_Hq6N<5 z->_F~vdunt_-;#fU+i5SX^Vh%??9~0K?^T;O*nd>tSH6np)`8bzhAs&S7nrU$3rL~HnFtD7PZp3Fcu~z5 zok;=P1^rYCRTg2?SXN+JMDJZ$bg#G0a|xVF=|g3@2SqrSN^BGf62{G~*fO|^b9Ue9 zzk>6?oBV<2M`xdOM)gBGxuPflL)m&JIZTEF(L3m=x$t~>MV};B3^3o6f@QMfKLm}I zZ9Z4sU)MjGWsY)w?uFXibiLarG?|n$iPtG~o3_==Tk88vT1?daTD_dl6Lf&}oWCy$ z|Kf-YT%^@s4*lCVU+c#yUfo&Qbd6~C!fgI zEQ~X8IC*D2bhIMwO%nWP(YD>hqQNIE54<=26#@SKf94F|UD?twHqH|*{aa@(*(8+? ziZ?!IvQ?{oAFc0H%S)Nf$`j9(3)&*1H$Q#+#A?EKe~U3ABLpm8=Y6fLyOzhQ@iP9? z@FxAL@foj{MVE^l$OoWg!L_yuGf|V<9VYQLUTsUCr#Iuusb&u*_g7{Q_--eBn0y|U z-0Cu$Tcg9Z+kYYV=fj}`$0B%6EQ~_g3Gg9QS(D4p4+RiY8K;aeDors`V>TK=XI(n+ zhj{@lrXx>~mqFN1c^6TQLyKX@y5(`C49CFgHot@&+igCobeZR0vz`r^MhM-;2BSsg zV%9Dl{-e1t9N$Uq!dFAQ0Kgu3tMBd(_AG*;!5u}P1d|hwLGESYpmda7C>n93dCyYrmwuZtbnBh~%^mE;b8z3cSr5Va%ZL1)jnu zd~uSkvYiTwe8i5TD+dfBFKvTnNu!H=np~Pu@js7$oU>osl1?1AG5m%H@A zl8c!7YMlk;n~t1a3K@BB8xHkr*57B?l4&q|TpZM-3;f}80p)Ik3ip5`G9E2guBQbM z{i2t_ivFhGL#({}Q=!RryiXTP-2@Z|nRe@oKI20M?6__8C#pw=1$t_GXq#wO1LXHe z{Hapsk4e09;b1nOq&7t}K8`(o?^))c9QwN_JR*#_^irE+y%ltCa`|rRuN?KNANk%$ z!xh+KYVf8IFi=?h=eN3j!=0XpG^yWeR_wJm;61 z)bn3hI2CJmPHD7y<`=A9Rpx9Q=UEpNk?z9&tRePE33*j}O(+fry$j~c>oGcc5EYz|JHuEuaF*8TRrZT5Mw#e3ObFJ%voL> z|C1+ZpH>)R(wN!$eS2;7J7Q`w!s&WOFSpa*tkA-@*){)ehv+sAntjuMwfh1NtxB*D zJe={=i>=_C%yWZCd&keakv&xFp|>NYZ!Xw&vIOaeHukM;ASl!cBl8CVw%-R;ic=bgt1kwu7{>^5hwC%Iam3-1km zZ_bGLd~?(IwS&u2`DR3H|3#oVvfIW?2rF{*vA@NWY<95bB(DK2QTXnCnlZcl&97Hx z&}5>*ZTRJIz4<5ACi!&RKoP@q@0Q9jh1A(7dLkDx|KJtYMsoY@US(Or$w>bzW4kN` z4Yp%+Hlju}0Zu4q3Zzx51I;NStb0#Y>2Tz^y52ln1rfh=*gN#ImFYQ27SLmP9f_NR zI&WGb1%&(1)4H5*41~lDb;n48ZM$UzrI!+Am&)#69y+@!08<;Q4N~z9w7}M??6(lh zJS}er*^m>Q9tSO>+OEeV<>t?NV+MXbcOrL7!7a|B2=rtrUTv=oU-QV^lKv~U&>RN= zCJdj!pSU*aK&*Fp(Qf4F-fOAXEP}RU^CrBM@O`jp7|-^=!q14=FzCz*q}uuJ2qHX3 z*l5rrs&SpASo`JvMY^&MDXuvOXyXvnC5eDWr`iPJbA=->cS)|Fie4lPhxI}#Y9fG& zwf-|G{&@CG7xyg*x9x4aevR(QjV#wUT<{HMpAQ}gpx4k*sm}c2zR}PBMf}uqyxuYK z_?NaH;-6kIlgANsrS7(7!ib&NJAM8v`M9SB^0g^9&b}<2Nhrb@z7zn zX8qNbEw<+TH080kk#?L-G@0SE>m>y4$*pmF&beE1Y`p@lX%i}0D%CpHqobEGZ5ak2 z=oSG1>%l(L-S!0kc@yq?PO*T;qbUQZFF6-r0aotU3Mo@@4GAocwiMTf(A>VIW2`kM z`#_OcxOG^s?;>7mkayhkhN)q({pl$(dWL*F|1EDYfhXu>*UavQVNgs<@OsLdEED=@ zesoCl6NjC>hllg@re7uvXG6)KW-{{Pbi8mHN$! zPQ0$ec&7A1m*UZ%I4raN&M_#cKs`{|NMu|KK?1sH1&YQ*Zp@@qad=FC9gmYomppItDxS6KKK66 zI;QgRE?z+p5Pa5y;&pjAATUF#iPru5>RX2ceO^)8z_Ia{+ZesVmE9JL-mO&SKq9Xg zo>j#-EZc;JR1erJCYH?( zW1$)>!8)%)QKff^%Kuzr`a*Ec!1wWP;^>|@^rm4mzNag+TK%IovBPpFE49YHz`i+9 z#ps{{noX>OxG zYtLX8F4TMWx%I?W108x3k- zQa}c$jzx9%3*+;_s+)5?8oERc>$w-~TOyEj25fR{F^Pj(*;U?R2NXS^v>Pax*@h9% zviejck-cMQm;2yhxht*LYl(O3HiRM*pTKHqL;w}|jAeRS8-5(F2|w8N9g@_Ioctej zNgMeyDLe3Qf6-*#cbk0x-@8|sVFWa;Z{@aLn;~k~>gy<{NL)5wq zteZ~v67RweVZ;9ZPFiXCW0ltlzV8V-yAYsH&|_xwD@+#5JX`PE^~A!1`iMu1TbD!) zsKL*^APgnKT&(GdSl31b|AbvWLK5Qz-ZkiX1&ey{>hR<}_|ieIhW`HD;K1eR6{mMO z@CyCn@k>HJhNsFHejI}Vunxmv?zvv&nV9Qk1?k!UJkTh5rZ1EZVN zC0TN$9>PYrMMNWzx{SmOX=_|XvTT!*S`0TL!}tZu-^<8{z*n`1_*6tos*mNk7xB8h zpA8_6k;UxQ;;iW2-ab-wrtj#XOdmRO;{bP*r}n$vq3>HkhR_?UL@MalaK5QLEdTG$ zH+ax_o*df2S4ij)_Z8&xy#VupWQzd_U9XZF588X!AO0$wb&=WL!>-eVw@yr5St`;q zBt>rXvv+rFl0TI>f8`tywtbuZu-8*7oGE zQSb~q`s4)RySEtGmp*Uq-5cHD2@=&t?R%z zc0UtVjU80eg53ldHotBjZAKyXTBM$%zXVoqc8!=JBsq2#uQrtFD;fm8MK5e!)bIZC zoJr)<@00f6xb+oi>2iuMx6Gu9&?ynpnvwA_^$GJR*kvcNaHm^vez8D8YF^{S_nZ(;xGD=CbEm19gIJ#ZPH2B`8ijeU zO5x_VUFUVfvHYulm`C=oOdE{fp{T&7wi}K;c3w8u1(F(YR~jRQ0$a=@;`S0SmMP$uvbSs@Q6c=t-gH! z@Ft&r_W1(r72|q+MHZ?)%@||^$R+bn427_#;ufe=-R6`_8Mskn{{%ZWf6&dQ5ltgMaOkULUE?Br(3{AozpE{%59)-Cyi{<>-LOwTOga2?yaH3}EEOaqby4x{y zDd6Lt$-c#HbG(_lL#UM{gN;bVAEO~O0<8v+ZBHITs=mdCJdFk!1$;xku~WPB;<8EzM5oLMrTr;`O7t1T z=vW2upYu&SPOiVxKKst!I0+Vbv0y~h8x3aZGH-Kz8r6JED(%fVi1^OZI`?8RS4x`o zR*^%`kPW?PDkDdD@+LWMV?H~%FwKLrAb!NyyV?l;MUY!M>a)th(Lv{}(3+2V^iaPt z{ql9R-h&s>thK+s3-S-EUj?a>o@?oIjQ&aUWquAM57UMDn_k*F( zn?HNWXY7VQ>$P+)?KeM#axmTYQj^uzKr05M6?D0Gttg-iu%sQ0hO!5|;bw{#=v(3@ z6zWo3iMPF_z(b)b*hr}H=w%pc*L#JLX&LkmeKsz%OvI~3WC zb?I)%P>0ypMxOS-K!6iFxgVmY`IM+f&bLVqDU*srD?eKY;pb6` zhk}A#C47Q=&sl^rg)H7U?9aTGDl{WM)M+Rj{e_vzzt6JY_)p9DBTgQMZX(vae$M=Z zFTN^MyZOP^&-^xY4oZ=MtSu2c<5StU3PaI6k5Y1Y4O4E?UfvmT5zCG<83(z72`MD) zw`r36kvB@O#m7^JD_5Nx(`Xr=*=rV2KP=qawA<1?KtAN;i`lQ8(Ot+ZmWRSF{7h+z z3687$a`ZzBqKr^SuKo~R*GRNaAT-JUbp~`+0lc~T_e07H$FZ>;OC^@Ly0hYir^DVS z4w^x@EL;`>s6}Sp{(Ivg-8M!0gNC=_uwZA|N7Nu^i4nHm{sij|ufa?4iXl`)lz~^` z%0lol)1pnx5@~7Gce}>h`EwvubwPkA)QAIK?%rJ2_iQ0 z3yZqsszEBSM5W8zOhG-#arJKYpCs7wZ9A8#LeHjrvumnMn#mRCcZ&lgZ758T`MS$n zxsgOF;gkke*biVi@}|>0Po%AtPqIAW@&LVf<=5Ef8OB?~c7EcWw&3qcR&Z|@Zh#~0 z&j5%dONp9P$$}_6y0!>E0vK7OEJ*=^f`9`dep9JR5cl`wQ$K=+FVeP`0g zcn|hZo&fQRDO&o!49g&vHpW(eb0K3<+Gd=V_j^P;+(~l4@~mS@$qQ3O-jHQBi&xom zmwDr48ahe}Pb;cg=PfEFWyer852mw1)CkMG zAFAWN&E07@nj#Crx8Fs{ZDJj3z8R6(KlfP-Y*(^7+b}I2lDslI>VH-Qeky*R4(uYn-sBDB(Fyl_t-IZNfa`;qL4l%`~u@g4c7+5PUXAr!%ttw+dX zu+V3n$q7!4$oY~9lfsAb>zN*T04cz^7~QCWG=$3b$8Vb-)#msx?#uEwTdaDfcM&%^ z%dm43*{d3}P&31;d*TuqDnz8yvPmr7!nwsAS!}yK-9zyi7OzS3Fo$^plyB^GvnRN7^0PBIC?k84c04$ zqK&7o8RWJ7?sn^az_V8+8G!zL%&d8wF5i$IC}ABT4}^@?pLWhxk5mYmt0O|qT)G#c zq~!OO41}qqTV)5&{Wjna`M;)881MT)nFr8hGss_D`pz8-p@4UNLMZ~P(Freb%4ghJ zldc>LCOyy7Dq`*RI1=xw&aR|kiZ!o8@glELmLjVlpJufz2Kgx< z@?FgLq?(w(s_0Loz~9M^L4muwPtr}k^mbaHg|M+{)Qp;QBL;fvlu?17i%?g&#jcC? zf&`mMhR)m7dk-eI-zmCtiMub_E9$0qLqv0nP0H`^d%!h}?0g)lh8s!>AAX*=8c9w( zc2Ed!;DUGgj z6Dp{@->JvbG3k_V<+t+d3XTOQs6nH|({MT+%vpuw82s>?Jeqm*;<)Wv7dPN-=S--6 z@81fK9@M?|Z0pj|+%lJM7zarsR5|lJ-4cAy1ZG>sx{TNLZaVfsw)lWOv%O5D)C}X% zE{*V^q=k3};J%rHw4~ocijUGf(-tS`RJidh#iB*IIO}pMJN_K0K~&M4$IGKp;=vvL zJ!K@1*Fl2o_R6RaK!~WZnqD<29R=FJrjBY62nC}9`@LCx8o%Bd zk23VHVcy`U@*!yyfhGAUf*uSc644;mpVWU0u6cQc_>JhSUflbDeKC*r7%1PJF9 z&}Eya#osupJoZ@aFR7Kr`|S|X;ZAI%)0?_=;oTA;NveulN&5sFK*HdtK^l&P`IM1x zbvY!Y<+iarGvQV=ut3e}hsJAxo0la*#G#t)7dL*jDk*-to|ak$ip+|w<+1!(*|!Ey zauE8E^OI3|xHqWLZdwdWDTp&FZc7U@*xB9Bk7`|^f2^!)}r7WDpywP z`Ru0{?=SjQW7v^4JM-;BPUX+d#59(D=#R04rZ&)scy?G96RR;)>9Na5rV#4+z4^B=C;6^z@Aw!PKVOw2XqC%&9U{Yn!TYGR>c@eLYPL!geg%-p{Ycmghr+}xN z-V)II!79%`(qy~;?yVa`X6Q~;WDg%Q>CO_6x}IeW06IrLfSzb~Bh23>b7FO=t--|k z$XVDa+|6&b=^{BnNXz)DDe}CLvw~5Z!20M5ZMn44Z zRv;Qe-UV{JN#V~7aFcl5@qsHTNdHww4hKs7yjd2=bbO$0HQ&#E zcdHxalUth;yg@QUPi|2`}sptJL zC&+APzq~3iUA5K#<}$z^RtI@0?RfbHiKjLX`>tf!_db*&CcYNTgN&}iw<@%0*P;FP zE91;1(8F!*AU6Or5_r-pK^jtuvTpzVM+i4|C@+YZ`8zYBV!idK^6pn+1OYUb<{^tz zewXgHzBA3Hj#1&v{lgVcp-q*eo0URpi#l-Qml6lc1rWcS)Nl@Rhe3pNR;L!u-)+f7yD<0Lo zHQ)OoGqQ^>`|~dqv50q~*t>cO)gF%)O=n|=N`#y!?pL`t4z2|Cr^<0Xztt@}^+4T; z`?yL6b0*P5L#ayrcWHIlKCWixk%U5OmbmK_`ib|H;lKs^9@#ac=c0Nk=25c}hjRWc zX^4@DV2E6doIxmssZg>Dg8IM^9!A#|Dt@DZq{}-s*887MsHn zjY#p>LGnV1%p8AuXkP6OC9i5oW8a#t<2dJMyvJcB&;KAUK%j|O0$R>*=|}!*{t{-6H0$(j zOH}04-WU4R$92b$Yu!_M>{D>9LZHi-R4||tCK;tf#ioo-0%rSyi6|C_9jv6q-rwE_ zN#3_GUOW9$79XwLftb5{au=lk7%I^__)u^wE%6HF-+)v>tgb%`L;GJ7h06aXcC{zJ zmgO2GW{cf4d%YYyIogLQdT+@MAd{JGSKf|EL)$sbK$kxl(_wR z>iV3I-@kq_>M^uivn}^6E9#dTI5ti;^NsSYtw>LC`Ly@xubxnI!+VUD;+(=<&xqO! zp66->yS>GCQ83oh1Hlh{xG0!BW09tIJLG|x;EQMLXvNwMUPyAm-=?Do@i zUr`OIx7Vx?o`%DeW+!DIcSq4_&bn6rn?=s7QrZicO55g$9?++7PuijAGj_V^(}VrEa1Z?F06BY32a1 zm2meV(ls{TQJY8su4^u|odCOX!|s{=W>;f#Esx{s9h5>oXC{kWzG?p``FI5CT2(&S zb*Zh#fqKc09Ny|-@N_wL?DVyvPmlv2mDR^Y$;Mtp`vlPMRqDU6B>LqaPy&qRUHD1< z2b3h{#(EAE0PPF5q|n!+Es| z*v~FH&^@CRH&-;ODibEQKOVQee|jl>%`>k)qOg`RptkBzpcSBdH*ba;h{l zU2H*adSIUlkx)v$%K3IkIRq2Nn^mD3p{=kO2fSC|@H%4kmQwlpS95NTf3+h%G0KZyJMzimZ&t|^ zS~s)Y+*3E3Q-wcvJ0~11yas-WnO%m_q2{ckCd?IrF@@Txh0$*%Lyk`GXvun7@_z8l za%WD;NlP6h6O-R|bB$BrjZ)7PS35>(4NGeDl{HjkY#~@rIn;uJ-7SmBofr2H{ecR+ z?U8PSH5>b#D}D^b#w>E(`JUmOjEm%Q#T*(I(-p%4B9a1A`a|1~-oi7gZHW$*n-;Kg z5v`C@B0z1Uk$j~nJN_Al=U)U?4@Ty}!(hpihL_tC9O?zjDEga^EnfKrO;EOUVK}Ek zIqS%U`&z{BQreA*oJRZoC_^ZE;U33$IUpS=Xhk0&<4{{WZR ztXzWVuVvfu7d-qI3d3qI?`;lU@+(RlTOKo&*& zBM5v^2>yMT=&#A6{@bku^Fwe;!cY^ct!)60>tI;m6#rZ3k+Q1T^|L!nba6*9Baxuh z_mMbEn^q@#@v$O*;?14ik1T52up6_3;E0vv=*+yp#qoC8bIFb z{ngKRQAg6Sl{?6rqe~)+*ZERrT0r+O;MVM82KBRaDo3?AN`j^ zJqDX_m5EZ)Zv&?_lA&0NI=~+3lI2#})J5;p0?g;NY7LTURH~Nyar>tUr%t=*k%$J{ z#qr(4l#+O1g`h1A@zK*49BW4lUij{qg(ti$%+nxY&-Nbm^xN=TX*LY*sbLK6oeaIy z5F4!jay!ZHy)yGhaXd|FOz)klmA3}&vgl`)LK`odZrY&4f*vvGm)~s(I~s@(|-%~pt@k2}}$D3X4LYXqi3!ezckro7Jn`=P2iIe$zfQ0xtV{lgU! zS9WaYu(i@5&C#X)mW5V7R9WdHD)4?Li%sTnxi+oU*cP{*0;8H&AydrzEqYyS?{VxN z_ov7NbMvI<^`mIUpRna(#6IoZ^**4ajJkg2Y>% zw`#;)$e;dYA^1<;Yr+OsQ=24Hf6X3AweNGDDfVCbNn2JJ$4ecQ8ewbcz@wWLZH`b; zi_BBest3Nww^O+t)U@pIRbnyU(c!GWMB*TiTZ982vr8Ny`3k%FmNs+-7YSQgzlCdX zbY;@Y995Z?j`~h%uzXVmO}#wZTCsgUKK*MVo+N9WQul!JszXQljCEIU4llTqVlQZ$ zjztq)JSn8hP?@+xm3Vqv@WjoIoNUQ&8fKzC2W<~n{*jL8EfTO^A3|_gsw$Z~F$610 ze|EcJH8ia&JC&)$_9wbpk|{bZFR^qIg3Ka9UfRDa9~)N!nr!EeBnrr~chO3HIaoQe zTc2LYW$mz8%{tVzhD?I>zwf5g1fJk&z4<%lN19Xy{w;Ps5aSpAMXRt169O)`;r^C4 z2f{BNP5t1|L#h7$TYcF6KIEYA6k7@h+55`b|BYI_Pg)gxAb2+g?qK5X$ERpuamc9k zYCQeVHm}_PPcv-EhDVmsA6pNYWuU)UZ*AqvPskJy_gXik$^N`Yaga1zOqq(7^?^8S zRY4NST8Fh_(>f|56gNdVkDdfRDI8hxjhTPf6z(NFz*kScqAeyMR`Q}`ugnM}a#@+- zX@cepgvp=1wh*kZ@OxT!VT{ezc*-(*N@rrB>txelpY6`7M=>KD1aFfh930 zD8+Q`xW%6z?k1QhHc2_;rxYck+ zDlyxzNNxm7yo<|W&^of`*TEGLCWC}QgXUvT2~khq#7XQzc*tfTD-KXF6K z2d*~y$pRR=lKwJWaqYr=(e2plu9=K}SfHAJEcs*a^{{d-iSv&kqsm57kWj$yLx}(7 zi8YSah$8^!`QJ7xMSKuGZIj}&UD`ht&qF~Mu!6b;m%E3&$P8m&eh9+3I%)`od>MzpQ$nE8z}MpGhLS$Wyjc>Hl>7t8)zMH711-`qkTvFnumB3IpKOZJcY6FB5ngh->WO_#ZhNA;P` za%8OcE1HCQiLzj`S=LnYTq!b1cd|QUveC~UGRfe)ZJZCU%G8(IxOc2+RmCR|Y=lX@c@(Dq3Q8yhVdZ>i&4>R9NT;h76_gDw%BGd%g+FV04IsrQKaoD$ zj)@yE8Dhrw=W8m)s>QI7Rc+C1|H(=q6jbLg&=09dSbxUA(q?2~@|SUr!_p%VVYa#^ z^-$lPjQ8Qy>@Rma_2@6Gg@1Z8>qaGO7F$}t<;eN#iwoD|jMiiH#C*>h-fc$0QC-0y zRkM17^>kG%Qs%Yt4<*)=7nJ@CKEQMKhpU6z^10Y%9Y1%q#ojo6@^j{sR+Hh4;MTg$ zMfw4%-6OQY@w&Wue5+pKMD#jd1X$zv_g?P}(?m?5Duu4cbh?+=bT5Iiqi}y~un>e* z)GgFnqUyn+Yc70BtZl&8M$iAX4IO6u&zsYx)kyZglr5|f%1J?ers^kuhja8`?zFe5 zZs^gt|CL*BZm<>6@u|uu8?M>@v~aQd(Fr*W*J{fLsXNrbam}p0I5zH+Nhc39ACc*O zn{QbOZJ~%yf6G8DKL%_fTVCTCLT;b{ZamKGH``uLeKo=z8?92{ljVuXL(7esrW|{{ zOA~jisj9aZ-ksdzqEVH9a@sEp(J1G>C7Xp44aG12<;XV{$HFHheWdjZb(CCYw?AHA<)e7Ll7bhCN+oC%PsYhmP2 zliW1Uut(-WMhTaZsQRXv`%Oa}rCNkZHC9MD?P5P%EA=Q1GA3()-_TWDiSWAAh6koq z<%>LSKt6%U4E|ixul0+E!mzJJ4da6}+CFm*#)tBocn4KMWOJ@|Y2@a=M1zHB!)QP2j0z40Rj1 zEBV>{3_j2A`Yf)*wE6)1`e0w6>^8@_EC(6ZdWkwM^i2Awiu0`hSqE$k){|a)Ql)be zm^s);oN*H{PLa7SVio7gMm!?_5McuQ9$-RU{?Bj*q#=~Wb$+0%lf*pueGYxDpI2QM z*_^CxchRcF&1gf*)ktU-u}m{2@4ch0sba!a)EUeZ_&VYM=d?#nuN$y%WGjz83qd3ya$df!_wM~T z9D_=5<}Q)HxG}x#_+6e&M_s>N04yT60)I2^G&S;sVHVApzxFzj9PTokU5NFjmV4<+ zrJEjyF{Ui~gg=4H zxv&5(gZwZ#9&V6W_E*mz@uqs=WuInLkC2La<%Y%Z-)B7!Fp%RW?v>XyhZ{vFpF>i; z*=v{qi%)kbuUH&&NqsDpYKS_Q__-%LYbHzB&qJc>qRGX%<96Ikbt|*Vk`_Cdu=9 zB@9%TrK?77q52bCZ&y{V8CcrQ3YPF1IF#a-dmwDDHZ0bKINVvEF$P4gu>^6|g`-hj zi7nw2kWV4Yi7mPn9a}FJWVpc(KOUVJ!+JZ)1$M9a+LBmJJyuF$3|ZQc;hM)(vp%2A z$jqL?`pO`an{100dwm7tk;>qr1LHlV^C=U|8MCEm&=s6NmeK>P{Qz`xjDeVtVl6+O zV1zb~z(5RYC+!Gl;r%#1+OirEmvIIj9)OP8nrD)^wcoVbR==p3n@>LC(7(B^q~B@c zz!2~?zVvc+W~%vnh;2?Zt2-HM;6Pq>5&e{?-MX?+|IQK1s|0HFm)`ist*cf>N9UVG ztxwk?*-s7?YckOpaV~cEa$0&%OO7_5rT(f$Mg*v1X9y!W$U02_g5@xMJ0{rn8ry=T zY(lr|81=MqPt%%F4$BWU_HH67z^CSy3~6p$VsMrF3x1_3G9yC%L>6SWo#?0VHG75x z3p^?$F#_0aPP&j}G&);&`{zU~hT*Hni&!)>BMgN|W<95iWnn$SHs1ptx5uUEvGrYZ z0jd(^YTyHkcavDNxE{1tCv;GcoPCTg)aWQrbO*HHkZG*6X8*KgM>`L1?5m{zOoML% z4r*MPbs^xYiFiTt9cWiFR%Mkr<$QeUQ7dk|Po<38toVuMXD%IvPkhSvtS2m=@&T_< z(h>~rFurw_`O+22f{KOEa8 zZP?X={W)*Ik>4Q!xmJUHOK-<3np$^rb-v}RXK~r|h6Tchh-qzFK9}m+T?X47uTJ1vgJ0TP}iy= zaes{1D8Fg=FKn~zGG09PhuH{5fwiFfR{ zN3@qV5oDMPQ#sO}FyV;9;8(HzIj({CJ=%AN?~7lsPRnO{3X5=srhicdrHXyd+^mu7 zVY%#2xNYOp!HcWlh68wUtJGqz2I*UvwPIHDIMe~sD|^K-Cds!Um7e5mSj6KV_~6pD zF{|@s1w$|qrb&1VlcN&;_4JE#TN0lR+)_(V9cOzuI#h)m?tnWkT=rQ2rach7{3M()fW zfo8z1y$*Hrmt8cDG0fy!AH1D$G9CA97M7(^sZ;(Ny=8LJDV#v`ctC62Hym#BncY94 zI{a}P-0`oZ4u!HVKB$9epOF`9FgAUn)f8ivY!^Z2!40tiXOJ& z1!=}TFz8n*5#OnTiIC2q!uNNJF;qGfQF>38COLWyUho|9D*~dS1q3vsR_n7sHH`XN zZd8lnw6v%o&2QVitWa4Wt3354*wCX4+x9G~#af}9Y?g}Y0=`lw&A+xyRl>X7(bRV8 z6EXoO`XbvVlin|0sx|i@e=E8#%N+2r|E}$(yVE!quT!l6E+vY;!Yi7nEXYU~`yqXe~j;h(byD``xUGP&oao!8i+ zRQC$dmSEw_a7tDy+tPs~7%gV~+vNMb)f%s+BSJcx17r1}sy=l{UWvdF>-L2-cgLyy0j5qMa(XFfXP58&d4h{_h3NX@tSOX3ArGtEa@utv!jba>x=qMUW) zTB)_UQyl<0HskWG0s+;H)-IbTdOTIjj9y5z`_rbDSU&fVD+G+Q zSp}cER=K^J{)UP_OzPkycjNK45C61hw0f@^5oxlgct_?USl-k(Dk91VvtoQgu~6^J zL$$(y4rd;5ek8m8J5k+y)r@(;_2bTF{>7Sk2gD1Gq!=onl5$aFsNM5zw6>HP`82@} zqZcs(+B3^gAiv1aGWetV{jLH)k1YzHo49>pVKD6|E|0W|f~jLpzp4ED1(XT%J& z`fDIQTcuYb)N9Em3~yZo%By}UL((T)09>qrobm@300OEEnUN<)d}w_RL)+%l)W`^8 zIKy_eW9Dhq%E|l^^OB72L?DGHn+9KXW`9lg3K43Cod>XImmX9|-GESX13pttCi9r? z4Tw$k$57&g+m~;Ts0L!va57}tAh&~o!qE3xSchSBfNup~I-gX~Jdg1CU&&tUg`*6* z$KFQ*O%R#a1&%-CF>Lm43Kd?ADDJ))x-a2o(}^j%#}HtCf4^T%AXDaYW?>q)R`$K- zzpkt0hT$(ALH{JpvR@vwUhG7*&~{v47miu+g)JO#05*p0Vx4kRoS-=L$BV&;a+YrV zPjrhV_=D-<8QRq@_9VbXRV>aDn$prI1@jgUKZxCQ{1E$yk*Rc|AGR3n`Ey-w z?9ksXw&Oe?kNPm+m0B~adg6g&2Gl_Ipc!@@d(}03A@m)m)5fSUFhtf=Sk-f8C+x9~ zlq1P=%b++7oK0V&S1k$f$t>8i?sbQPcbVO5he>5Z{RH`S@gae;QjIgqq^t}Oml%R$ zr_Vo9+b)N0*y@a4j#O%dU-yI+`zPEbh%CU?WxnLwofBWUYd2zi_LR@QVg77A>GAq9 zZ*=_LUuQes)sh)BbB)B9Usry@zCG>*e;>0TSQpl7ey1atxgp%s`&-WQBC~)7S6*fM zwreHdHiFDJk;84PNw(r3T3nV}9{j5HK|E#dx#Y68gU-G(8)_?Y&6F}GfGii=xVzOK zHxYDgn33skpnH=3Fi#`-0S+=b@`ez=ebqrb-DY;E3}sg^VFKmb{$h%NO7>ToKP!1e zBNNkv8mQDDK3L@u*q|~wGpgdlej${Va~LE{C-+wxK~}`2tC1^brpLjKlxZqA1;xI1 zH9*p3nD7Rf@7K|ch%zNHlUtb*Sfc?jP{De0=Ge4;Y?}Z49Ih?-Z^BG-v*Tp>&r@|b zKB#Xp-v7f$6F>M2aKHk%Tv@2G`-8oE?Jcq+i`&DZ+uUigrQfCiufl^^14{2mM6ov_ z7K6AQ{#bk*`}PdFyvF8{?f*&gruh9`;kWH}6mMqA{**^hlnEc3jiL&UD;C#y`tIP5 zM+pit^_%#D#2Ab>NvdX}prb0GC~lmj9GLAN+RFD~HzZ)Vmn+n)c+lh;ig+qz={8e- z-`~f!HygUULwYS1qyxCaDqZBfP(0xxtb5@M41X`S&4SO0{JVLYp?12`brY7Rr(#0R z2kTaZf{W;t&AMYPU@`* z`2-V2-V)3DyQoXeOsF3tCQ>!yihsKfjk25-Cw_P z!W<&fKXqFVwS-y6lv+QUpWPQ>JrT}60-@gV2%ebh9+NENZU`N8oj!K85D{6KC8ft* z18RiIA+{bfwBdC9h4(4b@{AUT#sanZEw)lNKQRQH6RcCQ8U*Hb_h|siNGZlH3ru>^ ziYpd!4xIt##`v|UV~$BFq*{hLsJc zyDm5?YdS4>(eAXOeaUPN+4J)&FCg15TnFj?j=MLMFEtT3gzlTn%KabKeQfmpKjBDh z;0sve-}mda;PTBqa{z8*Vb?iuCYNp5Qe-DHP&M}eulbFaE&m;|A-8&iSH-F6d;~K2 zyUCDDhd}FI*$*x~YHgB=Iaqq|JGr-OZq$N5^vXEXyl4!q<&;R%Sr1bQY)Lv?-uI z-E=)ocd+R0#fHhgeZu)Li!8|Kd~2db%(>v*W;lEM!nEzyTr2E`s#Q{%D-h}hxK_Ck z^xb`L0q)Cu95_oK(M9)J=y)=4f@Ucpj_i0V)Y{1Lrny)p@pn>vUC?Bvh>nd>YMsse z0ZaRM{_o?;laAkEK`_E5JUhkGe9;UuqnZ@b=gCMEeV_Wt_|d!|Oy|i+x^zwEQ@AhW zM_EG5IO{cU+{Mh;ar6d#+;(iq3m=fZ=yT#$r&%gU>#5!2jc2siTkA%sgfy6@n$(Nd zQf~uZaY}y=pfU*G__(AXYaVPA){iCcbUK^tZQHu$d}I&<(!YDzCDK-EsXm?E=aua^ z@$F~bn`!B4kTR^FrTuUarznEH@?QaKD@R<YmbP(|E$Yth5M?2lzK$dDSMaQ{E`*1bA!%5<96Q3F;`@99~MOk|~s|@s_5A$lPe< zx*^RysqCN0cZV%8UhUs`Ly*M{Qm7DewZ9eh#m1| z4{U|9{DbKUJ8$)LX3f1{c>G;OJ4s&~JDNs&-PA{0<&_@bWL2DB{$~U=jIe)s4rd)& za|L2!5R6=pzZQ}aQPP8aqzWFyfoPBm{LA#Tt)hXtizOHEMbsXNL23J+{$NJv_yR&X z;b8v?{q1f=YmV+LQ~%6S@nd}-*iw?;wvl2J_KaV-?>NC!+ItRwl3{UloTzmH4;UtKszde?PnH^4J&ho(dy#jw34kz427>~J5={NipbK6hZ$ zMfF6S4v!8v!F~>R*n0p&_--2t%=Cj!X5wkvGjLp4@hb_tx&5ezQuwE>7;OiV?HQ^P z(5C4#hjY*01~-$N0^9Q_n?}tT(9RxraFq-V9>52?RNiF zV)LsjP3^?~UiysFSq_R=9*fLl-hJukzYcE?m$X*a9Bz2;z2H06LJ3-nQf){_^wFxM zt&RRt@6%S=+D<%9yrjfQIDPL4-s?jdj6n-|hK}98bOef`&Ry;osp$HhJer*=p zE!lD9-)-?I9ng0;c@7Wo3%EAgT)$`(bg^6>>`V%B9{u7U9##Ipi2nb7^5!Hw3`9+s z@aDbVRATis3~i>>E~!AA?Z#$^uki9uqEJ}rW0UNeE`E4#Em z5rzo|uiPe7A1q`#+zt~_CKz3}^pmBCZogb`1WVfOaQgjp+cg`}xPu`wP#zxgYdfF$ zm^Z|m4R>W;q#Qs*-yB$EmJcYcMwv_!cL0Is{XN_n;;uO@^}x*O1LVcBo|nK|7U4+ptfjDWX*10PJTs5yi!^5V^AMLoylm2CiIOJf&< z`U?S4U1&<+!}&9lmwZ*m;~d0usfug4`qg5Q2;kC8f3SUEWVMJxhX-{GbMA58{K-r% zPvIHha#*bC*K~mDhaYU8D}5xK5aWdvmW~byU%jJTO}^c|u?>nxXDE<-pV_>U3-4s= z>3N(?Biej8IpL0)zDeqUe9ixe?WQ6qp*8-G)CM~b^@taL6J)HWrv;>?1u*_O%dz44 z+qN<^NAkB~#^EUNgcL(Q4lZfu3}48w+i1qkWF7?DzxO=R^oR}@dmb9SR6NRCZMCxc zyUFAYS!0jj=#<|^#oS0iAc?@FqyF63QYD77=Ix&CfN1i>&(76(Al&MOGrH_m-%_(4A6ib}1CuC_gH%yts|@||fjU@sNve^9n{g@3NwXo>FyPTV zyJX2;r5Rind=>bvt)y2cV~0<70%{_3OsdlR~~4GOXCOW`AbV0^s1aaX08%0h*W_$M7^uD4`QaE z8CR7>ef$!f(%4s!^WbJ3RoS{cfYO}A&<7d2s=7p<`>IbpQ!i2ZPB_E|g;1zUU>d=Q z8!*-e#CM5UX+{v&w$8`LsHtlA4M|g8Q7;Ep~Ufw zPn3GAzkN@+jCu#jn%N&REymIGE5Nk+AsYnOX~Wc zptht!+`4!%sgqUn`Zdih9{pb!W8J8Y3cK4tvp-Rx7d|TCvct`lTTs$2`B%S*JePbD z?ctYHtGt;rXGEtLJT%}9#V}UW$$boPiHTA73yRn8MZwP3cdonk-39p-bk^uM69nHi zNPml!*d+rMPNXUg3Px;*XC;P$q6C}DAwwC^H>kE~KHzjYRf zs!wC72jE%!k*u}-vZy* zN$km{>a`MvtiC6&g{>N3PX-=Wpiu?A&<5A_$$f#PRWG%H2@lvPi=NxuNt`{g;ZwJ& z`COwzo9-FbDpEMPEaa*AbTj4&&iZs`7w~)4%aqhUJ*VVyUkZ7Yr+4&5cS+01ZKrP1 z=+U}y!u~`)g60}I?y8e!wBcu;?&}pTg0$YRsX1bcQp0sIQOR@JZGC%JzFMQ_sLL2E z!cmWpECJs#r_jiLm@q?ZzXX3f@3zr$Z^?IeQ#Yvm$aOp^h==fhRMaX-sOx$#iEYaJ zkESqXmYoysoJ5iVq!FG1U&DFt9Q6i=D)YZ74n2>%q#>{8^(e-DtM0$`RYuEU8L|QF zo+EXigs=Wxt+bSkNfGbO;mkH(tA6|DWrY``C_k$Y^C9>9j#-Zy8?mr+xicEQTmigjJ=se{xVbJH>nJ=i9y4Nu+xPQl7G5z!~2HidV zBFrhOYVf+6`!8gQf&gEY_?f*;8;(#~sz0+wnEQaBw3|ff@(saIluH&8Kd4C$(4wPn zlN0d(P^`4r=ydA^5Ba9j6@K>V{o$kQ;I=0XQ?3$XU-M-~7=0dQm+kH58>9qYBzS}J zf7qLXI^$#nWISqr7B}4B$4C~OgWW1WSbo8sM|$<(A9#fPTw}rQCim)TsrS0 zO@og@S;Oc7CyN!DXB<>*dlm3vjF(h$%3)#tmLkTN#L4GMwla;)0ciuS8b}s(P2q@^ z`1(1AR^JEsN7>;?Unl z%N!S2SRTk2(l}4*<$v&7II_D%*6cEG5M_SL%r86XJXF@+d zm_imbGq&iYlB&Jl*D9p%GwUUfB*uKY-b%n`2qjLW1= za|u0VI=!ga{rx;qti6C$g2DNnW^tLve4HgYFI?h+MW%*X%73PTdTK`Afu@fxJ7Y2R zd0Eb1)w{uL#_U$VmnvD{eKSZlziO#7D{vv0f@#KgkkT6|o>~cPirK7GIl$=F>c@>E zOiqEjYpK@|s*A(PAne+okcjt7*vBTGX>1L&Oz?94UEkY(TfcL??qc_vVjJj{2<52e z`*w?l%Vrr3X3_r+p`{)iC5yd~ z@fcTqP!7KKzKnu_jg|n(V7zU{h>nPwul6JprfMLiaO;Th;TI3=TN5Fjzjkdv8|H}= zL!cnV59wd3qM-JDLaLUFlaU0Lxnm05x(?O&%kk=Ni}!un#ONR+(dE`rsqgE)qcYNd zBrOpcd{=iZH;%c-ZeA`G*uO8A#f>>f_d)dOe^~%~?>hf0s-&PLC*noyIIA>B2S5-s zzh!;fEIVG2fZm|*g60#=1COb)Ftt}RqEoW5W&UoWZRHbDaRkF`wys{`Bb>X2Q}HBlo3)7ZQ=7p~AN>@^lqAQEB%q{IR7kg8xRHv0c@btMGzo1-$bU5Qcku+&pt4KM<{YwqzY`ZLg&Esxk~l;I-GP}2 zaFj7?4u9-k_Rd+ILIOEIM&iusC#tEvG9fs+F=ji@c&%IaJ^B+Zn|U9sKz)3iR+BWt(2i$QWozwA~p2y_f#Fxkrs6}oFa{To%%qJ=~@eORL9kn&AP ziH@nO98fyyemiO{UVVK$Qh__{2Y(`xya;G3`x(n*ujTVY8LGb|#sP6lHiB&$7&JJq z+gDb}RKy-ZbvUc+q4`N*suaBs$R|4MsgSiG7zgw8)yP6zr_jMl(+PN(?W@dL$yrxpLLBUXh+#Iuurn8(8QuckB0qFJ*Fc05QpG81jNna;Na3yG zdAI?ig=o<;z=;kTRhut|p7PUq#yTU10dygh*20DqK5jw~$nLT8kg{U`MU4bQ&_4RJF1RJTjgktcb@@ft*Jtx=a&dGEYR&b+ zPIS}@Q?E$OsA4pZ)y^QiHoW`{JDirg=+n+SewNV&a6GjM%PLOp;@Bkg_o#LFcAvcK`4Y@r+Zna~R`mwT_Vy=! z94bc6r;LB&gChMy*NATNdy&z2mCSuZWXP<QdL^X%5?6H_;7-Tv)~+)+CSU>HoYc_>nvh3R@;(rpa=e}# zNSur*0V5uT?;p>8n6q8Lrr~lxty*gpC9ltSOT@+AHOu}JlwJ@vaWtBlg#0J(HloKY z40V!j*B;=q}r$D5tS(qNvAJ?&c3%$lRAU2*n8 zMtmhBHJ#c%&#~zl{@%~l@-hyTs6Fw9ZFG1#=iVu>=mNtjF_x-v(*MDwhm}30K{2z? zOb zNO*5NnDYzkjDVPHS(?yO#kQTZ6gjvw;;|}{ZBK+afKdYAU>WBRBw6x&-TJMJYAJe~ zTj?nOVPR(&!qqsZ&<3Hgsxx$#S@y(zKgXHeT`3+ef`T%BY8cn{7CnGti1p#S-Kk$ z$G=-85n#C4E_s$))xWN>lrH;{)CakaQtt>GNt2jDyS6QIKmRuXaS>vryn&`Y{|L!= zptF$mYHy{+^cvbO?xUkEKzfgqAkP>_bH}>6^{p$RC|wzm0u4ytV(o4RaArSLS)k?R zkE!!v{q!x3@$%Xzj?ozygZ?F8PDd^R!W-G2ChBmpD-9jEm+=8fjU$_hiGjnScX(Au zPpqJ3W>>cKh7gh*5@#tb3!dxf7J7cyQpxj+hB2Q(x0YasTf6$r?Zz6}1Nav^EWW%8 zZ~h#oe0)d93jQRUGXR@)b`j87EaQ0GH|t`p?~kx?>MPbo8_r}3&BOY7Yz%;`EUYV1 zMJ_Wf`x>=9OIee>nWEJz^ooAVg|zEr*IX#FqE@N{LwQo~D2EQx-N5L(VyW%3z^`8bN5-@jRD0Yntg=qsYp?vuo~Y1Qt6fpzW{qfM!e zuTQbA(Ve}8z=4xOx^5F7O=8Z_mbPYL^qbKz-A@z_0+Id7qOxiFtmVFul3aJ10#g#P z<10ON0=;2CvS=)_=<7&(XxKY^Rfu!@te$jv(;AP))k@9MjkWzadk6qzT$%Z>=fyiG ze&gv4Ln0(ia8Of6dXB}Dx_;^F!kc)sRoM9 z%3lP^zL@4{?0vzX!qJLnuMcs(G&x?=lk@QtcG`fxevVRIjCkIM@u7RW*%4g}y?C-4 zSSLY)Y^0NN7$0!x1>#LyrDePW&W)b0<@{GIjRRjgJpUEb;b-Dz&hwIvU;TE^KMO1) zmm-(<9n+yfMB&iau+J!Kws5JTXh$0QS9?T>Q{B-{qEX}l;J3WMm(m3o(V-4%vHHG( zKogM?C!sX4g|n7X1%P2N!(44xuRWSQ7VFGg>h;8S`LskOP0~=SSvoVGbLzmoE}`8h z3!yp}{b(QJA&ME@9c8wvsn6N4U=Zw#6kZVh>^zxV+ktk9J9-4xiifsolI%rzLCXVB zRnqhQ1$5uPzikAuTqz6b%koY>(uzxd|NHs8#V?|%VKkRyWy3drkd98^&8|wUk1~OQ zDt&_i`;sh#e2@62IZ@(tQQ0M9C~V|Wga$;N4W?jyImzccYKGT_ESlNlJ6E}+p?oYk zHz5A2P3}LJJvV=-rEX;;@k9AL_r*J^+==CPzcHH|uEwumK2b47caKu}FH0vS(-pT& z^a7yI+aEidg6mylWiFfvsWxm2J!84<{HbgD`P@n1nN`_p;xCjYlIq&vBCX};u5}1S zL{!FboTFPij=}V0s{7|i$-Q{nZ784ANo_=#rO4PK%Lo+ljaPEl2&L(e4`s($GLv3U zAJbBRPjYHi-p2ALgVeg*&*DHU15NhFwPyoo-UUCjUJuRhNu3S9;}Mmu-RfUhW(q&P zV-#grc#XCSlPTzM0s>nanisiu+)#n^!D+wjAyiUV()aH|s@h*xT^2t>%W2?a;fRUu zT<<8Hx{S;@_SA3p+4@E6e>>Tuo!aRw)KuSeWX&OqH2F$W3sSLj5CNad=! z0MhG6VzCa*>Uo!?c|M3|a^e@8UKSzYdK(tw(-dTqlI9bhY;WA&+J9gZaxw`(5gg*b z6P59IYq-YegN*@(*j!+q%bC7FVwpC-STZ`324)`{sQ5|Xg;%km7g7%`oc?#<8Tmr& zqoRKCmCXNn@9efWmgtvt0D#AFytP`#cF*@@-Azz>(A$=BlDPx zfs}4aOAKO3@3UHjCf~KC>1$S&tHtSKsmfLDA2;xz>D78;R-ry$$+TgmdXwB~?4Zc7 z3T$s|s8Ag10oobD?M+Bn*&%$IXD~tgUK3jV=7z&hae3z4mGjs%0%clJFAS9y+&Zx; z7;XYA;E3cOB9OQ`Y&$LqrzmM7@ksjm&)6+XXgPD`pV)+9?(gi={(-BFbaPsCta+Hy zS?#0pi^KzNPh|h7@*@q2Pfa``^4S9?3xS%CpwPAkLk?HH4|%T&Aw>5O{Z;~kq`SP| ztg;o!t*Ly;oN;uDyG)#pW+!Y8bwZ(8U4|}q3(bQz-^C(wz0DhxXpE64&y9}>_Up2J ze{5=8au&u>AyS)l`5b#r+hL}fZwJZfb^ng=QScX@Am|q>k59}5|9i@PktP||MAlsRQKEp-3XG4?JYO+JNkY}RD4E_sESh{`2DcMF2QfDiP50|Ky zzaY-+Lrwv$`X5;_JNqv@&bo5jSzGB;7)=}7_LkO_Dc{Ua&F?cco&Y7x{Y3E&7FB)r z$70a3+uMbMetXRyizFHfUnSYNlVjDJAyZvfzFa4XPWcoX2b>u|opJ!w=&jj-;O8q4FZt}69Vts_CN!M3sxJGt-1{IQOZQ0R8c^wk% z?B1_dJH0BCvgt2vhWI4@F-yUBfu^D&C@q5zPZd`-{F0~~c-oqw;WMBBvbW|_o`Z5n zDk24Z)98?i6-E*bYuV$3I zZDaww0ztiz(fp9s2({656+qz))u$g_a*G7M=#bkZ+Qvj_ai-bu{MpiJaZkDJQTQ@B zAcS@fuIi5eaUIOEIVPQ?+;TlirD9R(cAV?icFH}f&Gv7Ta`g29Pr1kc&UFVnodpP4 zFQFZNn4{x3$zXlrVfkf~w@!Oz?MHg5+C$Y(NPa#bjw$16_$u~&%^k`*pQ{X?B26lT z7ZQDgK5F-Zs)1Dm!a+20U784-CA)BFb%eCEqr;KoBijV8*bIK@DBb|lstlSNfXo)= z<&V#J0emf~##oIHLmZ6s{wld;l{dQ|!5pP+);)XC(^{jmzr#ha#|BD}IIzi=R_HIhKvmvWGwTYp6)nXxWCM3nKUs+?_xD3tKC!HUzZ-bmC z$xRtq*X;pWPU#I~`!Y4Z~iTUJNLBMgb&!9P(aqu(H$R`wL8Ses(>nUsC{t zN+dt(&>vyd zOIpLBi5$(b9f8`OyPH16W_=obnOn;>8p&jREqcKbhrK58KNS}p?{Dw+q=a(}Q_ogw zpk`KS%Vf7tWsM`}U>?KJxW8MF0sK~9)#95{g$zb}Q8LfZHZ7}#>NiDe%FZyjR zw23!_eTQ}rsxHa*lE?+Xf^Un~^4*yYOM=xSOkKMGlf)$>TJHK^MttxFB%Tk592^4d z;v5;x9q_g6DT+yS=hdTO%%O6YW>hWoJ*A{3qS6^byk9;H+e%Ftcm^2r2>!;ZwH4GM zc{iF+TX`L`e>x0*u{SE$)f5=jDNaD^ZadMZcb&DFFx$$Bomh?AWJuI+ImnFyU8?KP z%vdLieR+(ZPm0YnB7*2#c+jnf13Pe=hm=WIPplpdp>9Z!B{G-dvN#exkmE%{zA<*Q z@nr*gT?d@o=s2SfrX_BxwZ_3_hUX_lOWL$g`^UTY`C@#G>vS_^XZEm~_cZ)rG$rVv z(iYB@a1+$`1k70;RlEHM2QG^;u_VmNi`Xu%)F+{-Tf~&DI+|~8%ThfsjO5JpQhEBm z;5D`8vID0^&2y_Ns0E2M*KnKZcj-&&bX~?%EgRsH4}Lh4^d|*&Z1!_+#PsoR4O}-* z3$hNW&Rco>$=FjAxb|xe(Pa*2+RlTnCJ1gw5ffNpoX}F zR#pw*s*%*gT-OAl?eSo-l`;*HFm)=SLBnk!!PiRuz@KlJy2NAWcOUl=j4uWbeMd+B=Tyocaf!>h_z$krQx4+txARV2OHNMjg#Ul8l7BM~Y#YMO%Rxy~|izC7AJ zXKD9C2gdv>kVAK3rZ9gCDl%Im#ZDt zp6SK^|5Qgxq1@$GDVN+6a~X4Z2X+h_jA7A-#>di_U9gZzh9T<>v@qxEkl3%t>_?~p2nP$ky?v`+&2QzjFc=G z<;m3gzqr6Wk9^!XO&fb!4?tj~Q@$wI;6#Q=HEMu6F^^Q2EAxAk8 zH3+M~EDJGu@8K-xDX8QXeX{v;Zd6Q1p789$n~!>(E}jVpVD+dYm`Jgzk48S-=p(FFX3 zJ-pH@WmvQ$?<8TW=mnK~S(|z@a`A>g;ejx;?x9*dh{ckIn5!T8GDKS2Cr$@0%TF?i5!Yu);JQ{WdRkz;X?Ra*%wVWN-O13}x^ z0-@$697+EU(0hP0`wbh6?jK59{~e)aAT#DT+Gr~ZVTr5%sJ^$k*ApxPY}{IFuqg>H zit+V$*1v|aV{MB+^#6>S*cpzIjQ#Ws5c_5$sM*BxoYQ&nxrS1FhF4$ZfO(X>9y$WR zu%t(5eSLotM+4)%>J2gpWz|z;2g8fpmV}w(y2H9o-`amU8RjfZv#jlm68{U4>A$yo zj%Az0VQbt(=2@}C@a6Peu%+PY;FB+ka_3Z$qik!1eRZv70!)B!CMBaKOm(7(cf`gU zl5_S$a`?3K11(szWP+n1P$Kztw~2?%rZ7$PGudP<|eg$b#gY!nT5c>k2k+3c21R@CK;aNk0Qm&5Y$`mcG zg4B|)soaSGm_>E{!Hg{qM8xJk7m1tQv~qQb=2rPo>-+(Bk}Jh45S9vRFw;^VF)NQP zoj)Ovb7gFdOq7W^g%2%aIIpbDh8sJ8s9a`cBX4^N3Ee7cJ<-jq#3Di6Desc7Q7yz4 zz7;_oMB02Yg?fSaE)>uP?dC^R3VE6^tpoFl4S9$T9|po91T6Rp>6wx@LFsPMVZzef&)0YB|4i#N_BL%n|?7rwor>sEKqyu?7u&3zg4 zUE@ahfYsZ88_fdmEwhwg9;#3#WLv`}VjuCFsT6V)>Lu?XEX0&E7|3+cQT>*q__9as7pMs-DPaboIrlr$n*`lo1mxp4+Y9esS}PvIM8qZ1JV^1S?TQJu1gl2w zg}Bn22y|;>kPelfF}7?@WIOFirYz&UjsxUU7jmYiqmOyi4R3jAw5%IWDTg$PB} zMe{_!&FU^|Xa|UrjE)-7q3825#TbF>-vKk6e>2-`iVUxmntRGx){Xs7xq)dZCgG%} zdq?ds*nd{~s-HiKa$ytx*!9U1cd8nN{vsCdXeXQrs$olRnRs=oY$!g+{iqi}E!DRO z!*u1X*9{slJWRX`jod~6;b#J?AI>Gd%}6NasUtaiSepT3`IL9vqzrdPh{a#aCE1|^ zd_GIMRjXY7Y5BxCxq-`3x>j>PKod*Ev-t;)EO@}Vf91UE@h^l({_M|!2`UHNcj;yD z?COj9@u@3~*e=u$YWei&8*i%8Cr1ijKM?6u+`~mNdieI+ zVsqL3<7X^86JY9*VSPfq2?7Ltq#6{?=FniFSn$%UgfI(Dtnww!Y1Uca(7?&5yYA1kQ37cz6e3ZAC90m~lx#S33 zm>+rVmRIyT6eWMU^=yj{VEE0I);=Ta$)TkdBZchNdDUrk@|^ll4H>e_H%VF69^gn= zRQxK}>yy$$mM(j-D8}xcWn?dz!LcVe8kx@vBNzPX>5vg}+mHP156MOIV0ZYrIX+41M9i`!(uFW*sy{yHtl6ar32ZL<{%-r3 zi@7wt*V(O^vCm!XnV_Jnu69KJaofm#B<1) zp(-nzqOWI+42U_W|LJNqBS3ibP0ucPL&SpPX~Kod;d)BHLX5E=m<^A?U^HX<;KT? zII$mb#A!HehfD}@A2;tl4B55){k_H1y_gN_ITlyngJHTHDD6S9?1EmPTmBy0EPp$X zaRYsu*to7fCeXkIup)I;h<9R@3Y+ZedDIMlSe7i;bQlpTEiP*?Y(%{ChrVHVNkLH$ zFVsAdpUwU=yS|DEB9k+33Vs~6oH?;P+=cce68bFLqv}Kp zVK8%zQ(e_2+JXH-a?UsnxRtMZ!T;Cb+9&b!;)s{orP)L&S%c$+-YK_{4^dnzAO3nW z^^WOd^!&uxe4Bi${o;jG#PYhl5VGJPIhHd>q|DZ(6#QwDA|}vzLq}ErwpeduQE#C| zmXK=VM&6S{DQfqoK~gm9hAfgr@t3qv z+K8A}m?-b~na*ULVXfysU?zHTIvoNH=zD92+wHX9w>F$gG758L3T!>EsvYD5WU$({ zWWEOSg(%vksG>@<_jUmlIR;fMj{Bbp$$NQRIO`$zaqxwM!DWxl_B7UHsiXc( zMnbUqI>42ALyA2of$r(%P5Fg1++6Vx70AKH%D_H=4RC?he>snVcHF?!Boxi}xKDpR z^GsvWLfKqa*T4O19ddRk_`}I(ndLt_*oKwk3@?th-wo9KX0DekFm)gl8FipmlRXiM z%MUQ051yW42uM$a)HV{v0P79ItIlwNhHG|zToER9%`Ur0?(g_I2-#$n0u|7m2aCc%za` zow<0#NEfTDfF?sl2#)_|dS4#^y0h5(1g+-((zJofjhkUySt;XP;k$=#F>SP|i_?Wz zO)K$^?M^9#PQouOC|7TECd}HqpP6>5hTZ^mi13e5N?9kvoqamhzxZoQ+4rG#&vM@% zLpMH(Bn9}UJ#8jga<5%Dsw$v$N(vaxCfvyZUjtXr&dKrJ_7P_HKcMNN(qA}u3!#8?Ra~J&>Q<7R3Z8lNuvRZe^NB@fd$H+#k+X8QgJOh2 zjLnb^T!9h`D<*FQ&IgZz4_txkX|p5OIn#@Zvcv;#_jZ?Aw70#{q8g&lihx#phh|=l zFe$jP$R5xSLr(!29fMuLLR zCI0}92OJ*ncD0$mPUVcKYwpg%rw8H&BI-z~PGxg@?}~R#7-xpl@h|k_yj;Q+oO?AF z*9qgV0~}>X=eRFS2Rz7SEsZbrZPk(AMinhM{(JKHPscO*|2kg#nb}T<|~nU*+5pv}4vMPC>f@a!`Up2+9ONr%)D%XYw+etm|&qjAnd~b-$+m7*b(6R<{ zT~{sH^}fTHCvAKMkD-1Rl<{sL*mVceF>eU^cew%TOG-*C|vqaM;j*?{(Ekb@>OA@m0o5i*$;)noBMT*@KrKsSQ z;B$E&GYx#pkd)>}8iC!0l!T4PTC}|~ZNJh~r}wtE2rf~*$joUu*2S)@P&9H*XHQrR z?%exsYh+=2B(@v(-CzGW3Sy^8FB<3cf&NUte&x1DTd!4yH^a79S##;+AjKrFTc;|u zByOhi#kb3)342QnTuosHbxXDcH4RRuNk*AB@Ow$e_If%;`keUwS=RRSbEYwt-4srK z#1FBf`QvtLNiH<{*Om+$eQ$dI>%!LP$@$}BUNPc-X6$v{vt@G=dkz4*l*Zc|L6DOQ zMc?n9bCluxQ>cZ2AahSV;-TM>=ymQfo)B9JsI)JRb9_vs zczWAX@pWHS#NZ}iNmsa+FpzsQ2Nu_q{!Ga>Hz(G4gBY;%?T-KRfZMg!#Z=X)V9#li z%x?OcLiqMC*-zpP5Ut|1ZBA9r*1#^rFW7l^jfsRgx1D>f9?4h}t>w#gHxGv87(+#T z%Zv3&n85S(_IrVVApVz2!Uq^!f~T~ffKvD}>g%)njaD{J2aYV~V@5=g-VGKSerqLw zn2iAC{ewX62S>FWpUWeMye;jG?{(}rZd{U2alx~B!A<86>L~>qdd$ff1?psi3+gtl z>*4Hu`?Xbv@(yK=bX5o&0a~lsr@&m%g=DAB?no7Jzq7Dt4F@E?cs1h12j@c2Pk+_S zgRG6w9wAqrN2~F8UPGgqiEKx02%3YOwXcBAf}#97Y_~T=y>KQN3-{32GM6fh81zl1PhQU~}N$pE%AEz1P^T9o?`0;YzOMlt+kikYpZaBJ&daM67CN+h;%jkLbGn)&ke0RM*x=AhA+>p<%Z@O2 z#;p}&v`P-dNBL4$+0*Q1RMt`yZme8ByK&lZhCq181g2bDb+_v>IPh{oyBokQ`l_h`q%jkOlH5V@+PrYaGB05 z75&J26O}GAjLmWyi%uMBOGWd!#VEoc&nG2saEHeg#y>Z%B>1$YWAnAyxX*8W5rmR6 zRbv&H$~kJV%57p{0_%##f>Ah8NWiE+bSs(&kvP;+h;JG{J-LyP!S(vsp8rx*?YvEy zA}>vNc=|7f$kQ%Z3gSr?7nvq&0wym56e`4pRdtSx`+5`KmPcd18ig8NET<{g#;#Ct58$X7pp3qOy2Jv9+y+e0n+A?&8;+-2QCj=@ zkVU2c?0^5v^uu?~9EILO;Oqt@Z3q4%S@P}qQMA)~0Y}H@uA4rc_Ee-0XtpK^l<5y% z) zn2PYg$U_&JN*VSymxcqS9k_5L$aM?IWnt6ny#dZ>F9QEQiN8nqO4}*~hF>e)=If@2 zd|sZ}ctjS3OA4cfnp&q6QiAKH)@-$Sa(4w~g3*0!*zA|0joZk65vk3Y1mZrhHYx%$ z|Kp24`|LM0`$m(3za!K@zq^G4A4&D2BRTHT7W^J-+6}2XVS8z~zp zKIh;XV`X}7PN0BR1QPe0E9&*&Mc(rC@RcRX9`3_cL-6H`ZP<`kwuIS&-dx)4bxN~? zQZEb`5dqR)DMThFshGgp5w@*P<6_EcODIi&frWQdmw-Q2)6!NSuMB=#cpS<xFxgKUqEHDW5hV+pC)ShpT;2iL_m-Zlu!<>_FLWk7fe3Kip&TAVYVZ1iahp zux#-msFZhl?i24hrQ2(6Qe;CBx#K0!K2+}WDYu}xfcr?n={#4mx~LHmO{a|0lH!Mhm3x3B9S^^NglHn>Xtyo^ zx?|f`V}g1YQ>>GnDe+q)csD$zl4t*!bKw3jMKw#W+#Qa+#e_Rs(EM0!`}&QFC5qP7 z_O4JN^}1H=>|{>V`jBI`9JM*vxk&!Rn6ZbDi_P-zkL%_lW(C`P8Y^@* zobDFqQFoQ5CWkTOY_5JwlZ9TthCKa~FZX(`RDYx2!^8>SlEjZ;lJkAx4==}MxtT2* z8j{WrS#+tC6_`F~kgk~O`-U(yd zhY%lr=(ymo!dGY5ZGbltns+wH;nS3&wo7klj~(otZY$AYVm!ptcIc&4JKeH{K|+)= z)3YD~76a-`R9R~M)W(Hf&q(Rr;3fl=mR!8}m>~OiwNT%)#K|Mv>HBfV%N_v_R zoPfsD*Mk#$Z-3x(ZX?rm(mg3&t11qnkSqKSi0jB6_9=Qv&hp`YYb*+`4f{Xo5}Ch! zdT{t<~!@~cLx{jx?dxx^`ZG1j#)GkNiZ;ceV1 zWT|p&acZmqOiGT8Ky#ndzi^Cv+3&U($L>z{t>zrhGZG<7(k+jt0;+W2aUP{}>zNiduPZt}l6jD3qBvk@6JXoHwvx^KpN7Pz& z?X;RcC{v(+DRtM%{t!@j*RxGK!9fSPHCf^Yi+Ltp1{_0cp*Ic67E?~MsmljoAs6*b zBFav)oUl_O)AwDPE2B@b#qYM=$*M3h)I21f{$2nUwt`V5`CPciH#pgISlR5Rs+4uF z9#K4xX6X;^c_oSTTno=vtQHeb-~rz+6EUPYLc%mW2~7RuH?z^pN9$w0 zug#d_1ujID+PJO1yII@ndL8I6$sJR*ELeXb&&{}YD=?dE!atX?^WPF!_(k$P(G%=PhCtbj3en(OfL zpW-VL2@;Pav}sRZLC#<9Qa#-WK3w-JS!Ba4d;f57C1a}Ik4|P0Z+5AE%g`mpzw*f* zm-Jc8_2o=-J=YXByAA0zRB#Ous>m(56_FVq=bRNf`@av?TeaKCGd0y0H17rooZj4A(Oc8$>5R4^INI+LoqcZV$AS z-wnBiQ{J_=tn(@V>3(+KW?qd)9CJ6zbEh*&GniQn3*lGJ#TP$gns~I}aCKDFa4WLY zjuq*KH%0>Pe226>P?(WS zt-NC*{dD|cZM?nwp5_vspt1imHgVRex#oHg!@^j$XH#?y<9J78r8Fy(RC5vvGto0g z*&B~rU6|j?sS0i^qQC_x8eM|Vw!S%j(9TL1PZfS*{K-||<5vujsO~7>=(@K5{4#LZ zEaL9XP)XGfJ-b4_Qctu-$0`pl;irj%fHMm-T#Mu?&4{bIY!R=SE=63L2OgC79E%L1 zWy84eT<8(%opk;mE^aWFWQ~!ddaZ*MQ)g%k=$>BjUB9d?ddKzPgSl7PF#`inGt)YZFEuNF2KA=~I$j_kVo^%w3qp)QnwJ_98_eOMI$M6s^*> zxe4C%4F2zQwem4^BBilxtAXtM4_x7z5o$NDe|4E{$f!iuk%zSqiJZl){T^-9Po(g? z{-Y}g7=ga!4PKze1Y*R{KX+ufA{&D0@k)+|pGcALD$GKmVTo?R$O0GV;Lr`TIH$aN5`J9Xc#!WjYwRF+f2>~=39Q6%hy^#h zEFll~*{|^fAF1b?hvXzv1Khz%wjBK*3?H;+ellm6)8s66R~H9#l*V|%(7-^s{z7j@ zG`HUC`)Gx|udhmQ2`NRiiKp%#iyT)>UQ3i~UeRAqnp$t}#hBHgC-o7W{w4TBQy$S= znBg_2gx@6TEDiPDFj5G#u(GyoAk5;#G3wn=m~B0Ec2N%1`$2lU&Fk>KO;SmX`j3cq z?w8my&VyJr_-2!hRw;&z_XA3*AJxlC9?)!ManPlMd(&w}UEjwS=Ew9UypVY;KlgL6<{GnZ6?Z|1p1oVLJo!ZARlEv5y)njWqvff6A&bF_ig&+gXX4{mUGO^BA?E z&HIgw`<`b57;W?FmoD=MCV;P=Cfq4S41nKox9eCm1^cou1*f0MI|n7bH4F_O?i8ecm8WO zZ~{a)ouv!aFaFPA2m!fWuBEiVR=xN_Mo6vwL|fkklIl zfo)gDmo^+UKDlD;=#9Zyj(@k+tCs$IM!p5$(|XL+d^2akDMhGIhCshp{_>5z^nDs6|-v%51mY#L9NLDLVk_`Tc(=Nm#7(=l&V# z;&gWu-787LurxCPxsA^=f2BGh3`7fQc22O-I|Y0F9X9U*!j5O4YvVDL+9EAD*q^h2o15?0K|YVX5s%53 zI;ycJ>BHUk<8zml8TFeqznjR5lA9g;Hg)}CXrn zdhV5((V_tIr-*ElodGHB1ytnsi52HmiI*E&nDvO#|JtVv-#7`6KK^L9@R9Hz{LA~S z<`FIB1lX;!+}R*(F@*XCN>1^pv07`*=|^Or%X#VDnmxWa=;sI-|fpWzbfuIVux$l}OT(z~pdKpYe<9+x$?do|~y# zB_HP9!$!`9mkUer&%_y)^S!qry(Xiv)0W!3dEc`KiR(=-7z+43a7X5uKs`C|B-`sb zH6Hs6&VF~adEnv8b&A;c{7*^yYi|lLVE?I1Fz_<&XHOZ{-%Q;V!3(oQgs7e{~KVA6Y(5kZaIc4Q?u0sKGJuH9PTLK&%fi(|V-3hFBcX$I1$;nfPm3N>V(gdBb zgEA-fH6yySedud}tg34xm*gmcvE45-a`(qJT2Sts@Xd-bE6;<>DEgNS7sS;d`mPrC zsa+#f4Sp3$E>lho;lNQ^np?{g7t(tXs5^glP|MM(e`&VQjx3oYi?xo#YnCtz0X2zD znumwJP@<;IQL>qdaohm~6I!`hn$18y@6WBHf|32ncB&4&m%qv{J{v<#HNxwvo_PIt zhqN8PNIS8u{pXP~KYL{CIFrwQ{GCJ*m@JTAAXI-_OPK6>FAC_C0EYlc&kA!reMS1e zgKC#iGb3#4&y?-yU-MnQ$VUxV#{%jxf3<5X?p98s*xly(#~ybUjprtJfaG{wO-g%l zcwSqc*F*c;9@XS-?H!A40}>Pki>x zoX8>lax1^W(tFAHkK#1#4%6|ejDB{qXM;#+qV6i|Vfj~p$y;7_Md3ih$pkj_epQD= zf?LD>Vs^!j$Em}YJC(bMO|?4dJ;iRaKRg!U13=q?oaZGOK4HdH4ub?qm>RQI`#6u7mf2;Bf`I;=Ho?)H zbKkY~6f{u??)|T{G6Ah`;8!eSN#4RiEf1&$R7lJX@2U5q!cZ{6F*iNPF6C!bnv(97 z1z)@L>I*DFc8!S}VDXTk{?KQA?NaY!)Qr9Hd<(YlKbbe<{`CS-xDz4Eghm6=J5`Yy zhLJUdENvef#d}bnjolW|4*rF#*IaOK8`DaCK1wB3ygd(BC)IIM?pYpfO+u8QHrSC@ zFO;_JmvngqULV9fNS@8Eap0CUFUsF|Fig-toFMckX1RHHa<=7fQD*a(@AHDDr0;Iy z4cX-mr&R(&Q(9%;KNHbqpIZ675tF-{zw0Dav>6XabCcU{CFT%!AJ+u#$e5GjkK3|m(~itn25M4wBK%pgYBdT0Mc&bd>6%medGty3RndUg#K*A zSuWfa9BVz4RW-a5fR_(^0zugR+fdn<3u0?g#s9cOa+h z!kF?t-*q6f$i_%Mm^~vK5CW1acp=IIT%?0ft8a5-IaWe5!`Ki|Xy#hWBdm_G;Wk$Y z!JSpvL0y+mS{a5Ky&vot&FE<18s!@A(xs5~#Wa~dcO}~SJ!#_#4=noH3eW)Fwy59q zxR@?jZ<{w`Z{HUb4q6Ky;A*_ov~&W5ok^1h{Y|J2Nb;0-X&ol7usnJGWacfB8o+H$ zhRBlBLzwMTwD{`DP>Ra$UDtxaqe6mYd*)uF+DgW!osEs+1GwsWg|Mwjw-dURzGmB> zb0$CH*V&69B0<{5p2o=lwPuwo8#L|)ab5AA=DF5eW0@#wy+_9-0p67}bA)Wd(g#x{Z+f0%j?g|X-Xe6CEjze*CA+!z*^3$Dm8 zI3*V}=IiNTsI_ZbzcodGwizpeM6eanGWfd1b-<=Ll>NeQZ&dTEVWZ=pi85*j&4qZ( z)yf}h_{Znf66Tz)>774naN=pHzG4;`Ei+zE(ATEaAFrv zIDi&CW2QD%(`XVTJ?fx2+9*`v7|s~a!>oF5PZN%t>N3!ay}Py=iT!Hep3&HD(cS3V zu!H3I`5}kb$xOkqYP+vD&`8hi-XMODT5O*xCOgnqtTxH*d)Y%(+%`8mH0FMcXYPkI z^Hr`#o1!e#HM-7N$4({1@Sa=6`oO?zmKz~Px9T2{&)4)P%J@Ag_uRV0^Y^h?FuzF5 z4Xk+?%J*je@B-X-vlH!uFO8qx9@JdCwXwbPWm|Lar#tnzRAo7(aM5AP!Qh^_Ldt^g z5Lfz$`D;%hduF@PB-XlnBv-!(bW5@}N2B2NcG-y!d4lr~G0{%*2g--~6rZ6L^Tb%* zFnnx|nY1z^b>oG}_V$TH`Aj?0zJ96>N(a)2jbUK{yDRSls&5W&Q#e78TOTF=?nJhT zKe{Z1-%Bi(-_zsg%y-xXD)fSnl9j_cb_%r>X?%!nN~vb#QLp*rD*+G6g`(Ut7`TKSd_ zQ2M``lhyUVh$garZA(o{wYbx{u_J1|9{^hAtQCJ}H6GiTFv{{3>}nY(JKPv+M%BMe zifxgAOTK>-cx7p|^w?4XUc2<+WzAY+L1&txC?slM%D9fds^Ecse_SKa6=*a%I6Or+ zf^)t;lIv5OUYUd*0M9n9K*Sl@KPdi-lY<#(3#)i!CvBR6EMm-y0{Y5d2U_(!Pd0;D z>D~-beFIWp1=&Yo%?zV@JA!GBFXu8F1GSSw4#hlg_*r-w+j~Gs=tPm=fIW%bnVng; z1Aa_Cs!BoD+$U)Sy2u+rdl)~WLYAktN71jVDkLN}_WUfYJCWR}P)5R2L=WR_NOH>; z7Pta5Rv#=hjZICkgoBTNhzUoS6v#2DD&WjdAI48FE+lme|1T_PSn<7x&Vo^R}=4aiv-H%yhqhT3<>AeNy=DQ8_2?a z*=_nhWhd=wjY8Al@O5`M?vZr{;8r>9=aWYz4U>4|0H~HO{c)tmfIEV7qV>`!aqpy% zHQ#WSs3q^!YVwS2)r`gt&YYPXdeWq#c4&iMVg@%JBsPsJcMd74nYs7t+sjV1=l*d2 zF8O52;*~#1F(*+pkcA^^a9QZn7H&t9pE--&Jx?mI0%xpZf`KPr~%yeOx zwbK&dg;u1`8u$2F*5JZ^k+m@`((N1z=|%w?P)YX_n`(de&|a(<4((MV(@x6FS?y~i z#^NO}#bt{sGs%2m`?m49{gcHnT#J=>Qc*hGavWz3Nfxy|bz+Zi)Nh{zRtk|DWm1Wl=lc6H=L!DB2k_0b311~BAluB@WZ!&&88OrNRt zs2}Gs){MOE;UPns&H?#;4xG$~a9la-KeaeA!m1o0XEFch)jTJ`^d;_l&ctkH;_0j~ zyuHb#eTg>WHH3moet27gFB6c+VMfpqlo5+>6@x?2WF&whs6IY2H`TLwDe_JIG0; z{C@_2crpLuHyFvjknMi`rtC8ZGvVwXcT#fcj=ZH24Is^LCv36eBJzQFHX z0eHhTFlUkxDV?$1_ad&>8vU_u%Xh6WGdm+C+y zxyWx%_?;OmM6?BH-v1j zx0=3tQoD7Z)2sV4jyLN2I$=QRL9@1J2m4&W_w%@qMwbT)wSGEilrecg5a@ z&C7mUB1TPo`BC+=eHh(>Tu(V^rLq*}h&q`5XEZ6%CSq6_e&r=qv_yh`y@X?P4A zyN9a3i6T{$5#jb0YuN9axpRAeJ9;IVzhC;14DptY6Zs_yN6(C-$`6#!)O`$mZ)gWS z7iC9+4!TXgs5~B3&jr$J?1c6VY8D z>je=Mi?0afDW?ctx#+j~vGH##`FbsS!ubFk@@o@2)t0PlaR^;3^kcia zWYcywI@Jb4ZPf^NaEVc?NuF4Ck2H54H=Lh_lD^bmDRIJr7G725X5P%P?9;hlk+*X#_kH$4_3|%%IpXM>l>V5eRsF4JIh@C(O}*iLGCd+9 zGVrXOTW+kA_2oxYCNaFEis#7Vm1hRby?lSH6n4dOMACl`z~!DEEhErd#`>X7*G*`d zEfc&-_bMc%-BFuq7g-SwTmo9zDX-$W#gl8dO*0Ha^+F+Y&)ViaSb)&C?W0xK>Wk$} z-XR6kCQ`sw4NAISuJ~!~142GnT(mB-V$ddEj2kAXa16v0fOS@I9zR+NZXWlAnjZIJ ziTsn24&7Oc?Z~1jXr?IELTf5u(>^DrL2|x8UR>BBV?oK~P&>Jsub*>8d@#t0tw0`t zn^Pl3f|KmNoXfEIDlt>oN6QrBvaKMW`}ro3wPpBP6G7D%TOWa!7FKk4iq zCu%4=8>af7|61w=G~G_ZJwpwbl#TwQeBMw`KgCp^%b-Bm5l0J%qf!Uc5=>vf`ec3b zYQ%i0)%5TB*g;DPK)Zc*o4volsE}ev_(iU+cn8+JlwD~YKoiWpsA91{Bo{z+&5&vI z7O^k!u^Oi@^WmM*dvcs2(mgK<{bBEGoX7bNlc%f%-FXt2 zor9u#-`NtJl^LRHO_>V;8GL5b;qiKN)r&HaTmA9Wd^1!T(AFXGtyqrEzuN^QDgd7zUKtx5WWYiYyr)_!7W_a*; zu%O#~;!S<&;)`&?QbBt%Dbm()NhmV`hsGkRABrSnl&#R7?S7>ml(v?T7i8|-d#qZ& zW}WA0oE?qO2Ls6um#cufteQgRzR_^n0K`s<-g+=+lu@&CCGX|w^t`u2b#?9mEH47w z^_qH!y>W>SKkwg;IA6gfyLl%oqXN`E`i!eJ>b$Uy-Dkbfv$CV+w8gN;_9Gel?kM$L zX`--Z!vlfwxn6e8ncNHBuger+W46B|Y%fxhy9J3}mg$c>)F3YjRek1pkZg`3|9-KX= zx$3aov8I8Xz4^sjD|V;g@JqPSB?;>gl3lj#+utp!7eb|94r-E28+J20EksJe%8OCB zpOL{c7`gC{#&FKzD|xQ{MD>bZIxinE1{6`jO^l3Vix5IyGaU+A0kGi!cgz z{>VRRAtgoFON_+CN+z~V-D-lQ0Qs*_7RA?NDbcDz6m;(Cmf3v@;QdR@o9t`TjoFsc z-gOF@D()E?8P7|CnEkRBLSup6AE}`l*Hr^Z!_{o7 ze+WY_v?l6gh(6!0Opq@Hmn@it3lHl8?#L{S}@vXkeBhTe|w>8YUtMV@8MTo z!;b$DcTSAZ-khEkVf2fHfL{#3J?gD@-u7wNx?xJHT_VF~iQL=2Ca`6J@io$m*^NC67EOHL20 z2kJj=m(HT1#bwbFH`w|hPtO9-&i($1>8yNoiz|#tfDOg&9ctq>9S6F6@5Dw);%H#e%%z6*eLLU5%ih z!W50s%ZC=$3JY*Tjhl3ri7E;cr1rqRQx0+jRrlKoi4t@}@=F*>ydODnf5-DIyp}*= z2#RoM-$PG*SJU=bI19jviKl|XioY6>vP0Rt@jj1TQ&8Os9r-KV=w9^d$W6e|*a?-C zSE>Oc6rmc_XNA{ND<^m3(6!vDbf5QdvIfdIL5|*46Y?Riu79{^k1Y8#74^I;R>Xmm z$Hgsx%AJ!D31E^XZ8*zv>Yt>hj%iYcUhaW19kwq^xn?cGI{`amW~o@2gDpyfvGK{T`{}rf~gsd)zlik!7j-ub6}9Q5N03 z#bwvu+&kFH4$wG(nUy~T7I{#Xu)c!8(eHa^O=Cg-$NI88VSVimyP6F{|MT!<_xz{{ z4C^uVp8hz2uJ>l7{XMo(!htQA(g3(YE|&m$yY#ldZ?xx$->5mr-jV%Q@sU7hh_uRL4$VSoNCT0$fCp@Wo6Two6eWS+nGwU|||{um;EucFF}4Nh+3S?dtPH_%(Pb#iF$2Hy>C58K(X z9#`AAfq)?0G|S25-bHlJ&&>87YCkZ56ikRJBatMgp~UvQDyxhKY_WS=7ko!VvSDTQ z0sO8mMmM6h`{x3ww$Q`=n=7DYPe+i#ega_Oi+0rMrw*QF*K{vGk5F@a$)ZjiaB%Fu z98nr;G&#)zLNeXPb0d_)1}m0!tYEt*%o?4gEwHh}5C9Ya^pqZ$ zs_zy86qdrH)%W|zYQU`%GvgXJPbN_wF2=}!F$H|V_S7Cb3x7z^=KZs%bKkY9i{k04 zrwyfh4;mH(U3YZD++t<Ttu>)4mCRV4t8_yWj?$%rzincjnI#qbCPoKVad$_Xr zb9KWKPo-{WInfK`pJw;C23_J=)f8Hp5HTQ>s%rWP}CN)YEx3HHnoYJ*rWCyA+d=W1YfWBbzR@jKag8~ zxZlqG+|N0W^DGveO&IoqU2}@h~!#|_m-z2e2V{V)K10DTslzzb~>{N``*mAsAG~+zMPCzTIbSR zpKBbEXlwE~e_^Y=VR{DuZUzaB$5wFu^QE4U&9g;*!c(CUa6yK7&xzaFxDh7`Mfk;@ z{TDsrYyBDT`3C8$ry*)JcZ*-7P-m9TgTmWF5`am-niiiK_9)%(L&vV`vlm9-4>gXL z;&7v}_`~{CEcWg{(YT4bM~UGpeo#V221Da^*{B3dxP<8BlVbdE^(T6tntZECW{Ioh ztwPI6PQn?MOdW0v;U$H?^`#hL-k->%a;M8hgDu)pU;JfuWx9+6snBhDW`}1z8A?P4b#`#Fsw>gg`S+c4W)*a z9?27gUBd}IGmcEI2$=&0vn0MujMDKFAZ3sA3=UK%i$uP;fGYvshOyV37}c`F&qGIj z@Du7zRtFWnePRnkqjd_O)g1T>Soha)Irl?sNJIz(A~lUqwv7iEkBT1il1sChMsy#6p2M0w`!8WnghK(7oB-ZM1C+=WEP6o$MY{=XxGZ+(B(+DV)S`xt$K6P!om&;!qtGhDU2Mb7PqsvB3tRUn2sm|m4vzXq&x7lVZ zr!S;mVJjSBRJh!H7mFp%%<0G4C?#&o4nt#@+PfSbA$AU$fc4XEWB>PQTn{b?YOgfS zw>5oYj`0AWt<64~WhBRR2R>V;ly$O5NBrZS?$cdWcZjW}?~`22VG_Hr3hrg0IQa>^uZkD@h>03&tkd4smQ$k4 z9Q}WTcBZ|OtY<3Wk7QidXY>$Gxl}c5{WwgmToZIKa`9{W7h{fiEYGr(+p~r1sb}sc zOh)Q=9_jwynW_}*><@9EapuUkOh%FpresP??Z#_%qN^1#aXCG zW!*uG1=VHqUO->9Eno5n zxd0q(8{`kyJo}mLoRiQzV(EPpVrM6~g4bPYKH55#-I2__o3SZzZb^YG=sVz8k|C{T zSzhP(XY5*HeqL*;I+cmJYDG{ToI@VMaM;5KBV-` zrm!4FA&Bh19X??MU4yzq!o6=hp~y@)lg#nuO{Ic^q9XFNck?tK1NX|p2ruM>#}r<~ z$PWug0vlFn12-YeyIWcDI1MkB%$uyja}7DlG5e-?e!6t27;Jim0Jg*HTs1a;DfK;; z;eq=rR@wHNS=Kzt9-CGli(yWi9u{=P*Rr$2L_nGdE!c8^(?D-SI32e!{#j3SX1uf$ zKWj&6Kfu*2*Ve?P`({O-x7`4!IRvl1eW#hWO^P!){e^;$wKiP;I_o&~&U zIO9rikehw3MD~Nz3?4yAJ|#WVW7*SACWH8`p%tvGn}DdI&wFa|T8ZmN<0q=AHN!}= zgOJXZyFxqHZb7lN-0*pteRo2_a!D{ z+gY#0YT_q{9*V5md`(b)3B8M+j8rFzO>{FnV4Bzy^6jF{bJiYg2Cmhekmxm5$kMh} z`l)F_e4Ik{+PIATJ07|rpHrKf=@e#jH2A~7L;Q9bD-htoRsax%F|o5kW#^g(=-#b=Jm!LLy|y9!E32n^qJ?e znY(GNxaxLDm9BPOfB5OjgcG9V1dhl3Z zx(bYMd2%4d$g&AR%v=|BeelBuGQa{~471Cf{~3NN9NrRN@FE0o{H2?Cz60H zb^M`k;w@HN7C4Iir7MEkPF*FS!gfH657ts`sMc>@$G}Ds1ZrPk&lI?Kv9>`p$M@HZ%>a_5KhJ0_IXGw# z4Bbr-jfbw-?<;-vfQ;_KDI`$uiXjfTSye(# zrrr#sb-8tjrDmcQ=XQ1Ec^wiP(35jJ>jR1<{=}cT1NGej2DV0bh!hDK@q=qYyX`V* z7ZP8jaoI!47i-^go#$SYH9dLY6DS!=e36dWxJhj1j2rre3sG!=8g3v_xj^qd3AY+n z&JDlezcwpjg=@l}Pi!b)F03ZB(%RUyD;{@3vrBWn+iTn|b7CU3*i?@s>!DCZjOO;~ z$1kFPebQ-N@jrc4jl~zL>j(X6$}KS-#k0<|Ks*{WY(!clxqXL7e*cAd5?65C^##>* zTG}k!2GrVFtQX3unmW>&oUPybv=_cR2z&UTa)2oP+U@03z@IN1T1)~+lfi%r`id^% zg(@!6jF)E!88OLEr?7WwdKJAhcAU7WMS{X*@TcW%6`^3RzbCIl@X};~ z`0rx?89s8yXLIn~CJ76tw$i5r~*$uzn>^^S_gCu=Ms|1v~MFFO<>Ax*m!BU-GlF(%I5ezfRd&K)i}mBvT~mkh4aCKr)F$}CXz79gOoS;X}%+l=0N5N;mPk++voO<_Bv&v;ioeFSYZzaU6E zP=;0DbzxXB#BHBMin+<;_77RLOLy}1--}H3{yd549&DK1EHzxoV0s$xBp6(&8cP8F zB-D#acN{+>$gL^ZrYq(d64@={3fT58_uQnV*N+%%M>5jW0gt^S7OJd<^?7B|lWVi1 zh8#DBb4srU0?^@Xu_)sosQpCF4zGLoEzOK6P+> z+8Uu}**ptEUGxUW-+c3#*wqEX!_SOgfL^Y9PsSyxiJ$s+i{92|HmCKy0vTqOY;%Yd zGg9Pl1k>{du|a&^fA_pdA7Hmyk*fI#Hd)`1-tYuTR4|eV{;2+RxbTH_&PJQ?nE(2* zP*q7dX;=C=?w?LomqCH>6O)=If#8Evo%-0^mI*Dj=6|*WYa7`>v%?`&4>g%QTe6I% zJEI8ZvGDB;@RRk3@HyKq>L#@bPfO3P`De|b#_X^Z&|rLo%HNA0xBu{GLJ~{|j^9t8 z*0)Lz)aj-O?z?r{ZIwwBM}oBLeq||6Z#}>R7se`nV6qY#YLFSMtfI`7TWVIisj*`@ zd^o=xdlrIzT6ze-qI}=#l0f65`6#S_(7Y0q6fCi9dH%uf=2b&mj6OJ!@urtxSy+QE z4GK*NHADVo4YCaxosFmx2$MdJ&|L8A82jmWKHN3l1^_I2UTzIk&O_iSeCMZa^0GK7k6qV^%l$KgR%@W_c3NmjxFTLzonus z6=|0V=-2{ehp{zQeNG`QTrqfXMJ_=qj&ea@sa|v)eFx|%4@*`mzRU9NhZHbK+;y>T zD})TqV83y(Xv}E}p(a~Oxwd*S&<4}j&Wfp$RV)??mnElq<8<^IM;L(HVF)d1-N5bl zSXiutILxnVZGx%vtd!tyc8k3+JU65J^@pkSvB_X%4HNSS%qLNfDg&mUQvapzs(8+x zcr9d2lhNXda{tcQv1X9iviG%zT!pNqjIqm9?e6SaQ&hA8UqC)F=WqVTm;RtBelPxu zU7rG^pS0S)IhX0t;~NrOG6j2N3b8^n(!`0!;I`?(`yUVcc$^ z-p?xeIP7^6c30>oX1Ub96*qSMD3Hp%j5(SdyrW?j13Y-CF;pzZ4`#I-CX}c!X#HJi z)^cC!?wz{$kGXrlBS^%mc#O_MeRAZS=KT5KYF$Qp60s?VVQrJh$IR^r4y3V*Q;f!A z699GDh=cOL4(AKaSdQ`E-S{oflO@P9K;>7@U?2pDn5?p2c-dZH?+bGqZQILZ)>=l_ zI=N?8^bz{iHcW zy?yzd@ngs3c~{eDcjpJWG^5^13&jtM_V`;}*GjU76#6GC0|kfKhz`~RD-tU#`W2Xh zANw@UZ#53iCK;QA^=*v7)T(;b5UH7#5_Hmblj~4~OOE1#3u$IR4(CW%@1a^L1y@iq z0w7JNf}@N+m-K0r8x1;r@zF8qB5XlCMtHQ{mM@ww3>d)fbv#q3i4ZW=)p7KmBDIeF z{L3sh>5mUK|2|X2e-`20?%Uy6k+_}WU)TS?8?nCmJ^*}pb8)}Hmvoyv&PQ{Jk<6IT zkK=1!`^nowK$57e7Z`XVkanqMOXC<|n+^&BWXW4H!9SET=fvE7FTS;<{%lYvoRQNV zKjY!Lkh6!%PG>{fxkXYV!GSCX*D-C5R3J9jDf=9ZBJWR4qzGAS`9Zbrd8 zcThy-FrI@n>gLG`=SXmQ#ic$TAVc60vdFY?M-zVpk|p61m(9j}W@7U)iCNZ&dg}7) z_LQMXqA8qwAj7rRmZ#p(euRqr7`MO^5%B9Y-QFKor;yAnySm-599>!Q;s7i9VRra2 z)JwZmy1VIpz3-Dy06U2@g(%~&(9BH&*O&@mz$2qw#0H^cb^aq z6D%6m!TvtaJdi>$t;TD3kBNu8z8$cuYN1xoa$wh~QP27^*-%8i@*poE4}hA8k(p)` ztqr4WbET%ulCbEiXcoMIZV)w9Sbfodl0fWeW%a-@AV#==4l`iGa`@|gX?3y85Yt7M z_uH$L=2nOVgXqjy1PAOJZ|%=}@P16;lBdAj&rVf;aP<+?t^4K_`Fkb8>?#wy^Sqmj zamV$&nE*mgZrDwX1fa|(`fiz+zv3lCl)-Ff?W*SuHlOYw^qI!XFKa|{IJOOBg(WFw z-IUP(l0t3`JR&{~s0}()E|0G^wCpRw*mX||^fndWs{==5;FpN3(ppH+Tx5JM!wfWG z)Of2n^cW%!DI_DJED*RCAA%j^rmH}{xW8Ln$SYJeA7bD?G+maQ`p{(-{h1fR@bA6Y z&_nHgwO7w)dqC~T$}lkLFlX$;K2HZ!^u{daYowH{$(SHIqTP0Vt^AH+8;M3B3Zfxr z?NxO#RQ$%3TH%c}s47&oV6@YWYujQs$0u4ooT-E+TjA$q%NBPkeK6#Et;=RFwUHS5 znBjinH^?s+w5L&n34x&hh^5SGkjH{>2M5|FVhH@Y!%^$F?BJtIk+h4F-iLBT^ID5K zvDpF%_fE1vjG#d8i1h&P((e~L)s!-Rr87f|Kd1vX#IIOZqGV9+wT8Bqf80}K$aZxW zBAO9dM!MI2y8eM4jaLr6lAlJ(EnSv8JNUKoS*{Grzq09zI}Nxqb=*(bp{B=LQzc%; zMotPqAWf5F27qfM5kPx6)@D#H4)EzU;vxqAO`V>*Bame>_gx+a?pF?;($Wm1EOJ4d znPQ>x!Th^3b|)0%zo)CsPT3CBX?IipfV#tYN9qMGmnzQvKVM07EO>W5lDkzE-VETE z?VR@ywlxjl;n^*ffBTM{%wj^!cl#lmBD!Tt2SMoz>I#G4(++7e*a30=?b(2zMaOjN z4M$r^CfI*?wy20OtS6{X7nA2jY?d75wbZnE6O(rgPj^S^%FcW>MO+kx-7vx(AxXhj zX(}vogz{t+d>nV>)zr}kK@^ob8LT@M~^NvNx zDAhpRtnTid+zji8St8`^OEyae+Q6CP5SmM_`Y1ifq;IhEuHIVG!$7@RZ!_3qIf2_% zD6&}M9q7Lope#SNcy{Jh%Wj_~^W92x!}E67zdj!hB($h`T5fUt$kR^!?AB@pV+_NGhOG_uY%Vsi;XPvi8SMulF#`7YjCE){QNOp; zRTWYZyHM1E_!NX@hax)g#1p9pdF2e8s0oYJ+fO|ca4YN8n!eZnLvxT$wdJ4(!tU<; zr%0$G@g_uGZ+ zS<3pA2_Q`d6D88Y6&34|LFeb2RbA_IEyd+N=M*(S(`euG{NsHncJ8)+$R(|Cezm#M zd~hJ@`{Izhh%TV8p`>3NhB$LIv5^(uJc8XA3`;Mk2~0iekH)!w$0K=KXvM%!ZmHtw zBX=Elrx668wid@Vcn^%B1`_Ekhd`w@LNrqcHhgQ(IF&!_IdhPaG#iqw`r^Y4my4= zDcajd8hD7ZW{IJ027;K?To3=w2yKM>PG8ibrXIS?&BmwSmTR|ELnkA89t)~k$m?9) zR893$mkKlgCG-sc=wuymI< zJmffgMOkVWrty_SwXnIS0FS?|u!o@t@Bc^)(EIgu_iuPxYKg@k{~xtF)B7nWqL)(P zskz-hwWINU=hq+OiMgK{+IMkQ_vifE1nwJWM;{{rq5}QXRT~#C1@x}W|8(gr(LL-^ zj}mBgB|xZ$fllYVa!STI7kY9JqC(MMssl5%#pppjBt|ZHV>M&nYA`l1QPivR0#$>E zM13zVXL`!U+$7q5yBNN48ph2mESTEuf^K4*P$_#(cb;sbr~)>_b-0r6Q;r)4L>g*r zkt{1M542NnNLjagRTZgr<=c4oR0zR+virTqbX$*P(=}2&Vcgq}J>~Szol8bqIp|Z5 zrmVM_h&3yE;Q?(_VmD0C5Qn@CmD;aI{sJU|NeR~WLcs*L2IWHyRoJ2^c4PJmBJHK- zRFq|oN!H8lW1qJwC#wXc8PqS-t+hU7@2<+c7YgD(K@e*wU3+=SNnUedcFHP3f5ctR zGOb=0wnC_eg>cWiavmP-*;!o#Ah*P^ml4)IsN{1=0sF6%^+y$ySxPU_*nbA#s*kSv z*XjF))Rz|t=w#RWlRmZ4F3k+#5_vAn`*?g9(U`xf9I}#xfuc+aL7^*-d#)SAjor%9 z>MXlepZ%RtK&?luw)b9%qAEqm*Rhsl738mk+bR*{zPt2eK}qpr@fL0KU++j^-c%dt z9JBRV{3_qh3I=!wuEfZIq&4C6_32+i(Nfok9fq*3*mUWy7Z_R6sSA`*{W01*ojdAux5KXliu%c3XS zT}XQXraSefKl^{mDUs^SzF0Rnol`;RL$MJRt{(wZ%_xGIL3c?;R>(*XM$w*+CL7C=-n zzt2z;iCNY}LbF)q0&515o3wM~jyJltyua+_7;vY!lXh{V7H0DFQHXa2T*(Y}+^)EB)3K5Q7#)Cze&nKG;$BPU$+h5Xhtd%5AJu zX``!EW>@8{hfki2z7y*+tL6m>w9=+aP0w36|MWC}HCUhs2Ps+$PXAMUR_?X=VXL<)=du9n@1zfUnX79jErCQUMMXC*NuKheb*Xf-Lh0scJsk~=|4fY0rkB222E!#L{q=lS!y9mr z4UXKYMc+ylQQQ_ZJsfjlxN8$EZMPfF9Hvx1ql|sP0GeQ+lxR@##%*_H9@<{t&3QdaU#IlZ zcNkLHNTu3Z&hxf3T2fb(y3ieW5}S3Thahgi!J6p$qQR^-ou@1&JHE+<9?t(g5rkSdxyo%R~-$=`85o#VGia`|AM8~dWqd(m;! zBovY6i`cPShq+s}aqH#Yti;}Cl|93I|5U4Y6$aEaajSU(aU%^F_*6sxfE zbC9>&Zsz-lwEjQ6kpoothw(n`96OAHMcE23OaX)L*KC`jQxECa#ZwcHFY~#)G?rWS zMtU)L$dMj~M#|qAzYOEfV#>+kNEZ$lx(&~N#xApCnwXMvDW44Q@8cDG6>kA4C+KHFG(rHf-x$g=#*y#q;1OG#`kQ2rq5R_b?a&2K#mh;li zd~7pVe9q@SMCF6>T(&BZrHVn6k$1g||CbH)rHWICIul6raAuW2fwS25VV6GS2}e?|L6)z!(O!biyJw_8S6p`(C zwa)w`7*UZOj(lL=mS(b>e&6M^` zEAVnL_AQPlzv{L_-Ud)o&~6K&doQ&>sD{-0M$TmEx8J9tVIy!FzgbfIk7C04y8<5t z(fCnS6@^bN<)V0F41Zlom~wHQw_U8?Y#C_)HuzcHk8J{@j7O=64P3g5iFFc1T=&HX z{NP9E)M`#RB3BaM)-kX9ht$Kx(&gw0p%Tvfx^El{AmXYUIaV!^6&dD(Sk6X|z^v&y zhcFx0&6r#ddyfKxMctGFQ>{#$h3%Lb&CoKvb&Dpj-AMksBmL%e{g1IcMKo~*wU$5&VhMj5$2Y> z7uwp`F8&0kHv)zC6hgjjvlr%~qwHd|Ir6P0$$lG0;!(25ZO6}Qv&nul`>nutsS?W^ zO#a}D+(`xEOk?eBM;r6fp=MQwj`L+Zk5RT`aLD{W|1MhGDEA?p(Z#BC+AL5;&eL(iaQiImu9rwLYq8sePnsSTblBxpJkjR{vR20Pgl|iEQA89J-s_w0$Qx(B) zy_2V!Ec37%7@tS{W%?vfwM;3Uvl=(KOVXhA!W$iD#britade6&?<$=^MOP)0ogVL9^Fh(+gPHfAkgxg!k9nF!TE~eTd7tFz#gcB9(IcGWlq+ z%UaBNe3E1N$a8|na`#WxG?3?kKc5@K&i1B%@^ht{XKCJ}Kt~^-@+k>iQ#1Av(Arnj zP@sD34|d!ReyuHRX=)gJ$ZRp|8jV^c_&k_E^aB+(M3wWjX`Z{oFPW>9bqVS^vlcDK zgDpZ)`TZ<<)uLNB`R7F`-7fIY3hnPqhsDjZuWnVm6{|dSQ;`StYty7R2DpSZ#4D^g ze;p8R+f8;W3LT6@k+`3fChKo{JG?x8q%31yH>gMu6kZwHewK-`KK||gLZ-pccBs~i z7YD)Xnj1>c-)M6eq45Q4srD8;as2f*B1;7Sylo-S`!YN(TgqRC(WBOkCk${Jv#|C} zJ&8o3_A}|^Kg9ABZTtP1Es(gDDa~a(H0E2TF`N762jMJBO^1J29{wP0Lk*=*&6U#0 zelh}BPics3aNAnlxrYp~4Tsd0!VeXnR9{AvG*rI?&Mr&%U)&fW#z9YZ{ySn|GVb=} z&5(cP4RP+nG`$t0<;$t9EU&t@Uf*z@#gd4U$);-9qh!f+57EtSP9Z+aMqkqE4lUXm zH~E)Z+o$Y4X#u-z{Fz;17*_sYj$cBipKUnb!EN!($_paMGiQ&N77Ros;tIxY`6xTAf4$%`GWCn~CgE``Ngn(2csSeB8= zFpdHIzM2GCXNwnSHk2ou-p)EVO-r63d+tunrUsA=wb{d#vhUATM9q?9GLp3!1!AnF zPD}^_B}V9d>`l?b5lO537dt*D4bSxE%Mvgqme@cFuBbp7jqlgKU@k^d9)|belcaOr zp?GrSL#GGd3N!7#zP`lMgCw%#TCG%0E=h3M0ois>Q-U|}VjA{U8^27>m4Ij@!KcS$ z`|(w%`d~jPS@@MBhH{!e)C;FDGq!?}hNWn@~1kl;wfN@_5r#1ccX%zyRV1NY=Uf)JpCDt<2=B18jYb5Ml~j_4wo_5PM3fJSxiTSoeU2dhN;MRnH1x1p$t{g#;gp0l+Pb-Tj&Fm;llg1^ z+l!h(Mke=$4+xn5H6yiGgeuw%EcwcxALqF@R_}5_hk7{m?ivhr^lZnS$akonHqAkE zRvF&W*J&^BXZ3xtcvf(+6a-XS0Y%eZkg{?v5o$tD!&&c>25@HFoqJT%Tpq_Xf+i}? zlC2nR{!i+wD!h(zo7TlHbZlE!gmRai^&o@++}L8TRNv3Zfk{lJzm{rb!4vYHI27js z9|uV%f9CjSDZ|G9i`miTLV)P}riep@wh{W+F2Jv0b{d!gk`4C@g8MxjoaxVNGj)x( z*y}9-mMfV3b>cnOZPw2&L;p=ELRfqF{`h)Uvz8YW*-dCOCwj5fRrQ|7f|=K3TqbC@ zfwB;6eC=Btz~*vrdgMkFUFZHXb9NHgVrnh-QGXm8bm{Ze1|JeNt+vyVPZbb3 zHq9{pG=~JrvQF~DhFYXjbG>QQt=xhXOv~)3ZrHw+i!$wPpvs=X$XMR_x40t*8S=JE3a`)RLR|$6>|JuyQnzS(HtM5oMX1b{r z)Q#0$r^9xH8H3NwtB3>IwPw7GZl+d8TqL^9EDCx0p8(jMT;`95yYktgb$|JP(TaJU zAgSwZ@3$tDv^l2U1yMYjZ(a{g=}nY42%u>psp)jWOXFtnUxUlXFa#oT2N{0%R0+fOzw?6i-OM-rE$ASeuZ+;M)^`> zcB?Naoly;q_u;xcM5ssGP7s-y$47Y;{njJZR;bQhP6?Aeawnj_Dl%0?OB7_|SVM5K zHTs3LyZJpVM-@V#m*&*!Br^o7=(Lci@XyZit6&NP>ytQ77DUk6t>^t(yD}`=+j;%N z7{JsA<=Ze)6BuS5V#>MX1t>yWfZumk|3*;jGpJ{Vq=Fu8G$UAg+|GQ3M@?gpNybT0t0;OyNu(D6AAe*8VfCBk7Z{=wTnZ;;-eEXM=$h?j!!fWj|@zm!fljQAPlE z8z^kL#W<>b$Db+rz}S}(b>YfI%kI6~V1lhWjX%j-;gHcP`E>_S5qi-w2r1o5^_lK5f!{WMf}dM5 zv1f?)GgVx5BpQI9ZG=1YQef71N678my5wASY_)k~KdtMjOCPNR^6k>y96B|aMX+du zfP;!I`^E$%{1rf2#EZC;OwqI( z-Dc%@P{k!4FVdjA*Oq{4s-c|~RReJTdj!wjvissx8Lhe0FvwyPuJ$wFYLTsA!8$b+ z3Keu+N@Wcx)SPx((*MHfqT5tj=!{Dk(HD|*Y3ezxI_8M$pd5b}Qbyl)Ll ziaAj#3u>Acdh9taT)Kk4^`MW*`X~N0M$tjVM9_Qso6;2@WAB=Sdd;5^nfUW~lR7{? z$D!ni-!C<3QRNV=YB9e0lH9p9o-FvEic%%9yk>;$+Gxt zn+{xa%Zi-13TaGq`}M?Kia=*ZQ_oH0EW(IXXtzS;>*J0$4-|N^!N?bR^>=opaJr5( z9>OOW#WX~eU1SL*I+xEJO=w&*ALmCi;MnWk{>E*0>fs;oiynmWSGLsKZ@14kaL9s0 zOHax&eMEm-l!6pr$(Kgf{xbRcyV~ye*j>(X?)KFbE_p+0vw;wiB6;^|J$L@8Vn%I& z?G&xF@mC5eU;RKzlj>Ve29H}E;Z4?EVkz%+;hF5X6hpU*Vtp?pv|A%DO)u^5 z*Kq=AOeEe2gSR1>OgEFe)2>Up-Ny}s#yVnbys&gap{fE3 zM1obd`etJGIbID`eg201pppHdZZ#@45O_~s+BMMayl<;57Jo7DVkLiY8YjP@wSJG? z1!Z;p>cf;UvJ&0k`z)6KM0D!#?FS~kZtG!uO@6E?KYHe;Dms01D+DXdIi@M*kBw8k zJnNIHJY@3Qe*m2InuB|6ET;5EC<8@bAQ6o>p?=Hi7hPO(x!ZJc|Htm{C>f3J&s$Ph z=oa7w;9ri$$bDBQAYK2ew-6Qflux>GZT%f67tY-uJ@Va;dLVg6$@WXx+f`*=x}N^O z>hFPP@3(+?#`#jwZB+{|1w_jIMx0yOh^(i*OwUc~%3pjtlri%WSR^z1UguyQ?F{y? zw;Ts&F!>5#F>p9t%+jBSCG^0fwNI7(+hLShjJ_AM_{_f+z?mi8C9?5BmN!C}MNl9^ z+d@BSw%nstb^5EQ4Cgm(A|-m#y5laJr}J)pU_@CXp8`4-eTHUu>L+0#HFd9ZXrXoj zov5_--C+4y=Y7hzF(q&Kqfd249X-%2KrIueO$OVE-4W_jw>mezf{}_P0-tuG<=wJY zX&Qs<23@H6J6Y9(2;Pyoof$pZybhBMd)8VJSzEI6ozW~%OA4@k^y#I%{@BWeJTP0x zPW!77Iy%B*-Nw>FPQ3j7d_d6ee5fjH5 zFF>a!OPB8dW;+FZkZGzwufYkU)SU4uO)j8=NW{@@cLfB0&o_t^R+~&g!efNo5)T3RK65Pho7M2A{(<+Hpf-*OtDKC$M!XAEF%LR^_UUHFyriv5LqzuHs;Gji5+b{N2c;<4D@M%!RUf5e*=LEZiLXD#Y0HCxXzSj4z%glilC+g5d1=(TLm z-GI8u=Ng-{zv+eCKgoWyUc64;-=045rw^IVrfsS6E4{n=piAh+BLRj!O?4UNCxAU- zJb>}KWxnWME#=IbtDTGG!}>)=j8*4O>sRRB!eJLtZw`U)A7+3r?h?% znReL7RqF1#m7)vHV&KNsj|IO8tomz#CuuOC+?5@cqvji$D?Q5_N%UdrJjEZH5oOuC z_`S{h6O`$dYo>|N?Wp1kaPHKzL9R#$8^g>oB%baLe&1{{fuR_WKdOIRenu2Ha2RPE zEatWSEC>mZvPa1PG)CmfV++yMWdF-tI9uXjrM&-_leVMoJ%};lQ)*oKwvm?dXu!GM4=My?=B7kWIzzbn`P*sI z_p^2xsc+ttLcOPmJsVpr*|ux-x+JSvusJb|od?}ij0?Lmv4xLW8eN)0RvPd5=^FB$ zB^qW1Y0AXGwP2TOJ*lK0qFdeMtskhxg)$1gvaCZ}Yn%afv26x$YPH>f?`~4en>7=) zivzwIHY9sY&B)FPfl%^kA$lN5B z4xH*hHQ@|A(+=QKtWUZe_BC;simcUf$1ySVK%GOvqC<3N`gk@kjxFxh+V3ucx<%T6 z6WZN(=7QwkxXfpK!KjZZ(}rP8WOC-lJbnvv zY_>vTQ(H`Cz}}njaQ@5yzTvJJnu441P={iG@zy(Xv!PcoHHw@HI3V<(yO%tqLGCh6 z*87H&Hlp^i9LPk)YPd{5&_T)gu={rbr)P=2dHZpzdq6!vkgz4NVkOtu>%9Z-Go(lr zCMr|fF&VkoE$|=$6YxqH_WzJ+-soRs@;hHlxVVEUy?g00V6#CMw|j%3AeSdYqdw(1 zT%W-yCG(*+OtcOCXAB;xr#DJ#$WUGP~@Yi1hpC&@S|xd z;tkp6_)|JKUSiarjr;*xm?hO?{t0@+_wM_oD)!r+n-I~d2+TGYmW9C7D1fcfxuU<& z(Sox;7+rC#%HRG4j2_`7_M?U~^~5mdH*HPhuw%@Khk+<+Ee`YRD|E6 zHfuFH;FF{BAZ6ekHg!2n?T(O2&O4#?hWcGpd!^2LJr`oVp3|K#vzQv~jy98CIOK4_ zXTw2znT~U;-5UY{Rci67a}OHJGAH< zOtHwLIi5p0uxv61Z50UTUt0|qQJngYyB6nm{{x(uMA6nwfQEQHn7Sy=R_q1^wgG_k zP@$vH)W@`jN-w$yBt=alAu*&(MljVia|^k|0Vv(YzQm@tFW-P`%m3x;wO6Ke?riVH zCX+8u!P+Zlx+_g)hMv~OU)=@fiupc;TTP*LcG%ZDJ&k9`7$q1yJX+g54ZC0TGd-GO zD?}qpBV8EWDP)@f-omk=-1Jf35fR{}PZaJh3=`pRsCUEKSH_)Wi^sjU>0&w*d^!OA zOqR|Z6wF^HUK{-mWp1=5C%gY(1ELy(Eh%&69<}5mEeEDeJAE2LpGNa%n*J?PFSiv^ zkvyLApXd~+ve~Tlc0gu%`^Iwd=EOY+Ip8_!3(wZDHm-d!fZ0y}PWQmi$1~Pw`Q3=> z-Z^-$Z&>E}SQ1FZ3TP7o{9$(v9P8I=-R@wBt%5pto*SPZ&n_#9Vf>kGN-c~k_}YdM zFj&PqC0__qAcN+G2cW9+rqyM-M^7#;gFet>h=61ezKWxaLXgde>akBdavqkq6VUsv|&$m9C?IC;W+`sl2Rnnu^)nrT4 z%Cu0Fu>q1dn(K0YCkiMovfHVK`F2aO@oR5O>DY4u$ERllRjp45sN3*grZuB|L0lR+ zOx?Qdw6U^hVl8K-VG;pF4pD8@{OeQveaPk zf-;7`JN;s*^&nLAd_L)1gB&0yvDkd&0A8P5W+yxRubObD#9Nx(yFoGk*9sqLxxerp zMK1q7;WG3&ZJlw8dkDU#$=frt)~`c6$OZ>b+1+H}irn}1EhNT=NlY8Z10458cr|+O za^_5qq82V5YTh-ePBun-#~t1^g^MwY!}veu%D}IVcIZgNDB|@$8V_<1Aj&#zwR<8QDCrwoK@OMEaBjd=g(#Sm1}| z*tfDzVoH-KkBs}MbPwQwH+R?nz7|ZTjKL5$yV}PytY}=CVYF3Jr7C?y5Yo2(pk2#K zTE{l#<1_r6&3MJjZn8Gv-*gi5K|x*|G~JC^{=u*u^gy}Q-65f%!j*=iJVSBBF_0{u zUSy2j1%eu1$IvIGczhEs8reum2;yYLFFj6Pfl+1$NI6_79ImgYhp0bw%pKkxz|_|( z1V0moUj4J=n_PbL<(v4mmei}-i~1H1^WO4XCtETavt%C;-{^|;Q0}7=6x$AH+5B4t z?R{J_UEBFd-_{12Wqo-ojzy-F>ttU#1=7^LB$Mtrar8gOu|f9^;jSC@(>N-i_j90+ zTCUHG3jN$f26}7~^>T;3RQPlo|MBO16e6NRM+PHc`g_t^Bza##qjz=X;*>~&uVDuz zxHmVjUS+=)?Dt9X+0uIu8N92&h1s?SIAX^0&-BLIm;o~L(`l;F{qMLXBRoRkp1 z$ABuy9)A44KaqXO=MQo#nl^sZ&(>?J#D_A9Zpb0K)#99tLG9Yjv$<6h=cV0IZUH_E z>^wJz3xdvke_nWKEqu*#a@?0HiT&2tT8;j}bea!C*A&v88$e`kOr7Diuwf}(7#!xJ zR}y-!s^7zN?~PMcXA@!@r}IJbgIwrAqlc-BXm6&_8su30laSyecW(|)iKc*Z3)%6? znnY+&l=Ei&kL$h{i~^?*XY1Vc6G9}`;y}!x3@zA*2^Sq;|vlmf0I6I1sNv+7sSP9UcSg=LduZx*w7bLhU{r zDHfQK+!S(zh*>J<^Ge%oJD0z?x*(8o{46BdShb3P1G8=i$YC?1Z*`E>0iifS7&i;3e}h>O{A(fKD&;GNn523b#aDxTgp+A3uhQ*l4n#OJ>h zKK2n#{NJs4ExrfgNV%J-u175wQ;db@OMYDZqSG6vJmVDZkm4dU!Vo=l1h7CS9OF)q z+ZJS^sra<(7YiyLLmakSblwFP)gnB08uUA9=>UP^JAgC;_E|@AZHewa)_W z$=}R56av=8*=_j`Ul7qAm>=?d$!3&eofTF%u#q+Ihv8_=8ljfRf`}?$9i)-1BC~1v z)mtfeT4e~`Rl#7DM`*d8u(f6RGx~~^i8ON1IxY_&mb<`uJoX%>pP9k#QQQA{J|~{o zGf`sG%m>hOqG`I|333Ajo|vG2p9rg}>^oc%4qs$LZcv(x>z+_q!A)7)<`R#~T_4sR z(L<%j(SZVo@)A1B{>i>A!*t9358Tqmb-SfiVaZt|mrW-~hqEJih^geVWw9Ak#h7lFSo4q_%o7!O@0XCr)z~#Mifq-KaRZ zPCh1N)Mo&#^^JRXIRB2sh5XaP5@F_T=tMuKGqXaxW?4FTb>=W=_g8xm^G6WuIb5M~`L`0>VA;h7FW&jas zhM_@HK)RbDhMu9jyNB*(fN$>Se%|N%asHft=eqXUYscDao#!%cfzojPGE5k!l>K~h zr<)?)&g_)G5NpJ42^-Paoj!LETvouY@$`IdLo;jgTR zE6!To@fY_r!uO#7>*r93_ME^BWt~G)>P!5HTK!ot(tz{fei>i`-Ji1ykqq(s5@aE+ z3IY!9xQ+Ek$#iWRw2Ifg({E!hw%aEnVvk*Gx9_7f&EJ(a#WTOS|_dSHQ>T11A$J zTQd}@<|B&ZW1iN99onqkdS- z_v=j3+KG;D%*uv{@A)b$LAlJ#4tzzXt2}oP-bin;&mm}0LoY?T-_3?QzIH=OJ88H$IxMd7J(sy{+b-`K^ZtjdRa%J`RWUE;*{c&3 zHpMR%{l12(?;J=-KoV9xAlDhwDBALTtflOLhnj!E@|Ne@8DyBJ>QwKt+nnDc3)8hY z>2dq|;?!$LZz02p@8&7fJBs6qu&;PC2&emUKF~3C2(dGV*}^1i0(nQ;amLfNe5mm! zdz*~KpB-n`C0i2gX?J;f6OJI5O)Pg$l*Bj14~UcZ1#+WRN!M$SiI~{UMcRP+Gwm9kIlKMGg!e zcz3WWBq)Y1-SjPAO~$txG-l2halaIPxE=fH6@{B`Gww{_4NA6bAH*O_H_cG`0{qDt zAROoAb( zOsm({nTavIs?9dB=D>`?eMWm{!KItBA=Avlv!dWZJr|}WwN5+4 z-C;gahLw@#hc<=}vb}FdW72C+@~?ALNu04Fvc4jLRa+FL1*!;Y(CYglW@6RYR>)bJ zw_<&>VOQgF=*)pSxd`Y<#`WC9QSB2JIFs1Zj+2;fa}I5R(Ig%zNMEC|jAbZC zlHL#n+sO$y4;sR9a<21sX+t6~w3Fs3kU=$Djd*OOmx8V26?y-#Z)i@K{baJ>&_x< z7>t1_8LSZ9Nxp0uUu~?q%%#}a*A-gRWw0L2R-3ZsXycgw9UbHhTn_b+1>$73B@YHm zirc@u^roohoe?(a&%TcIF`N+cCe#rCY_DZXU!zP#bm<GQU19SdjP_LLxlPx5*Q5SmEc`sM|YQE@P+_ zuX(21OTiJ;X%?8wp6Nibd*I>Rr4a2ffGaVo`f+=6ndRu(8(}Z>M2Iwsjh1t|HB=)3{Xu(VLj$ZVUa1u;T zV1mtJr5@!*?=4&xPUU~r%j%Fzj2&bYB=Uqlv7;C8GNlAB4Vf;{m|7+cG5$0N)uJjl z881%Ikn37gTQ!g{k%K${Z+|;@wcq#{hG@jC0guo$5Iw3Yai{L;1fBY^bwxIEu99fX; zQE|G_#iow?2UpvvUz~i~_H0$yah0gc0%M~Ad&oWegZ^Ii-Y%p`blY|7bA=QHV!=m3 z@}!wFlQVis%H|mG8o1TexV%}0 zt-zUKy-4lBt<5j$w2FQZ?C!-U^BK3I8GBXln4YQl>Iq=WnKeUx-xK1uVsH3DnK%t8 z+-8ftHUe5_5q;DXp@Z~V<4)y#0hopXA-wK7HYdRMExoJWcwiS{eXUVclGKYmc4u$q zSw~>e{k|gs#8*%lr=?7#Ka;BJB&!J-Zaj~H&>u|*T1?lsW<<23+0s_~%}l=G9l#$| zfSCR9rvSnaw%`Xff0Cze3XusOvZ{`K21_P;9dtGf7n|zxJ$YTA!V7`;7YDY> zO!Ewyj82y1!}*V9Jqng9!y72SAL5NBf=A%zRz-jb5w0n{j#6W5;U?Ni$+Tu@Fy9fWC}*OZ(WRcI z0ZBh1$jmWunUuw0T1^VA9>V&KF7oWDAwrbN*GGaifXnvWzWh-X>sWhlgrwa9V)EyE zqyXU2eB#S()(EPMl#y3!S$c+Jf-wI2=>GOI!NF8Xl>^1ltw1NI={_(q%AE?hNhu~h z)8l#Fc|E-4vXxQTrkiSdpV@GMe^9;FCL@*c?D6&j*tIvvQvyjpVAHWu{rVUYlhS`_ zucO%8G&6$kaMvm+<^df!Gv3JR_D#|H&A5{#6D>mv(s(2Cc{*>l%zCyDW|*hH-+!WE z==p08QZF80`^)vg6iAk5zQF}4Kh?YNxC)I%hbCecA|?wgvf%VvF=yi9J4|vFUBcUv z$EY8TZ_7!KyrG!Ijqzm~kp^)Lqi@o(0UgHh=HQ+LgLF+Ayz`AwuiweQo%9D>hCGE_ zE3WTD*2rN}^m5S97(<iOjQPgj5E3-NC!VpOCTgNq5yym458%w={G6d}bF1XS3Z- z8|5Et?Kx9IJs@E(+~v9OS!e)45&5yxuPTk85-8$g?ni zs5-v2xbsga4PWgwrmCOgB+JLXL(kc6`8*{Xj{1)Et$0kj>rbb^y3NA>2!wHV#v_l1 zxhe977~fw?}vInQ!p@Qyd_U{`ZC~2qHiWgZ)LK;hE8}{%(m@tjto*?tB21b zyB95zj|#@|G*A@@A4=!$?5{3)v!`IsPaDwM>~>>*rB|QA;L0P*frDuEQxpG&#|;AR zLK9|ju4nO=i`t#E`X}KX>V+fYDu2RuuGr_FL$ar?b2?}^AJGMgc1OXBQK z@2`*MV`lr@-d)8)GRY=x@&Kvh1r#(Nql5j); ztWrD868VW7z1D%@*t3<(Dv!bDXS`CBe7)lPrerzX#64S-Skn2B#yHsx(}; zyLFmk2SvlF5>Ucsnnu?&K+VeKq4Fs0%GE00;9Oa4XvjOh7l;}?eqLXi<-pq_3o@A? z!dde4vkR>9f#a7SQpiV`;x--o<`uu4r@E`XJ!^Q9VpgmNaX{*PCMo5W;~<- zmKy(uYxmX-Gq@q^dI>!gEflx?O(UKlv=%($ZTdho(OlH7hd=_kWovEL67{_ToG0;> zW&Fd31%r;YzM*>$xz4%s4^>rO*d#T|`OMRpY^ywn9<#W-^DJnY4orr6uLG$kPQ8@W*F98#wh+q&J}xa-9z zuV(WbVIelFKQ}V=hv#XX3SYvqm*ba@?1fh~fNLf*a8{u>0`jVKwWFt|Jeh(9OWtEG zz&`*t{;-;Rg;>+v!Z4H;6|1}Fy|IF7s%PyJ5Qp+Dg zld@;)m6qNFhBWHR@6cO+yuRAgAEYJOzY4k8eusGe>N0`x<8VO?O>`C;YEUQ7r7u2S z{$M}je0)b~rJZ;@#OR8^`V2w^XJYFK7*z4@S-cuMNP9ojrzVksTo~3My8pBObp_c% z+Jjh#P4qJ@zBzrlFPT>7x%Ve(!)$z$#W*j`g>7xgnoq1x2c0H_<}+Gis-_*G=mpSN zuUFk%ee)-lttR?*Z6blM0hM;_mnW`xE4nzTw9yx)kls>6SSWiRV|>3PAWW?JlHhDg z{8W!;NImZETl&ebGt5lIJu#%b^nueK;qyK`$;DdaBtwxo#rClj-8D}!5)Kgh+LVY` z5waeQ8+-F}LG%%06*Es!aR&8T#x-K}TS=}EAH?liJa2ey5-q`w2^)9Y{(VwV)XPh5 zGzWWasWs-LM`KG?J};Q3>BK}_%=q=-*4E;1fB&bft?O0o)< zmSkGCA-aUfftJo{4_y12Ll;wcr zZF6r1pQ@dFzLd&tyj?*I)5OLvT%gJN#H|XPCZn3^(BHV-PicCz@4q$KFKygiiE@a+ z#61lVlRLG^5tof1CI!f@eb6@y?a{)&_#FXmL80i_D@{#h_D90jn1Qo~`=Zzi&&L;? zamdqDWT3BVmD9UsP2fpzy(k3$URer%6)&X<@?xXjAJu%Zbal|~#3CKax$27~YIEtf z8(QDRT@n}46M6i%F=)io)Q|DL93+F|RO>#xctyEeSUuNeHMhe8IC*c*)t|g|!1N@Y zCrPj5{A-)?goq?f7E3@&^QptmWRfXXBnUEXptyYBMX!*$2};qpDMcx(eLCoSPP0@~ zmSr5@ZA)fW7<{yg_uIh@osutTMF}4^I)*VOU^*(C-d25<%>OO6?jinhrmL4Yp9ALj zV}{hQ*J<-8^Fi}x3nkf0R00F#%ACNruA6(~pqU43ms7#xnt@^tYmuToQpE;tshZo7 zM(j=obQ$2NJxR#Qsr;tfUtsN>VtMEJcdF@CUI7&=o=9}muz&1|M-hW(Voz1v*z5;t z>c69PxiN!`_8k3zEQ*ew(a#|T6O5XXkqN_&fzI@^ad4-P#Ell*PCgRwn6J?C4K1@H zB^w=|xD}lBs3vC>d|k3?i|^nPa*jF&8F28n}^VgCIKfrp)*ILc840KSv(1U`2CqA z-fR=UDVyBK6?n843;?m!vgYdbrccDTv3Agm>?&#QfcoVipPu+IHXXsAJab9S9j(n4 zr)lB+h(p>^wrWiiwAZ7~8Wy>VaOytL+b90QYhio8!A=qr|Ble0gg9xHD~p9oJGZY3 z=xRK#c^%Pp=OXz&p+<`JneAnzrz6>qVN%h*Pi<@%LPI)L-}Y*rWz@`%(<;?e?xe@<8;Nq_%1X5y;2D0G7Ly>^6r`bRLX8wkp{?e8dV^D;B*JJD5n{gdXXSGawt|;T; ziTnDf*?7KFQ?klu4!a=^3K_ZiR+Ob#Rf0eJ&?@-bdis$PV;qc!%;iUBt#lcJvq#)s zV=x3&%?n?B{hEF0InSA2EQ8(UM-9uZ*R!VzwEDp&S#q*ajm)>9gX?m5)%>LGo9+tH zc-%=-eLR$uCHjJGvcYhc8`Ln(m~2poVpKMA*b2*(12@qCWk0nyo(I{74b7n#1;4j- zD3H*5VQKF{5**H5X&)jLi;#+iHxZm|L2P~BDn>8j#SOzK=Vb#~Du3)ZQ@V6?PS)$b zmV4oI^CYl+{l&%Oa3Yq<)jGLGS_ucn;lIzg%G&>K4qZq_<{?Kv9X+V|UIkOoorGsE zmZbS8l5Bkdkx7XqIEZe%ShZg{fPkQOM2k4ueiRq>g%r?S9)_IE=I#M&kSbkh zEjUVVbjS6-lxYiX9QWr;TjOm18l-=h-qFgo{s6VXZwTL0IeO1oKKB6_eU{a%EgODpEo9x zvX#{JYp zd>w530rgRWydK%G*rE^lEk--R4XU`{s(PwT91+v~%{dnO?I2I(07=$(pa9De5-B@R^S7Q8fPm-&@M-U$~ zL3bq!@i`yAE!L8c=UB~FuH=DkNHr4PXWt(16q?e$)v2ibmN>8yAucv-I+QYqqWGME zb7tC5AZ^|^kqe~qHSs-z-g+s80~Gt_<2B#Bs{dXII~gum#$sHGDex0<+^{Kcc6!LU zPk4C*`|_wG0ba~U`@;`Mf-9evmQz-)KZ~EQ;wGX{^^Nn<4^oXja7}j^=vOD!@8?w%XLvO={*k{C>)_Sngl)p3;T<8iAo-vN~&P-JxeW$_MM7`EL@zROK)P+l<4{lwX zo&H#@VuyX>)r2AB#*pZ-4DcZQEb-NL1*zzX(L<@t%&>?Ur$*eOM)4wv{|#X^=_9*O z@T#THDVxxZv*Y_szh$9Zn6OPfh9l$Kl75gFvUGMtt&35~L+Qn|#&%AKflh3bQw>6kd7&HmwDp96Pt5Y_R^(pxSmhW#0 zk-y+6Jn&C7R+prZyLpG0TxQhu>_7Vap=8R%i!n;Wj?wabsJiM>%sI7R(1~3za`a2n zm9f8`zPIfz3wvvI(%?xNR4Q*)VcH~V$K$Pz!Li@3v%B|-^&j5rA95;Wf}u<2C^A7B zbNkZ*bZ|Mw8J0OW=w)X1$y-Xgp^mi0HKC8f2GLtZ8fBj8uEOv<#7dNjamw3aQbXCC z4INTw11(1Uxa}F2sO#aYeg!Mjwu|=*-W>D>!g<)~L0iGR&L^+#%Q5caradzCWy;Rn z{2b_=*^Z-j+WDY+UTlKb*Bx`Uk&nTprK^FVFir;9^&d%vD-9P_((h<)&}aRYQo!2a zm!`=t>LL%m&nP*il^VX(-P!xZkLnqW$e;~-*QiYXTet9FV`DUqITd-^bh=H?8}7S1 zD?<;-peJ(qx6JCV!n@vEvtZcR_rjrJ4IWVb%v@Uj?9%XZD?<;pZCJ4V(yZar!_}HU z^fd20L}kBfE0>fiKlDsC7@HNS6WAFmkC9Y7afy8vZkTuMmZD>e7MfSt`Qmuy8f+6$ z=Pl@buU{N+fO?G3g*b7x+7yjRqmjj`jbZDU8V&}hQJ`ml@f>TrJ|WPZJq%jQkNx|y z$&a7UK+eDB3WbD5vpCWTp=z}s={s1Q+Y^hvW1>95QPFBXbX0ev3rgY)4kmN2Ud=6s zP%bCghgoFcTlHH{jF4`LEz#Wf-kWRHW2hVyv*$4Dsngq6s4}XBdGWzK!1cchNx=+)}g(6f~fHH0F^V=gh!lSK2k-ZzkIbCi6LW_ z7JD>d_w2?>__4R(%^=?VY?k!U*MhaW+8>^$rs*#~i?qI=@iLC7h02s&X_y;S9(b(g z@N5|$4ajfly~WE?i-B@0*(S3(n{)Fn0+~i|0$`I;3-0ODXI4bZlUT6 z`3FyCl@qhqWAl?3_=bt|8CqnewCeC|wn>*yx|_it@LpWLH^q;D!z8SV@&st${R!U0 z^3UERrTog^I(Wil=nF~BU%KCg6ch!?T%a-wdVR{~E?cKHfLjq|Zi`oQ~eOHC|s+(jHr=&hjs#+D)COY)P86UM8sGSMRE zx(rHtRMyB0L!<_y7-7#vu~D|RXFo)5PB5u=_9#An=gv&VD4m(Ad_-;&e*e(jNjR$s z;wV-eD~Nd{LjsdXuopgbJq)ic1y)^t`!@O<)A0u0a6%$#CcJ;Fl3?`-t{&;mbV6UL z3Aa8Q^(;ZUF?o`W5k9*y@H|ix#!P_Ce?>Qf4aJcbVV@cQOF?8YAqZQWAupX!%$Zih z>2%hLEptmELu?uxH);4V;Ke00Tr>qN3kuTgUD*$kJL#_HNz&I36Ha1tGoE>zbfWoI zSG~Mf+R&%7Ciaa?FwZuZJwdO_V1&YV8lqj`I|7K^|iFguN=9+PvZIjE@8bKBx9Oq_{6-g%EpRKYo{V19lWOS+BF|ey_VMwOL() zV%U0&&Y9<{19)@$wEJw9b}eephCj)kQERx`#xT!IT@TLIP?7#n#|ueu>!JpoTpG