From 424f844182c686e9f06fee071fd473d094278b16 Mon Sep 17 00:00:00 2001 From: James Mountain Date: Wed, 9 Sep 2015 16:46:23 +0100 Subject: [PATCH 1/2] Added bower config --- bower.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 bower.json diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..606c2b3 --- /dev/null +++ b/bower.json @@ -0,0 +1,26 @@ +{ + "name": "Seriously.js", + "main": "Seriously.js", + "version": "0.1", + "homepage": "http://seriouslyjs.org/", + "authors": [ + "brian at chirls dot com" + ], + "description": "Seriously.js is a real-time, node-based video compositor for the web. Inspired by professional software such as After Effects and Nuke, Seriously.js renders high-quality video effects, but allows them to be dynamic and interactive.", + "moduleType": [ + "amd" + ], + "keywords": [ + "video", + "compositor", + "webgl" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} From d8ddcad29c5ba49d1de84f8353c1ea42d40aaa05 Mon Sep 17 00:00:00 2001 From: James Mountain Date: Wed, 9 Sep 2015 19:42:12 +0100 Subject: [PATCH 2/2] Added gulp build file to create full and customized bundles of effects. #31 --- .gitignore | 6 +++ README.md | 15 ++++++ build/seriously.min.js | 7 +++ build/seriously.min.js.gz | Bin 0 -> 50963 bytes gulpfile.js | 110 ++++++++++++++++++++++++++++++++++++++ package.json | 45 ++++++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 .gitignore create mode 100755 build/seriously.min.js create mode 100755 build/seriously.min.js.gz create mode 100644 gulpfile.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c0971cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.svn +.DS_Store +__MACOSX +node_modules/ + + diff --git a/README.md b/README.md index bd79a0f..19bd263 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,21 @@ or images that are served from the same domain, unless they are served with [CORS headers](http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/). Firefox, Chrome and Opera support CORS for video, but Safari and Internet Explorer do not, and videos served with CORS are rare. So for now, it is best to host your own video files. +##Building for deployment + +``` +gulp build +``` + +or for custom builds + +``` +gulp build --inc "invert hue-saturation" +gulp build --exc "sketch" +``` + + + ## Contributing Bug fixes, new features, effects and examples are welcome and appreciated. Please follow the [Contributing Guidelines](https://github.com/brianchirls/Seriously.js/wiki/Contributing). diff --git a/build/seriously.min.js b/build/seriously.min.js new file mode 100755 index 0000000..a5433e9 --- /dev/null +++ b/build/seriously.min.js @@ -0,0 +1,7 @@ +!function(e,t){"use strict";"function"==typeof define&&define.amd?define("seriously",function(){var i=t(e);return e.Seriously||(e.Seriously=i),i}):"object"==typeof exports?module.exports=t(e):"function"!=typeof e.Seriously&&(e.Seriously=t(e))}(window,function(e){"use strict";function t(e,t){var i,r;if("string"==typeof e)i=C.querySelector(e);else if(!e)return!1;return e.tagName&&(i=e),i?(r=i.tagName.toLowerCase(),t&&t.indexOf(r)<0?e:i):e}function i(e,t){var r,o;e.prototype&&t.prototype&&e.prototype!==t.prototype&&i(e.prototype,t.prototype);for(r in t)t.hasOwnProperty(r)&&(o=Object.getOwnPropertyDescriptor(t,r),o.get||o.set?Object.defineProperty(e,r,{configurable:!0,enumerable:!0,get:o.get,set:o.set}):e[r]=t[r]);return e}function r(e){var t;if(!E)return O;if("function"==typeof E[e])t=E[e];else{if("function"!=typeof E.log)return O;t=E.log}return t.bind?t.bind(E):function(){t.apply(E,arguments)}}function o(t,i){if(i||(i="HTMLElement"),t instanceof e[i])return!0;if(!t||"object"!=typeof t)return!1;for(;t;)if(t=Object.getPrototypeOf(t),t&&t.constructor.name===i)return!0;return!1}function n(e,t,i,r,o){function n(e,t,i){return i%=1,0>i&&(i+=1),1/6>i?e+(t-e)*i*6:.5>i?t:2/3>i?e+(t-e)*(2/3-i)*6:e}var s,a;return a=.5>i?i*(t+1):i+t-i*t,s=2*i-a,o||(o=[]),o[0]=n(s,a,e+1/3),o[1]=n(s,a,e),o[2]=n(s,a,e-1/3),o[3]=r,o}function s(e){var t,i,r,o="#",n=e[3]<1?4:3;for(t=0;n>t;t++)i=Math.min(255,Math.round(255*e[t]||0)),r=i.toString(16),16>i&&(r="0"+r),o+=r;return o}function a(e){return Array.isArray(e)||e&&e.BYTES_PER_ELEMENT&&"length"in e}function u(t){function i(){B.length&&B.shift()()}if("function"!=typeof t)throw new Error("setTimeoutZero argument is not a function");return B.push(t),"file:"===e.location.protocol?void setTimeout(i,0):void e.postMessage("seriously-timeout-message",e.location)}function l(t,i){var r;try{r=e.WebGLDebugUtils&&i&&i.debugContext?e.WebGLDebugUtils.makeDebugContext(t.getContext("webgl",i)):t.getContext("webgl",i)}catch(o){}if(!r)try{r=t.getContext("experimental-webgl",i)}catch(n){}return r}function f(){var t;return v&&v.getError()===v.CONTEXT_LOST_WEBGL&&(v=void 0),v||!e.WebGLRenderingContext||y?v:(t=C.createElement("canvas"),v=l(t),v?t.addEventListener("webglcontextlost",function i(e){e.preventDefault(),v&&v.canvas===this&&(v=void 0,t.removeEventListener("webglcontextlost",i,!1))},!1):p.logger.warn("Unable to access WebGL."),v)}function c(i){var r,o,n,s;if(r=t(i,["img","canvas","video"]),!r)return!1;if(o=C.createElement("canvas"),!o)return p.logger.warn("Browser does not support canvas or Seriously.js"),!1;if(0===r.naturalWidth&&"IMG"===r.tagName)return p.logger.warn("Image not loaded"),!1;if(0===r.readyState&&0===r.videoWidth&&"VIDEO"===r.tagName)return p.logger.warn("Video not loaded"),!1;if(n=f()){s=n.createTexture(),s||p.logger.error("Test WebGL context has been lost"),n.bindTexture(n.TEXTURE_2D,s);try{n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,r)}catch(a){return a.code===e.DOMException.SECURITY_ERR?p.logger.log("Unable to access cross-domain image"):p.logger.error("Error storing image to texture: "+a.message),n.deleteTexture(s),!1}n.deleteTexture(s)}else{n=o.getContext("2d");try{n.drawImage(r,0,0),n.getImageData(0,0,1,1)}catch(u){return u.code===e.DOMException.SECURITY_ERR?p.logger.log("Unable to access cross-domain image"):p.logger.error("Error drawing image to canvas: "+u.message),!1}}return!0}function d(e){function t(e,t){var i,n;a(e)?(i=e[0],n=e[1]||i):i=e,"string"==typeof i?i=i.toLowerCase():"number"==typeof i?i=String(i):i||(i=""),o[i]=n,t||(r.firstValue=i)}function i(e){return e}var r,o,n;for(n in e.inputs)if(e.inputs.hasOwnProperty(n)){if(e.reserved.indexOf(n)>=0||Object.prototype[n])throw new Error("Reserved input name: "+n);r=e.inputs[n],r.name=n,isNaN(r.min)&&(r.min=-(1/0)),isNaN(r.max)&&(r.max=1/0),isNaN(r.minCount)&&(r.minCount=-(1/0)),isNaN(r.maxCount)&&(r.maxCount=1/0),isNaN(r.step)&&(r.step=0),isNaN(r.mod)&&(r.mod=0),"enum"===r.type&&r.options&&a(r.options)&&r.options.length&&(o={},r.options.forEach(t),r.options=o),"vector"===r.type?r.dimensions<2?r.dimensions=2:r.dimensions>4?r.dimensions=4:!r.dimensions||isNaN(r.dimensions)?r.dimensions=4:r.dimensions=Math.round(r.dimensions):r.dimensions=1,r.shaderDirty=!!r.shaderDirty,"function"!=typeof r.validate&&(r.validate=p.inputValidators[r.type]||i),e.defaultImageInput||"image"!==r.type||(e.defaultImageInput=n)}}function h(e,t,i,r){var o,n,s,a,u=r===!0?r:r&&r.useFloat;u=!1,u?this.type=e.FLOAT:this.type=e.UNSIGNED_BYTE,o=e.createFramebuffer(),e.bindFramebuffer(e.FRAMEBUFFER,o),r&&r.texture?(this.texture=r.texture,e.bindTexture(e.TEXTURE_2D,this.texture),this.ownTexture=!1):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),this.ownTexture=!0);try{this.type===e.FLOAT?(s=new Float32Array(t*i*4),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,i,0,e.RGBA,e.FLOAT,s)):(e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,i,0,e.RGBA,e.UNSIGNED_BYTE,null),this.type=e.UNSIGNED_BYTE)}catch(l){this.type=e.UNSIGNED_BYTE,s=new Uint8Array(t*i*4),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,i,0,e.RGBA,e.UNSIGNED_BYTE,s)}if(n=e.createRenderbuffer(),e.bindRenderbuffer(e.RENDERBUFFER,n),e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_COMPONENT16,t,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.texture,0),a=e.checkFramebufferStatus(e.FRAMEBUFFER),a===e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT)throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_ATTACHMENT");if(a===e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");if(a===e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS)throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_DIMENSIONS");if(a===e.FRAMEBUFFER_UNSUPPORTED)throw new Error("Incomplete framebuffer: FRAMEBUFFER_UNSUPPORTED");if(a!==e.FRAMEBUFFER_COMPLETE)throw new Error("Incomplete framebuffer: "+a);e.bindTexture(e.TEXTURE_2D,null),e.bindRenderbuffer(e.RENDERBUFFER,null),e.bindFramebuffer(e.FRAMEBUFFER,null),this.gl=e,this.frameBuffer=o,this.renderBuffer=n,this.width=t,this.height=i}function m(e,t,i){function r(t,i){var r,o;if(r=i?e.createShader(e.FRAGMENT_SHADER):e.createShader(e.VERTEX_SHADER),e.shaderSource(r,t),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){for(t=t.split(/[\n\r]/),o=0;o1?function(t){e.uniform1iv(i,t)}:function(t){e.uniform1i(i,t)};if(t.type===e.FLOAT)return t.size>1?function(t){e.uniform1fv(i,t)}:function(t){e.uniform1f(i,t)};if(t.type===e.FLOAT_VEC2)return function(t){e.uniform2f(i,t[0],t[1])};if(t.type===e.FLOAT_VEC3)return function(t){e.uniform3f(i,t[0],t[1],t[2])};if(t.type===e.FLOAT_VEC4)return function(t){e.uniform4f(i,t[0],t[1],t[2],t[3])};if(t.type===e.FLOAT_MAT3)return function(t){e.uniformMatrix3fv(i,!1,t)};if(t.type===e.FLOAT_MAT4)return function(t){e.uniformMatrix4fv(i,!1,t)};throw new Error("Unknown shader uniform type: "+t.type)}function n(t){return function(){return e.getUniform(s,t)}}var s,a,u,l,f,c,d,h,m="";if(a=r(t),u=r(i,!0),s=e.createProgram(),e.attachShader(s,a),l=e.getShaderInfoLog(a),l&&(m+="Vertex shader error: "+l+"\n"),e.attachShader(s,u),l=e.getShaderInfoLog(u),l&&(m+="Fragment shader error: "+l+"\n"),e.linkProgram(s),!e.getProgramParameter(s,e.LINK_STATUS))throw m+=e.getProgramInfoLog(s),e.deleteProgram(s),e.deleteShader(a),e.deleteShader(u),d=k.exec(t)||k.exec(i),d&&(m="Shader = "+d[1]+"\n"+m),H.forEach(function(t){m+="\n"+t+": "+e.getParameter(e[t])}),new Error("Could not initialize shader:\n"+m);for(e.useProgram(s),this.uniforms={},c=e.getProgramParameter(s,e.ACTIVE_UNIFORMS),f=0;c>f;++f)h={info:e.getActiveUniform(s,f)},h.name=h.info.name.replace(/\[0\]$/,""),h.loc=e.getUniformLocation(s,h.name),h.set=o(h.info,h.loc),h.get=n(h.loc),this.uniforms[h.name]=h,this[h.name]||(this[h.name]=h);for(this.attributes={},this.location={},c=e.getProgramParameter(s,e.ACTIVE_ATTRIBUTES),f=0;c>f;++f)h={info:e.getActiveAttrib(s,f)},h.name=h.info.name,h.location=e.getAttribLocation(s,h.name),this.attributes[h.name]=h,this.location[h.name]=h.location;this.gl=e,this.program=s,this.destroy=function(){var t;e&&(e.deleteProgram(s),e.deleteShader(a),e.deleteShader(u));for(t in this)this.hasOwnProperty(t)&&delete this[t];s=null,a=null,u=null}}function p(r){function n(e,t){var i,r,o;return t?(i=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,i),t.bufferData(t.ARRAY_BUFFER,e.vertices,t.STATIC_DRAW),i.size=3,r=t.createBuffer(),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,r),t.bufferData(t.ELEMENT_ARRAY_BUFFER,e.indices,t.STATIC_DRAW),o=t.createBuffer(),t.bindBuffer(t.ARRAY_BUFFER,o),t.bufferData(t.ARRAY_BUFFER,e.coords,t.STATIC_DRAW),o.size=2,{vertex:i,index:r,texCoord:o,length:e.indices.length,mode:e.mode||t.TRIANGLES}):!1}function a(e){var t={};return t.vertices=new Float32Array([-1,-1,0,1,-1,0,1,1,0,-1,1,0]),t.indices=new Uint16Array([0,1,2,0,2,3]),t.coords=new Float32Array([0,0,1,0,1,1,0,1]),n(t,e)}function f(e){var t,i;if(!A){if(e.canvas.addEventListener("webglcontextlost",v,!1),e.canvas.addEventListener("webglcontextrestored",c,!1),e.isContextLost())return void p.logger.warn("Unable to attach lost WebGL context. Will try again when context is restored.");for(A=e,B=e.canvas,j=a(A),V=new m(A,"#define SHADER_NAME seriously.base\n"+w,"#define SHADER_NAME seriously.base\n"+T),t=0;tr&&i.push(t))},U.prototype.off=function(e,t){var i,r=-1;e&&"function"==typeof t&&(i=this.listeners[e],i&&(r=i.indexOf(t),r>=0&&i.splice(r,1)))},U.prototype.emit=function(e){var t,i=this.listeners[e];if(i&&i.length)for(t=0;t=0&&oe.splice(e,1),delete ne[this.id],this.isDestroyed=!0},J=function(e){function r(e,i){var r,n,a;return a=c.effect.inputs[e],r=c.inputElements[e],"string"==typeof i&&isNaN(i)&&("enum"===a.type?a.options.hasOwnProperty(i)||(i=t(i,["select"])):"number"===a.type||"boolean"===a.type?i=t(i,["input","select"]):"image"===a.type&&(i=t(i,["canvas","img","video"]))),o(i,"HTMLInputElement")||o(i,"HTMLSelectElement")?(n=i.value,r&&r.element!==i&&(r.element.removeEventListener("change",r.listener,!0),r.element.removeEventListener("input",r.listener,!0),delete c.inputElements[e],r=null),r||(r={element:i,listener:function(e,t){return function(){var r,o;r="checkbox"===i.type?i.checked:t.value,o=c.setInput(e,r),"color"===a.type&&(o=s(o).substr(0,7)),o!==r&&(t.value=o)}}(e,i)},c.inputElements[e]=r,"range"===i.type?(i.addEventListener("input",r.listener,!0),i.addEventListener("change",r.listener,!0)):i.addEventListener("change",r.listener,!0)),r&&"checkbox"===i.type&&(n=i.checked)):(r&&(r.element.removeEventListener("change",r.listener,!0),r.element.removeEventListener("input",r.listener,!0),delete c.inputElements[e]),n=i),c.setInput(e,n),c.inputs[e]}function n(e){return function(t){var i=r(e,t);return i&&i.pub}}function a(e){return function(){var t=c.inputs[e];return t&&t.pub}}function u(e){return function(t){return r(e,t)}}function l(e){return function(){return c.inputs[e]}}var f,c=e;for(f in c.effect.inputs)if(c.effect.inputs.hasOwnProperty(f)){if(void 0!==this[f])throw new Error("Cannot overwrite Seriously."+f);"image"===c.effect.inputs[f].type?Object.defineProperty(this,f,{configurable:!0,enumerable:!0,get:a(f),set:n(f)}):Object.defineProperty(this,f,{configurable:!0,enumerable:!0,get:l(f),set:u(f)})}Object.defineProperties(this,{effect:{enumerable:!0,configurable:!0,get:function(){return c.hook}},title:{enumerable:!0,configurable:!0,get:function(){return c.effect.title||c.hook}},width:{enumerable:!0,configurable:!0,get:function(){return c.width}},height:{enumerable:!0,configurable:!0,get:function(){return c.height}},id:{enumerable:!0,configurable:!0,get:function(){return c.id}}}),this.render=function(){return c.render(),this},this.readPixels=function(e,t,i,r,o){return c.readPixels(e,t,i,r,o)},this.on=function(e,t){c.on(e,t)},this.off=function(e,t){c.off(e,t)},this.inputs=function(e){var t,r,o,n;if(o=c.effect.inputs,e)return(r=o[e])?(t={type:r.type,defaultValue:r.defaultValue,title:r.title||e},"number"===r.type?(t.min=r.min,t.max=r.max,t.step=r.step,t.mod=r.mod):"enum"===r.type?t.options=i({},r.options):"vector"===r.type&&(t.dimensions=r.dimensions),r.description&&(t.description=r.description),t):null;t={};for(n in o)o.hasOwnProperty(n)&&(t[n]=this.inputs(n));return t},this.alias=function(e,t){return c.alias(e,t),this},this.matte=function(e){c.matte(e)},this.destroy=function(){var e,t;c.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(t=Object.getOwnPropertyDescriptor(this,e),t.get||t.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.isDestroyed=function(){return c.isDestroyed},this.isReady=function(){return c.ready}},H=function(e,t){var r,o,n,s,a={};U.call(this,t),this.gl=A,this.effectRef=S[e],this.sources={},this.targets=[],this.inputElements={},this.dirty=!0,this.shaderDirty=!0,this.hook=e,this.options=t,this.transform=null,this.effect=i({},this.effectRef),this.effectRef.definition&&i(this.effect,this.effectRef.definition.call(this,t)),d(this.effect),this.uniforms.transform=x,this.inputs={},s=me[e];for(r in this.effect.inputs)this.effect.inputs.hasOwnProperty(r)&&(o=this.effect.inputs[r],(void 0===o.defaultValue||null===o.defaultValue)&&("number"===o.type?o.defaultValue=Math.min(Math.max(0,o.min),o.max):"color"===o.type?o.defaultValue=[0,0,0,0]:"boolean"===o.type?o.defaultValue=!1:"string"===o.type?o.defaultValue="":"enum"===o.type&&(o.defaultValue=o.firstValue)),n=o.validate.call(this,o.defaultValue,o),s&&void 0!==s[r]&&(n=o.validate.call(this,s[r],o,o.defaultValue,n),s[r]=n,"image"===o.type&&(a[r]=n)),this.inputs[r]=n,o.uniform&&(this.uniforms[o.uniform]=o.defaultValue));A&&(this.initialize(),this.effect.commonShader&&this.buildShader()),this.updateReady(),this.inPlace=this.effect.inPlace,this.pub=new J(this),oe.push(this),ne[this.id]=this,fe.push(this),_[e].push(this);for(r in a)a.hasOwnProperty(r)&&this.setInput(r,a[r])},H.prototype=Object.create(U.prototype),H.prototype.constructor=H,H.prototype.initialize=function(){if(!this.initialized){var e=this;this.baseShader=V,this.shape?this.model=n(this.shape,this.gl):this.model=j,"function"==typeof this.effect.initialize?this.effect.initialize.call(this,function(){e.initFrameBuffer(!0)},A):this.initFrameBuffer(!0),this.frameBuffer&&(this.texture=this.frameBuffer.texture),this.initialized=!0}},H.prototype.resize=function(){var e;for(U.prototype.resize.call(this),this.effect.resize&&this.effect.resize.call(this),e=0;e=0&&this.targets.splice(t,1)},H.prototype.removeSource=function(e){var t,i=e&&e.pub;for(t in this.inputs)!this.inputs.hasOwnProperty(t)||this.inputs[t]!==e&&this.inputs[t]!==i||(this.inputs[t]=null);for(t in this.sources)!this.sources.hasOwnProperty(t)||this.sources[t]!==e&&this.sources[t]!==i||(this.sources[t]=null)},H.prototype.buildShader=function(){function e(e){return k.test(e)?e:"#define SHADER_NAME seriously."+r.hook+"\n"+e}var t,i=this.effect,r=this;this.shaderDirty&&(i.commonShader&&pe[this.hook]?(this.shader||pe[this.hook].count++,this.shader=pe[this.hook].shader):i.shader?(this.shader&&!i.commonShader&&this.shader.destroy(),t=i.shader.call(this,this.inputs,{vertex:w,fragment:T},p.util),t instanceof m?this.shader=t:t&&t.vertex&&t.fragment?this.shader=new m(A,e(t.vertex),e(t.fragment)):this.shader=V,i.commonShader&&(pe[this.hook]={count:1,shader:this.shader})):this.shader=V,this.shaderDirty=!1)},H.prototype.render=function(){function e(e,t,i,r,o,s){y(e,t,i,r,o||n,s)}var t,i,r,o=this.effect,n=this;if(A){if(this.initialized||this.initialize(),this.shaderDirty&&this.buildShader(),this.dirty&&this.ready){for(t in this.sources)!this.sources.hasOwnProperty(t)||o.requires&&!o.requires.call(this,t,this.inputs)||(r="function"==typeof this.inPlace?this.inPlace(t):this.inPlace,this.sources[t].render(!r));this.frameBuffer&&(i=this.frameBuffer.frameBuffer),"function"==typeof o.draw?(o.draw.call(this,this.shader,this.model,this.uniforms,i,e),this.emit("render")):i&&(y(this.shader,this.model,this.uniforms,i,this),this.emit("render")),this.dirty=!1}return this.texture}},H.prototype.setInput=function(e,t){function i(){var t,i=u.sources[e];if(i){for(t in u.sources)if(t!==e&&u.sources.hasOwnProperty(t)&&u.sources[t]===i)return;i.removeTarget(u)}}var r,o,n,s,a,u=this;if(this.effect.inputs.hasOwnProperty(e)){if(r=this.effect.inputs[e],"image"===r.type){if(t){if(t=b(t),t!==this.sources[e]){if(i(),E(t,this))throw new Error("Attempt to make cyclical connection.");this.sources[e]=t,t.addTarget(this)}}else delete this.sources[e],t=!1;o=this.sources[e],n=Object.keys(this.sources),this.inPlace===!0&&1===n.length?(s=this.sources[n[0]],this.uniforms.transform=s&&s.cumulativeMatrix||x):this.uniforms.transform=x}else a=me[this.hook]&&void 0!==me[this.hook][e]?me[this.hook][e]:r.defaultValue,t=r.validate.call(this,t,r,a,this.inputs[e]),o=t;return this.inputs[e]===t&&"color"!==r.type&&"vector"!==r.type?t:(this.inputs[e]=t,r.uniform&&(this.uniforms[r.uniform]=o),"image"===r.type?(this.resize(),this.updateReady()):r.updateSources&&this.updateReady(),r.shaderDirty&&(this.shaderDirty=!0),this.setDirty(),r.update&&r.update.call(this,t),t)}},H.prototype.alias=function(e,t){var i=this;if(Z.indexOf(t)>=0)throw new Error("'"+t+"' is a reserved name and cannot be used as an alias.");return this.effect.inputs.hasOwnProperty(e)&&(t||(t=e),re.removeAlias(t),ce[t]={node:this,input:e},Object.defineProperty(re,t,{configurable:!0,enumerable:!0,get:function(){return i.inputs[e]},set:function(t){return i.setInput(e,t)}})),this},H.prototype.matte=function(e){function t(e){return e&&e.length&&Array.isArray(e)?Array.isArray(e[0])?Array.isArray(e[0])&&!isNaN(e[0][0])?[e]:e:[e]:[]}function i(e,t,i,r){var o,n,s,a,u;return o=(r.x-i.x)*(e.y-i.y)-(r.y-i.y)*(e.x-i.x),n=(t.x-e.x)*(e.y-i.y)-(t.y-e.y)*(e.x-i.x),s=(r.y-i.y)*(t.x-e.x)-(r.x-i.x)*(t.y-e.y),s&&(a=o/s,u=n/s,a>0&&1>=a&&u>0&&1>=u)?{x:e.x+a*(t.x-e.x),y:e.y+a*(t.y-e.y)}:!1}function r(e){var t,r,o,n,s,a,u,l,f,c,d,h=[];if(!e.simple){for(t=0;ti;t=i,i++)r=e.vertices[t],o=e.vertices[i],s+=r.x*o.y-o.x*r.y;return s>0}function s(e){function t(e,t,i,r){var o,n,s,a,u,l,f,c,d,h,m,p,v,g,y;return o=i.x-t.x,n=i.y-t.y,s=e.x-i.x,a=e.y-i.y,u=t.x-e.x,l=t.y-e.y,f=r.x-e.x,c=r.y-e.y,d=r.x-t.x,h=r.y-t.y,m=r.x-i.x,p=r.y-i.y,y=o*h-n*d,v=u*c-l*f,g=s*p-a*m,y>=0&&g>=0&&v>=0}function i(e,i,r,o,n){var s,a,u,l,f;if(a=v[n[e]],u=v[n[i]],l=v[n[r]],0>(u.x-a.x)*(l.y-a.y)-(u.y-a.y)*(l.x-a.x))return!1;for(s=0;o>s;s++)if(s!==e&&s!==i&&s!==r&&(f=v[n[s]],t(a,u,l,f)))return!1;return!0}var r,o,n,s,a,l,f,c,d,h,m,p,v=e.vertices,g=[],y=[];if(o=v.length,e.clockWise)for(r=0;o>r;r++)g[r]=r;else for(r=0;o>r;r++)g[r]=o-1-r;for(n=o,s=2*n,a=0,r=n-1;n>2;){if(s--<=0)return y;if(l=r,l>=n&&(l=0),r=l+1,r>=n&&(r=0),f=r+1,f>n&&(f=0),i(l,r,f,n,g)){for(c=g[l],d=g[r],h=g[f],e.clockWise?(y.push(v[c]),y.push(v[d]),y.push(v[h])):(y.push(v[h]),y.push(v[d]),y.push(v[c])),a++,m=r,p=r+1;n>p;m++,p++)g[m]=g[p];n--,s=2*n}}u.indices=y}var a,u,l,f,c,d,h,m=[],p=[],v={};for(a=t(e),l=0;l=2&&!isNaN(c[0])&&!isNaN(c[1])&&(d={x:c[0],y:c[1],id:p.length}):d={x:c.x,y:c.y,id:p.length},d&&(h?(h.next=d,d.prev=h,d.next=u.vertices[0],u.vertices[0].prev=d):(u.head=d,d.next=d,d.prev=d),p.push(d),u.vertices.push(d),h=d);if(u.vertices.length>2)for(3===u.vertices.length&&(u.simple=!0),m.push(u),f=0;f=0;l--)u=m[l],r(u);for(l=0;l=0&&fe.splice(e,1),e=_[r].indexOf(this),e>=0&&_[r].splice(e,1),U.prototype.destroy.call(this)},Q=function(e){var t=e;Object.defineProperties(this,{original:{enumerable:!0,configurable:!0,get:function(){return t.source}},id:{enumerable:!0,configurable:!0,get:function(){return t.id}},width:{enumerable:!0,configurable:!0,get:function(){return t.width}},height:{enumerable:!0,configurable:!0,get:function(){return t.height}}}),this.render=function(){t.render()},this.update=function(){t.setDirty()},this.readPixels=function(e,i,r,o,n){return t.readPixels(e,i,r,o,n)},this.on=function(e,i){t.on(e,i)},this.off=function(e,i){t.off(e,i)},this.destroy=function(){var e,i;t.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(i=Object.getOwnPropertyDescriptor(this,e),i.get||i.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.isDestroyed=function(){return t.isDestroyed},this.isReady=function(){return t.ready}},I=function(e,r,n){function s(e,t,r,o){var n=D[e];if(n.definition){if(n=n.definition.call(p,t,r,o),!n)return null;n=i(i({},D[e]),n)}return n}function a(e){return p.source===e}var u,l,f=n||{},c=void 0===f.flip?!0:f.flip,d=f.width,h=f.height,m=!1,p=this,v=!1;if(U.call(this),(e&&"string"!=typeof e||!r&&0!==r)&&(n&&"object"==typeof n||(n=r),r=e),"string"==typeof r&&isNaN(r)&&(r=t(r,["canvas","img","video"])),"string"==typeof e&&D[e]&&(l=s(e,r,n,!0),l&&(this.hook=e,v=!0,m=l.deferTexture,this.plugin=l,this.compare=l.compare,this.checkDirty=l.checkDirty,l.source&&(r=l.source))),!l&&o(r))"CANVAS"===r.tagName?(this.width=r.width,this.height=r.height,this.render=this.renderImageCanvas,v=!0,this.hook="canvas",this.compare=a):"IMG"===r.tagName&&(this.width=r.naturalWidth||1,this.height=r.naturalHeight||1,r.complete&&r.naturalWidth||(m=!0),r.addEventListener("load",function(){p.isDestroyed||((p.width!==r.naturalWidth||p.height!==r.naturalHeight)&&(p.width=r.naturalWidth,p.height=r.naturalHeight,p.resize()),p.setDirty(),p.setReady())},!0),this.render=this.renderImageCanvas,v=!0,this.hook="image",this.compare=a);else if(!l&&o(r,"WebGLTexture")){ +if(A&&!A.isTexture(r))throw new Error("Not a valid WebGL texture.");isNaN(d)?isNaN(h)||(d=h):isNaN(h)&&(h=d),this.width=d,this.height=h,void 0===f.flip&&(c=!1),v=!0,this.texture=r,this.initialized=!0,this.hook="texture",this.compare=a,this.render=function(){}}if(!v&&!l)for(u in D)if(D.hasOwnProperty(u)&&D[u]&&(l=s(u,r,n,!1))){this.hook=u,v=!0,m=l.deferTexture,this.plugin=l,this.compare=l.compare,this.checkDirty=l.checkDirty,l.source&&(r=l.source);break}if(!v)throw new Error("Unknown source type");this.source=r,void 0===this.flip&&(this.flip=c),this.targets=[],m||p.setReady(),this.pub=new Q(this),oe.push(this),ne[this.id]=this,ae.push(this),z[this.hook].push(this),ae.length&&!te&&g()},I.prototype=Object.create(U.prototype),I.prototype.constructor=I,I.prototype.initialize=function(){var e;A&&!this.texture&&this.ready&&(e=A.createTexture(),A.bindTexture(A.TEXTURE_2D,e),A.pixelStorei(A.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,A.LINEAR),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,A.LINEAR),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,A.CLAMP_TO_EDGE),A.bindTexture(A.TEXTURE_2D,null),this.texture=e,this.initialized=!0,this.allowRefresh=!0,this.setDirty())},I.prototype.initFrameBuffer=function(e){A&&(this.frameBuffer=new h(A,this.width,this.height,{texture:this.texture,useFloat:e}))},I.prototype.addTarget=function(e){var t;for(t=0;t=0&&this.targets.splice(t,1)},I.prototype.resize=function(){var e,t;if(this.uniforms.resolution[0]=this.width,this.uniforms.resolution[1]=this.height,this.framebuffer&&this.framebuffer.resize(this.width,this.height),this.emit("resize"),this.setDirty(),this.targets)for(e=0;e=0&&ae.splice(e,1),e=z[this.hook].indexOf(this),e>=0&&z[this.hook].splice(e,1);for(t in this)this.hasOwnProperty(t)&&"id"!==t&&delete this[t];U.prototype.destroy.call(this)},ee=function(e){var t=e;Object.defineProperties(this,{source:{enumerable:!0,configurable:!0,get:function(){return t.source?t.source.pub:void 0},set:function(e){t.setSource(e)}},original:{enumerable:!0,configurable:!0,get:function(){return t.target}},width:{enumerable:!0,configurable:!0,get:function(){return t.width},set:function(e){!isNaN(e)&&e>0&&t.width!==e&&(t.width=e,t.resize(),t.setTransformDirty())}},height:{enumerable:!0,configurable:!0,get:function(){return t.height},set:function(e){!isNaN(e)&&e>0&&t.height!==e&&(t.height=e,t.resize(),t.setTransformDirty())}},id:{enumerable:!0,configurable:!0,get:function(){return t.id}}}),this.render=function(){t.render()},this.readPixels=function(e,i,r,o,n){return t.readPixels(e,i,r,o,n)},this.on=function(e,i){t.on(e,i)},this.off=function(e,i){t.off(e,i)},this.go=function(e){t.go(e)},this.stop=function(){t.stop()},this.getTexture=function(){return t.frameBuffer.texture},this.destroy=function(){var e,i;t.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(i=Object.getOwnPropertyDescriptor(this,e),i.get||i.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.inputs=function(e){return{source:{type:"image"}}},this.isDestroyed=function(){return t.isDestroyed},this.isReady=function(){return t.ready}},K=function(e,t,r){function n(e,t,r,o){var n=P[e];if(n.definition){if(n=n.definition.call(C,t,r,o),!n)return null;n=i(i({},P[e]),n),C.hook=b,E=!0,C.plugin=n,C.compare=n.compare,n.target&&(t=n.target),n.gl&&!C.gl&&(C.gl=n.gl,A||f(n.gl)),C.gl===A&&(C.model=j,C.shader=V)}return n}var s,u,c,d,v,g,y,x,b,C=this,E=!1,S=!1;if(U.call(this),(e&&"string"!=typeof e||!t&&0!==t)&&(r&&"object"==typeof r||(r=t),t=e),s=r||{},u=void 0===s.flip?!0:s.flip,c=parseInt(s.width,10),d=parseInt(s.height,10),g=s.debugContext,"string"==typeof e&&P[e]&&n(e,t,s,!0),this.renderToTexture=s.renderToTexture,o(t,"WebGLFramebuffer"))if(y=t,o(s,"HTMLCanvasElement"))t=s;else if(o(s,"WebGLRenderingContext"))t=s.canvas;else if(o(s.canvas,"HTMLCanvasElement"))t=s.canvas;else{if(!o(s.context,"WebGLRenderingContext"))throw new Error("Must provide a canvas with WebGLFramebuffer target");t=s.context.canvas}if(o(t,"HTMLCanvasElement")){if(c=t.width,d=t.height,(!A||A.canvas!==t&&s.allowSecondaryWebGL)&&(S=!0,v=l(t,{alpha:!0,premultipliedAlpha:!0,preserveDrawingBuffer:!0,stencil:!0,debugContext:g})),v)A&&A!==v?(this.gl=v,this.frameBuffer={frameBuffer:y||null},this.shader=new m(this.gl,w,T),this.model=a.call(this,this.gl),this.pixels=null,this.texture=this.gl.createTexture(),this.gl.bindTexture(A.TEXTURE_2D,this.texture),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,A.LINEAR),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,A.LINEAR),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,A.CLAMP_TO_EDGE),this.gl.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,A.CLAMP_TO_EDGE),this.render=this.renderSecondaryWebGL):(N||(N=this),A||f(v),this.render=this.renderWebGL,s.renderToTexture?A&&(this.frameBuffer=new h(A,c,d,!1)):this.frameBuffer={frameBuffer:y||null});else{if(!s.allowSecondaryWebGL&&A&&A.canvas!==t)throw new Error("Only one WebGL target canvas allowed. Set allowSecondaryWebGL option to create secondary context.");this.render=O,p.logger.log("Unable to create WebGL context.")}E=!0}if(!E)for(b in P)if(P.hasOwnProperty(b)&&P[b]&&n(b,t,s,!1))break;if(!E)throw new Error("Unknown target type");M&&(x=M.get(t),x?p.logger.warn("Target already in use by another instance",t,Object.keys(x).map(function(e){return x[e]})):(x={},M.set(t,x)),x[re.id]=re),this.target=t,this.transform=null,this.transformDirty=!0,this.flip=u,c&&(this.width=c),d&&(this.height=d),this.uniforms.resolution[0]=this.width,this.uniforms.resolution[1]=this.height,void 0!==s.auto?this.auto=s.auto:this.auto=ve,this.frames=0,this.pub=new ee(this),oe.push(this),ne[this.id]=this,ue.push(this)},K.prototype=Object.create(U.prototype),K.prototype.constructor=K,K.prototype.setSource=function(e){var t;t=b(e),t!==this.source&&(this.source&&this.source.removeTarget(this),this.source=t,t.addTarget(this),t&&(this.resize(),t.ready?this.setReady():this.setUnready()),this.setDirty())},K.prototype.setDirty=function(){this.dirty=!0,this.auto&&!te&&(te=X(g))},K.prototype.resize=function(){o(this.target,"HTMLCanvasElement")?(this.width!==this.target.width||this.height!==this.target.height)&&(this.target.width=this.width,this.target.height=this.height,this.uniforms.resolution[0]=this.width,this.uniforms.resolution[1]=this.height,this.emit("resize"),this.setTransformDirty()):this.plugin&&this.plugin.resize&&this.plugin.resize.call(this),!this.source||this.source.width===this.width&&this.source.height===this.height||this.transform||(this.transform=new Float32Array(16))},K.prototype.setTransformDirty=function(){this.transformDirty=!0,this.setDirty()},K.prototype.go=function(){this.auto=!0,this.setDirty()},K.prototype.stop=function(){this.auto=!1},K.prototype.render=function(){A&&this.plugin&&this.plugin.render&&this.plugin.render.call(this,y,V,j)},K.prototype.renderWebGL=function(){var e,t,i;if(this.resize(),A&&this.dirty&&this.ready){if(!this.source)return;this.source.render(),this.uniforms.source=this.source.texture,this.source.width===this.width&&this.source.height===this.height?this.uniforms.transform=this.source.cumulativeMatrix||x:this.transformDirty&&(e=this.transform,q.copy(e,this.source.cumulativeMatrix||x),t=this.source.width/this.width,i=this.source.height/this.height,e[0]*=t,e[1]*=t,e[2]*=t,e[3]*=t,e[4]*=i,e[5]*=i,e[6]*=i,e[7]*=i,this.uniforms.transform=e,this.transformDirty=!1),y(V,j,this.uniforms,this.frameBuffer.frameBuffer,this,G),this.emit("render"),this.dirty=!1}},K.prototype.renderSecondaryWebGL=function(){var e,t,i,r,o;this.dirty&&this.ready&&this.source&&(this.emit("render"),this.source.render(!0),e=this.source.width,t=this.source.height,this.pixels&&this.pixels.length===e*t*4||(this.pixels=new Uint8Array(e*t*4)),this.source.readPixels(0,0,e,t,this.pixels),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,e,t,0,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.pixels),e===this.width&&t===this.height?this.uniforms.transform=x:this.transformDirty&&(i=this.transform,q.copy(i,x),r=this.source.width/this.width,o=this.source.height/this.height,i[0]*=r,i[1]*=r,i[2]*=r,i[3]*=r,i[4]*=o,i[5]*=o,i[6]*=o,i[7]*=o,this.uniforms.transform=i,this.transformDirty=!1),this.uniforms.source=this.texture,y(this.shader,this.model,this.uniforms,null,this,G),this.dirty=!1)},K.prototype.removeSource=function(e){(this.source===e||this.source===e.pub)&&(this.source=null)},K.prototype.destroy=function(){var e,t;this.source&&this.source.removeTarget&&this.source.removeTarget(this),M&&(t=M.get(this.target),delete t[re.id],Object.keys(t).length||M["delete"](this.target)),this.plugin&&this.plugin.destroy&&this.plugin.destroy.call(this),delete this.source,delete this.target,delete this.pub,delete this.uniforms,delete this.pixels,delete this.auto,e=ue.indexOf(this),e>=0&&ue.splice(e,1),U.prototype.destroy.call(this),this===N&&(B.removeEventListener("webglcontextrestored",c,!1),v(),N=null)},$=function(e){function r(e,i,r){var n,a;n=l.inputElements[e],"string"==typeof r&&isNaN(r)&&("enum"===i.type?i.options.hasOwnProperty(r)||(r=t(r,["select"])):"number"===i.type||"boolean"===i.type?r=t(r,["input","select"]):"image"===i.type&&(r=t(r,["canvas","img","video"]))),o(r,"HTMLInputElement")||o(r,"HTMLSelectElement")?(a=r.value,n&&n.element!==r&&(n.element.removeEventListener("change",n.listener,!0),n.element.removeEventListener("input",n.listener,!0),delete l.inputElements[e],n=null),n||(n={element:r,listener:function(t){return function(){var i,o;i="checkbox"===r.type?r.checked:t.value,o=l.setInput(e,i),"color"===r.type&&(o=s(o)),o!==i&&(t.value=o)}}(r)},l.inputElements[e]=n,"range"===r.type?(r.addEventListener("input",n.listener,!0),r.addEventListener("change",n.listener,!0)):r.addEventListener("change",n.listener,!0)),n&&"checkbox"===r.type&&(a=r.checked)):(n&&(n.element.removeEventListener("change",n.listener,!0),n.element.removeEventListener("input",n.listener,!0),delete l.inputElements[e]),a=r),l.setInput(e,a)}function n(e,t){Object.defineProperty(f,e,{configurable:!0,enumerable:!0,get:function(){return t.get.call(l)},set:function(i){r(e,t,i)}})}function a(e){return function(){e.apply(l,arguments)&&l.setTransformDirty()}}var u,l=e,f=this;Object.defineProperties(this,{transform:{enumerable:!0,configurable:!0,get:function(){return l.hook}},title:{enumerable:!0,configurable:!0,get:function(){return l.plugin.title||l.hook}},width:{enumerable:!0,configurable:!0,get:function(){return l.width}},height:{enumerable:!0,configurable:!0,get:function(){return l.height}},id:{enumerable:!0,configurable:!0,get:function(){return l.id}},source:{enumerable:!0,configurable:!0,get:function(){return l.source&&l.source.pub},set:function(e){l.setSource(e)}}});for(u in l.methods)l.methods.hasOwnProperty(u)&&(this[u]=a(l.methods[u]));for(u in l.inputs)l.inputs.hasOwnProperty(u)&&n(u,l.inputs[u]);this.update=function(){l.setDirty()},this.inputs=function(e){var t,r,o,n;if(o=l.plugin.inputs,e)return r=o[e],!r||r.method?null:(t={type:r.type,defaultValue:r.defaultValue,title:r.title||e},"number"===r.type?(t.min=r.min,t.max=r.max,t.step=r.step,t.mod=r.mod):"enum"===r.type?t.options=i({},r.options):"vector"===r.type&&(t.dimensions=r.dimensions),r.description&&(t.description=r.description),t);t={};for(n in o)o.hasOwnProperty(n)&&!o[n].method&&(t[n]=this.inputs(n));return t},this.alias=function(e,t){return l.alias(e,t),this},this.on=function(e,t){l.on(e,t)},this.off=function(e,t){l.off(e,t)},this.destroy=function(){var e,t;l.destroy();for(e in this)this.hasOwnProperty(e)&&"isDestroyed"!==e&&"id"!==e&&(t=Object.getOwnPropertyDescriptor(this,e),t.get||t.set||"function"!=typeof this[e]?delete this[e]:this[e]=O)},this.isDestroyed=function(){return l.isDestroyed},this.isReady=function(){return l.ready}},Y=function(e,t){var r,o,n,s,a;this.matrix=new Float32Array(16),this.cumulativeMatrix=new Float32Array(16),this.ready=!1,this.width=1,this.height=1,this.seriously=re,this.transformRef=R[e],this.hook=e,this.id=se,se++,this.options=t,this.sources=null,this.targets=[],this.inputElements={},this.inputs={},this.methods={},this.listeners={},this.texture=null,this.frameBuffer=null,this.uniforms=null,this.dirty=!0,this.transformDirty=!0,this.renderDirty=!1,this.isDestroyed=!1,this.transformed=!1,this.plugin=i({},this.transformRef),this.transformRef.definition&&i(this.plugin,this.transformRef.definition.call(this,t));for(r in this.plugin.inputs)this.plugin.inputs.hasOwnProperty(r)&&(o=this.plugin.inputs[r],o.method&&"function"==typeof o.method?this.methods[r]=o.method:"function"==typeof o.set&&"function"==typeof o.get&&(this.inputs[r]=o));d(this.plugin),a=me[e];for(r in this.plugin.inputs)this.plugin.inputs.hasOwnProperty(r)&&(o=this.plugin.inputs[r],"function"==typeof o.set&&"function"==typeof o.get&&"function"!=typeof o.method&&(n=o.get.call(this),s=void 0===o.defaultValue?n:o.defaultValue,s=o.validate.call(this,s,o,n),a&&void 0!==a[r]&&(s=o.validate.call(this,a[r],o,o.defaultValue,s),a[r]=s),s!==n&&o.set.call(this,s)));oe.push(this),ne[this.id]=this,this.pub=new $(this),le.push(this),F[e].push(this)},Y.prototype=Object.create(U.prototype),Y.prototype.constructor=Y,Y.prototype.setDirty=function(){this.renderDirty=!0,U.prototype.setDirty.call(this)},Y.prototype.setTransformDirty=function(){var e,t;for(this.transformDirty=!0,this.dirty=!0,this.renderDirty=!0,e=0;e=0&&this.targets.splice(t,1),this.targets&&this.targets.length&&this.resize()},Y.prototype.setInput=function(e,t){var i,r,o;return this.plugin.inputs.hasOwnProperty(e)?(i=this.plugin.inputs[e],r=me[this.hook]&&void 0!==me[this.hook][e]?me[this.hook][e]:i.defaultValue,o=i.get.call(this),void 0===r&&(r=o),t=i.validate.call(this,t,i,r,o),i.set.call(this,t)&&this.setTransformDirty(),i.get.call(this)):void 0},Y.prototype.alias=function(e,t){var i,r,o=this;if(Z.indexOf(t)>=0)throw new Error("'"+t+"' is a reserved name and cannot be used as an alias.");return this.plugin.inputs.hasOwnProperty(e)&&(t||(t=e),re.removeAlias(t),i=this.inputs[e],i?(r=o.inputs[e],Object.defineProperty(re,t,{configurable:!0,enumerable:!0,get:function(){return r.get.call(o)},set:function(e){r.set.call(o,e)&&o.setTransformDirty()}})):(i=this.methods[e],i&&(r=i,re[t]=function(){r.apply(o,arguments)&&o.setTransformDirty()})),i&&(ce[t]={node:this,input:e})),this},Y.prototype.render=function(e){return this.source?(this.source.render(),this.transformDirty&&(this.transformed?this.source.cumulativeMatrix?q.multiply(this.cumulativeMatrix,this.matrix,this.source.cumulativeMatrix):q.copy(this.cumulativeMatrix,this.matrix):q.copy(this.cumulativeMatrix,this.source.cumulativeMatrix||x),this.transformDirty=!1),e&&A?(this.renderDirty&&(this.frameBuffer||(this.uniforms={resolution:[this.width,this.height]},this.frameBuffer=new h(A,this.width,this.height)),this.uniforms.source=this.source.texture,this.uniforms.transform=this.cumulativeMatrix||x,y(V,j,this.uniforms,this.frameBuffer.frameBuffer,this),this.renderDirty=!1),this.texture=this.frameBuffer.texture):this.source?this.texture=this.source.texture:this.texture=null,this.dirty=!1,this.texture):(this.transformDirty&&(q.copy(this.cumulativeMatrix,this.matrix),this.transformDirty=!1),this.texture=null,void(this.dirty=!1))},Y.prototype.readPixels=function(e,t,i,r,n){var s=this.gl||A;if(!A)throw new Error("Cannot read pixels until a canvas is connected");if(this.render(!0),void 0===n)n=new Uint8Array(i*r*4);else if(!o(n,"Uint8Array"))throw new Error("Incompatible array type");return s.bindFramebuffer(A.FRAMEBUFFER,this.frameBuffer.frameBuffer),s.readPixels(e,t,i,r,A.RGBA,A.UNSIGNED_BYTE,n),n},Y.prototype.destroy=function(){var e,t,i,r=this.hook;this.plugin.destroy&&"function"==typeof this.plugin.destroy&&this.plugin.destroy.call(this),delete this.effect,this.frameBuffer&&(this.frameBuffer.destroy(),delete this.frameBuffer,delete this.texture);for(e in this.inputElements)this.inputElements.hasOwnProperty(e)&&(i=this.inputElements[e],i.element.removeEventListener("change",i.listener,!0),i.element.removeEventListener("input",i.listener,!0));for(this.source&&this.source.removeTarget(this);this.targets.length;)i=this.targets.pop(),i&&i.removeSource&&i.removeSource(this);for(t in this)this.hasOwnProperty(t)&&"id"!==t&&delete this[t];for(t in ce)ce.hasOwnProperty(t)&&(i=ce[t],i.node===this&&re.removeAlias(t));e=le.indexOf(this),e>=0&&le.splice(e,1),e=F[r].indexOf(this),e>=0&&F[r].splice(e,1),U.prototype.destroy.call(this)},Y.prototype.setReady=U.prototype.setReady,Y.prototype.setUnready=U.prototype.setUnready,Y.prototype.on=U.prototype.on,Y.prototype.off=U.prototype.off,Y.prototype.emit=U.prototype.emit,r=o(r,"HTMLCanvasElement")?{canvas:r}:r||{},r.canvas,this.effect=function(e,t){if(!S[e])throw new Error("Unknown effect: "+e);var i=new H(e,t);return i.pub},this.source=function(e,t,i){var r=b(e,t,i);return r.pub},this.transform=function(e,t){var i;if("string"!=typeof e&&(t=e,e=!1),e){if(!R[e])throw new Error("Unknown transform: "+e)}else if(e=r&&r.defaultTransform||"2d",!R[e])throw new Error("No transform specified");return i=new Y(e,t),i.pub},this.target=function(e,t,i){var r,o,n;for(e&&"string"==typeof e&&!P[e]&&(o=C.querySelector(e)),("string"!=typeof e||!t&&0!==t||o)&&(i&&"object"==typeof i||(i=t),t=o||e,e=null),"string"==typeof t&&isNaN(t)&&(t=C.querySelector(t)),n=0;n0)){var i=B.shift();i()}},!0),h.prototype.resize=function(e,t){var i=this.gl;(this.width!==e||this.height!==t)&&(this.width=e,this.height=t,i&&(i.bindTexture(i.TEXTURE_2D,this.texture),i.bindFramebuffer(i.FRAMEBUFFER,this.frameBuffer),i.bindRenderbuffer(i.RENDERBUFFER,this.renderBuffer),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,e,t,0,i.RGBA,i.UNSIGNED_BYTE,null),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_COMPONENT16,e,t),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.texture,0),i.bindTexture(i.TEXTURE_2D,null),i.bindRenderbuffer(i.RENDERBUFFER,null),i.bindFramebuffer(i.FRAMEBUFFER,null)))},h.prototype.destroy=function(){var e=this.gl;e&&(e.deleteFramebuffer(this.frameBuffer),e.deleteRenderbuffer(this.renderBuffer),this.ownTexture&&e.deleteTexture(this.texture)),delete this.frameBuffer,delete this.renderBuffer,delete this.texture,delete this.gl},m.prototype.use=function(){this.gl.useProgram(this.program)},p.incompatible=function(t){var i,r,o;if(void 0===y&&(i=C.createElement("canvas"),i&&i.getContext?e.WebGLRenderingContext?(r=f(),r||(y="context")):y="webgl":y="canvas"),y)return y;if(t){if(o=S[t],o&&"function"==typeof o.compatible&&!o.compatible(r))return"plugin-"+t;if(o=D[t],o&&"function"==typeof o.compatible&&!o.compatible(r))return"source-"+t}return!1},p.plugin=function(e,t,r){var o;return S[e]?void p.logger.warn("Effect ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r?(o=i({},r),"function"==typeof t&&(o.definition=t),o.reserved=Y,o.inputs&&d(o),o.title||(o.title=e),S[e]=o,_[e]=[],o):void 0)},p.removePlugin=function(e){var t,i,r;if(!e)return this;if(r=S[e],!r)return this;if(t=_[e]){for(;t.length;)i=t.shift(),i.destroy();delete _[e]}return delete S[e],this},p.source=function(e,t,r){var o;return D[e]?void p.logger.warn("Source ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r||t?(o=i({},r),"function"==typeof t&&(o.definition=t),o.title||(o.title=e),D[e]=o,z[e]=[],o):void 0)},p.removeSource=function(e){var t,i,r;if(!e)return this;if(r=D[e],!r)return this;if(t=z[e]){for(;t.length;)i=t.shift(),i.destroy();delete z[e]}return delete D[e],this},p.transform=function(e,t,r){var o;return R[e]?void p.logger.warn("Transform ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r||t?(o=i({},r),"function"==typeof t&&(o.definition=t),o.reserved=K,o.inputs&&d(o),o.title||(o.title=e),R[e]=o,F[e]=[],o):void 0)},p.removeTransform=function(e){var t,i,r;if(!e)return this;if(r=R[e],!r)return this;if(t=F[e]){for(;t.length;)i=t.shift(),i.destroy();delete F[e]}return delete R[e],this},p.target=function(e,t,r){var o;return P[e]?void p.logger.warn("Target ["+e+"] already loaded"):(void 0===r&&"object"==typeof t&&(r=t),r||t?(o=i({},r),"function"==typeof t&&(o.definition=t),o.title||(o.title=e),P[e]=o,A[e]=[],o):void 0)},p.removeTarget=function(e){var t,i,r;if(!e)return this;if(r=P[e],!r)return this;if(t=A[e]){for(;t.length;)i=t.shift(),i.destroy();delete A[e]}return delete P[e],this},p.inputValidators={color:function(e,t,i,r){var o,s,u,l;if(s=r||[],"string"==typeof e){if(u=j.exec(e),u&&u.length){if(u.length<3)return s[0]=s[1]=s[2]=s[3]=0,s;for(s[3]=1,l=0;3>l;l++)s[l]=parseFloat(u[l+2])/255;return isNaN(u[6])||(s[3]=parseFloat(u[6])),"hsl"===u[1].toLowerCase()?n(s[0],s[1],s[2],s[3],s):s}if(u=V.exec(e),u&&u.length)return o=u[1],3===o.length?(s[0]=parseInt(o[0],16)/15,s[1]=parseInt(o[1],16)/15,s[2]=parseInt(o[2],16)/15,s[3]=1):4===o.length?(s[0]=parseInt(o[0],16)/15,s[1]=parseInt(o[1],16)/15,s[2]=parseInt(o[2],16)/15,s[3]=parseInt(o[3],16)/15):6===o.length?(s[0]=parseInt(o.substr(0,2),16)/255,s[1]=parseInt(o.substr(2,2),16)/255,s[2]=parseInt(o.substr(4,2),16)/255,s[3]=1):8===o.length?(s[0]=parseInt(o.substr(0,2),16)/255,s[1]=parseInt(o.substr(2,2),16)/255,s[2]=parseInt(o.substr(4,2),16)/255,s[3]=parseInt(o.substr(6,2),16)/255):s[0]=s[1]=s[2]=s[3]=0,s;if(u=N[e.toLowerCase()]){for(l=0;4>l;l++)s[l]=u[l];return s}return g||(g=C.createElement("canvas").getContext("2d")),g.fillStyle=e,o=g.fillStyle,o&&"#000000"!==o?p.inputValidators.color(o,t,i,r):(s[0]=s[1]=s[2]=s[3]=0,s)}if(a(e)){if(s=e,s.length<3)return s[0]=s[1]=s[2]=s[3]=0,s;for(l=0;3>l;l++)if(isNaN(s[l]))return s[0]=s[1]=s[2]=s[3]=0,s;return s.length<4&&s.push(1),s}if("number"==typeof e)return s[0]=s[1]=s[2]=e,s[3]=1,s;if("object"==typeof e){for(l=0;4>l;l++)o=I[l],null===e[o]||isNaN(e[o])?s[l]=3===l?1:0:s[l]=e[o];return s}return s[0]=s[1]=s[2]=s[3]=0,s},number:function(e,t,i){return e=parseFloat(e),isNaN(e)?i||0:(t.mod&&(e-=t.mod*Math.floor(e/t.mod)),et.max?t.max:t.step?Math.round(e/t.step)*t.step:e)},"enum":function(e,t,i){var r=t.options||[];return"string"==typeof e?e=e.toLowerCase():"number"==typeof e?e=e.toString():e||(e=""),r.hasOwnProperty(e)?e:i||""},vector:function(e,t,i,r){var o,n,s,u=t.dimensions||4;if(o=r||[],a(e)){for(n=0;u>n;n++)o[n]=e[n]||0;return o}if("object"==typeof e){for(n=0;u>n;n++)s=U[n],void 0===e[s]&&(s=I[n]),o[n]=e[s]||0;return o}for(e=parseFloat(e)||0,n=0;u>n;n++)o[n]=e;return o},"boolean":function(e){return e?e&&e.toLowerCase&&"false"===e.toLowerCase()?!1:!0:!1},string:function(e){return"string"==typeof e?e:0===e||e?e.toString?e.toString():String(e):""}},p.prototype.effects=p.effects=function(){var e,t,i,r,o,n={};for(e in S)if(S.hasOwnProperty(e)){t=S[e],i={title:t.title||e,description:t.description||"",inputs:{}};for(o in t.inputs)t.inputs.hasOwnProperty(o)&&(r=t.inputs[o],i.inputs[o]={type:r.type,defaultValue:r.defaultValue,step:r.step,min:r.min,max:r.max,mod:r.mod,minCount:r.minCount,maxCount:r.maxCount,dimensions:r.dimensions,title:r.title||o,description:r.description||"",options:r.options||[]});n[e]=i}return n},e.Float32Array&&(x=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])),e.Seriously&&"object"==typeof e.Seriously&&!function(){var t;for(t in e.Seriously)e.Seriously.hasOwnProperty(t)&&"plugin"!==t&&"object"==typeof e.Seriously[t]&&p.plugin(t,e.Seriously[t])}(),p.logger={log:r("log"),info:r("info"),warn:r("warn"),error:r("error")},p.util={mat4:q,checkSource:c,hslToRgb:n,colors:N,setTimeoutZero:u,ShaderProgram:m,FrameBuffer:h,requestAnimationFrame:X,shader:{makeNoise:"float makeNoise(float u, float v, float timer) {\n float x = u * v * mod(timer * 1000.0, 100.0);\n x = mod(x, 13.0) * mod(x, 127.0);\n float dx = mod(x, 0.01);\n return clamp(0.1 + dx * 100.0, 0.0, 1.0);\n}\n",random:"#ifndef RANDOM\n#define RANDOM\nfloat random(vec2 n) {\n return 0.5 + 0.5 * fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);\n}\n#endif\n"}},p.source("video",function(t,i,r){function n(){t.removeEventListener("loadedmetadata",n,!0),c||(t.videoWidth?((f.width!==t.videoWidth||f.height!==t.videoHeight)&&(f.width=t.videoWidth,f.height=t.videoHeight,f.resize()),d&&f.setReady()):(d=!0,setTimeout(n,50)))}function s(){h=!0}function a(){h=!1,f.setDirty()}var u,l,f=this,c=!1,d=!1,h=!1,m=0;return o(t,"HTMLVideoElement")?(t.readyState?n():(d=!0,t.addEventListener("loadedmetadata",n,!0)),t.addEventListener("seeking",s,!1),t.addEventListener("seeked",a,!1), +{deferTexture:d,source:t,render:function v(i){var r,o;if(m=t.currentTime,!t.videoHeight||!t.videoWidth)return!1;b?(l||(l=C.createElement("canvas").getContext("2d"),u=l.canvas,u.width=f.width,u.height=f.height),r=u,l.drawImage(t,0,0,f.width,f.height)):r=t,i.bindTexture(i.TEXTURE_2D,f.texture),i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,f.flip),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1);try{if(i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,r),void 0===b){if(o=i.getError(),o===i.INVALID_VALUE)return b=!0,v(i);b=!1}return!0}catch(n){n.code===e.DOMException.SECURITY_ERR?(f.allowRefresh=!1,p.logger.error("Unable to access cross-domain image")):p.logger.error("Error rendering video source",n)}return!1},checkDirty:function(){return!h&&t.currentTime!==m},compare:function(e){return f.source===e},destroy:function(){c=!0,t.removeEventListener("seeking",s,!1),t.removeEventListener("seeked",a,!1),t.removeEventListener("loadedmetadata",n,!0)}}):void 0},{title:"Video"}),p.transform("2d",function(e){function t(){function e(e,t){C[12]=C[0]*e+C[4]*t+C[12],C[13]=C[1]*e+C[5]*t+C[13],C[14]=C[2]*e+C[6]*t+C[14],C[15]=C[3]*e+C[7]*t+C[15]}var t,h,m,p,v,g,y,x,b,w,T,C=i.matrix;return u||l||f||c||d||1!==s||1!==a?(q.identity(C),e(u+o,l+n),c&&(C[4]=c/i.width),d&&(C[1]=d/i.height),f&&(p=C[0],v=C[1],g=C[2],y=C[3],x=C[4],b=C[5],w=C[6],T=C[7],t=-(r?f*Math.PI/180:f),h=Math.sin(t),m=Math.cos(t),C[0]=p*m+x*h,C[1]=v*m+b*h,C[2]=g*m+w*h,C[3]=y*m+T*h,C[4]=x*m-p*h,C[5]=b*m-v*h,C[6]=w*m-g*h,C[7]=T*m-y*h),1!==s&&(C[0]*=s,C[1]*=s,C[2]*=s,C[3]*=s),1!==a&&(C[4]*=a,C[5]*=a,C[6]*=a,C[7]*=a),e(-o,-n),void(i.transformed=!0)):void(i.transformed=!1)}var i=this,r=!(e&&e.radians),o=0,n=0,s=1,a=1,u=0,l=0,f=0,c=0,d=0;return{inputs:{reset:{method:function(){return o=0,n=0,s=1,a=1,u=0,l=0,f=0,c=0,d=0,i.transformed?(i.transformed=!1,!0):!1}},translate:{method:function(e,i){return isNaN(e)&&(e=u),isNaN(i)&&(i=l),e===u&&i===l?!1:(u=e,l=i,t(),!0)},type:["number","number"]},translateX:{get:function(){return u},set:function(e){return e===u?!1:(u=e,t(),!0)},type:"number"},translateY:{get:function(){return l},set:function(e){return e===l?!1:(l=e,t(),!0)},type:"number"},rotation:{get:function(){return f},set:function(e){return e===f?!1:(f=parseFloat(e),t(),!0)},type:"number"},center:{method:function(e,i){return isNaN(e)&&(e=o),isNaN(i)&&(i=n),e===o&&i===n?!1:(o=e,n=i,t(),!0)},type:["number","number"]},centerX:{get:function(){return o},set:function(e){return e===o?!1:(o=e,t(),!0)},type:"number"},centerY:{get:function(){return n},set:function(e){return e===n?!1:(n=e,t(),!0)},type:"number"},skew:{method:function(e,i){return isNaN(e)&&(e=c),isNaN(i)&&(i=d),e===c&&i===d?!1:(c=e,d=i,t(),!0)},type:["number","number"]},skewX:{get:function(){return c},set:function(e){return e===c?!1:(c=e,t(),!0)},type:"number"},skewY:{get:function(){return d},set:function(e){return e===d?!1:(d=e,t(),!0)},type:"number"},scale:{method:function(e,i){var r,o;if(r=isNaN(e)?s:e,isNaN(i)){if(isNaN(e))return!1;o=r}else o=i;return r===s&&o===a?!1:(s=r,a=o,t(),!0)},type:["number","number"]},scaleX:{get:function(){return s},set:function(e){return e===s?!1:(s=e,t(),!0)},type:"number"},scaleY:{get:function(){return a},set:function(e){return e===a?!1:(a=e,t(),!0)},type:"number"}}}},{title:"2D Transform",description:"Translate, Rotate, Scale, Skew"}),p.transform("flip",function(){function e(){var e=t.matrix;i?(e[0]=-1,e[5]=1):(e[0]=1,e[5]=-1)}var t=this,i=!0;return q.identity(t.matrix),e(),t.transformDirty=!0,t.transformed=!0,{inputs:{direction:{get:function(){return i?"horizontal":"vertical"},set:function(t){var r;return r="vertical"===t?!1:!0,r===i?!1:(i=r,e(),!0)},type:"string"}}}},{title:"Flip",description:"Flip Horizontal/Vertical"}),p.transform("reformat",function(){function e(){var e,t,i,a,u=n.matrix,l=r||n.width,f=o||n.height,c=n.source,d=c&&c.width||1,h=c&&c.height||1;return"distort"===s||l===d&&f===h?void(n.transformed=!1):(i=d/h,a=l/f,"none"===s?(e=d/l,t=h/f):"width"===s||"contain"===s&&i>=a?(e=1,t=a/i):"height"===s||"contain"===s&&a>i?(e=i/a,t=1):a>i?(e=1,t=a/i):(e=i/a,t=1),1===e&&1===t?void(n.transformed=!1):(q.identity(u),1!==e&&(u[0]*=e,u[1]*=e,u[2]*=e,u[3]*=e),1!==t&&(u[4]*=t,u[5]*=t,u[6]*=t,u[7]*=t),void(n.transformed=!0)))}function t(){return r||n.source&&n.source.width||1}function i(){return o||n.source&&n.source.height||1}var r,o,n=this,s="contain";return this.resize=function(){var r,o=t(),n=i();if(this.width!==o||this.height!==n)for(this.width=o,this.height=n,this.uniforms&&this.uniforms.resolution&&(this.uniforms.resolution[0]=o,this.uniforms.resolution[1]=n),this.frameBuffer&&this.frameBuffer.resize&&this.frameBuffer.resize(o,n),r=0;r 1.0)"," hsl.x -= 1.0;"," }"," return hsl;","}","float HueToRGB(float f1, float f2, float hue) {"," if (hue < 0.0)"," hue += 1.0;"," else if (hue > 1.0)"," hue -= 1.0;"," float res;"," if ((6.0 * hue) < 1.0)"," res = f1 + (f2 - f1) * 6.0 * hue;"," else if ((2.0 * hue) < 1.0)"," res = f2;"," else if ((3.0 * hue) < 2.0)"," res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;"," else"," res = f1;"," return res;","}","vec3 HSLToRGB(vec3 hsl) {"," vec3 rgb;"," if (hsl.y == 0.0)"," rgb = vec3(hsl.z);"," else {"," float f2;"," if (hsl.z < 0.5)"," f2 = hsl.z * (1.0 + hsl.y);"," else"," f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);"," float f1 = 2.0 * hsl.z - f2;"," rgb.r = HueToRGB(f1, f2, hsl.x + (1.0/3.0));"," rgb.g = HueToRGB(f1, f2, hsl.x);"," rgb.b= HueToRGB(f1, f2, hsl.x - (1.0/3.0));"," }"," return rgb;","}","vec3 BlendHue(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(RGBToHSL(blend).r, baseHSL.g, baseHSL.b));","}","vec3 BlendSaturation(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, RGBToHSL(blend).g, baseHSL.b));","}","vec3 BlendColor(vec3 base, vec3 blend) {"," vec3 blendHSL = RGBToHSL(blend);"," return HSLToRGB(vec3(blendHSL.r, blendHSL.g, RGBToHSL(base).b));","}","vec3 BlendLuminosity(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, baseHSL.g, RGBToHSL(blend).b));","}","vec3 BlendLighterColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal > baseTotal ? blend : base;","}","vec3 BlendDarkerColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal < baseTotal ? blend : base;","}","#define BlendFunction(base, blend) "+i[o],r[o]?"#define MIX_ALPHA":"","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D previous;","uniform float opacity;","uniform float blendGamma;","vec3 BlendOpacity(vec4 base, vec4 blend, float opacity) {"," vec3 blendedColor = BlendFunction(base.rgb, blend.rgb);"," return mix(base.rgb, blendedColor, opacity * blend.a);","}","vec4 linear(vec4 color, vec3 gamma) {"," return vec4(pow(color.rgb, gamma), color.a);","}","void main(void) {"," vec3 exp = vec3(blendGamma);"," vec4 topPixel = linear(texture2D(source, vTexCoord), exp);"," vec4 bottomPixel = texture2D(previous, vTexCoord);"," if (topPixel.a == 0.0) {"," gl_FragColor = bottomPixel;"," } else {"," float alpha;","#ifdef MIX_ALPHA"," alpha = topPixel.a * opacity;"," alpha = alpha + bottomPixel.a * (1.0 - alpha);","#else"," alpha = bottomPixel.a;","#endif"," bottomPixel = linear(bottomPixel, exp);"," gl_FragColor = vec4(pow(BlendOpacity(bottomPixel, topPixel, opacity), 1.0 / exp), alpha);"," }","}"].join("\n"),t},resize:function(){!o||this.width===u&&this.height===l||(u=this.width,l=this.height,o[0].resize(u,l),o[1].resize(u,l),t())},draw:function(e,i,r,a,u){var l;return this.uniforms.previous=this.frameBuffer.texture,s=(s+1)%2,l=o[s],this.frameBuffer=l,this.texture=l.texture,this.inputs.clear?(t(),void u(this.baseShader,i,r,l.frameBuffer,null)):void u(e,i,r,l.frameBuffer,null,n)},destroy:function(){o&&(o[0].destroy(),o[1].destroy(),o.length=0)}}},{inPlace:!1,title:"Accumulator",description:"Draw on top of previous frame",inputs:{source:{type:"image",uniform:"source"},clear:{type:"boolean",defaultValue:!1},startColor:{type:"color",defaultValue:[0,0,0,0]},opacity:{type:"number",uniform:"opacity",defaultValue:1,min:0,max:1},blendGamma:{type:"number",uniform:"blendGamma",defaultValue:2.2,min:0,max:4},blendMode:{type:"enum",shaderDirty:!0,defaultValue:"normal",options:[["normal","Normal"],["lighten","Lighten"],["darken","Darken"],["multiply","Multiply"],["average","Average"],["add","Add"],["subtract","Subtract"],["divide","Divide"],["difference","Difference"],["negation","Negation"],["exclusion","Exclusion"],["screen","Screen"],["overlay","Overlay"],["softlight","Soft Light"],["hardlight","Hard Light"],["colordodge","Color Dodge"],["colorburn","Color Burn"],["lineardodge","Linear Dodge"],["linearburn","Linear Burn"],["linearlight","Linear Light"],["vividlight","Vivid Light"],["pinlight","Pin Light"],["hardmix","Hard Mix"],["reflect","Reflect"],["glow","Glow"],["phoenix","Phoenix"],["hue","Hue"],["saturation","Saturation"],["color","color"],["luminosity","Luminosity"],["darkercolor","Darker Color"],["lightercolor","Lighter Color"]]}}})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t,i;i=document.createElement("img"),i.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvAAAAAICAYAAACf+MsnAAAFY0lEQVR4Xu2Z644bOwyDN+//0NsOigEMQdRHyU6CFDnA+bHVWNaFojiTx8/Pz+/f/4/89/v7z9Xj8Tjib3XyTN9usFcMz8gt3h9zXf/O6nD/W1V7Vb9uXad+nHucZ9xenX7OqTHdSfmRXfmPsSn8xPMrllcfCkdVfHSe7Ned0/yp7jv2GPfqK+MCByc0zzvxKi5RPq8cuvE4+JrwpFM7N78K2yu+qb9kd3qV+ZjUx5n/+xnXP81ctW/UHQ5P3Gd360vxKf+n8dGpxXTeKu6h2ansFT6pvo5G2/FP99NsUf9d/xleInfetcj629m9cf9WOV5K+78R8ERGRLYO8VQiecd/1vwKEJV46JBJRzhRfXftVL/MTgM48UmL0l2OSmzs9kctAJfE4/1KkNFzbj8cjFHsJ/u460vhnPDfqddujJ27poLCWWBuHt0YKr/ki+yOKJnk5Z7pPLfLf4TZif+qvi7XuDWg+HbtNEe79ds9H7m1m2/3+YzLK5Hc9e/gYxdfNP+ZfdV9lT3usWn+9310/qiAdxa1O5gTEqVhoLudxVwVNPrvCqDp/ZX4d0Uk1Y7sbgyU4zooCk8nB3i9Y61V5wWpIjDlP+ZJsxPvmLxEOD2sntk5Pz1LBOb0L+sPfQGs6ksYpt7QAiHuUwtkgl+F3Qyf2YxTX53+Vdjfjc8VYIq7KT+abzof7ervZ8fX8d/Jyc3PmTcnRrrPEbyVTnD8T+Y38pH624mfNIr6muzO95S/sh1Gvog/XmW/a6N+scww43zgqLjcOX9cwFeESQK3Gpx32QggTlwk8Ei8OXfE4VMLeCLQiLBjfJM7VA069XefnZBGJz7Vr24dK3GwEoqLD7p/1+4IMWdRdxaMK9CmP4E62F7nm8S7s4B3BMCkBzQPVQ0IM06+2WLvzlDlI+NfF4d0ljiHuF/Zb/4m/4ojTgnA6f0qfiWA135P5l/NoFv/7txm+5ZyyOw0e1R/skd8ZKKwwnjXf9xLrkBV+2x3Pib9Vz3JOMaNL/KZ+oCkXhDUTLxEwLsC41OfI5DEYe9+mXfr0l2mJH5ISHTOUw2U8IjD5LyVUtxEmrvi4V5ejvijWNWicBbOyfsrYejkMMXmdIFEAZH19ASWnNyrPlBdKH+yU3y0gGjGKf4Mv51ft9zzKk83vul5qr9r7+CT9gHx2zvs0/yofpGX1AuC4svqhYJeJJydNZk/urcSxet91dfiUy94HX6oBHCHi5+F38svCeg1h+zZ6nyF5VUzVC8Q0X9LwE/IkMjmpJ3i27XvxuqQ0c4dp/JTfnb9T847AoNIW/nokIYrYKvnJvln/siPwtD0XAeTU+x0luEugWdLNeY4ecl260vxK8Efl3OnZi4uaZZIMBFeJ/hw6xrFvppvV1Q559d8MwwR50cskIBQ2KhE3y7/ZeddAUjxOr3diZ/8U3+I953z7uzR7Lj4rvjl9HxXvaHaOflSfSkf93y24xx94PpX89I5H2t9+fwK+KVzNOwdIeM+e905+ZqqRIj7pYHiU3FNFnBnkO+41EKige3cpX7GunwoARfjIwKrxNhEJFLfMrsbI+G/smfkojAa60vxPcNeCZCqhjSra6ydBaAWSFzaqnb01c4VEdVCWWPM7svstKDWuKrZpwUb7dVsOzPcxUeGdYdfdgV8Vr+Mv1R8Tn/iHcSNWR8jjjv9URzama9qbp0XlBP4y2Jw6u/E577AZTVz/BM/OfySzSjl79o73FRxaFdfuPG5/XE58PbXEvAT8UBn1HKuSIB8ThYwiZfJnd8z768Aib/3R/iN4J0VeMXcVwvynbl/735OBV6BKTfyT+e/T4/f7dP3uW8F3Aqs/PIHbWXeeeKjnSsAAAAASUVORK5CYII=",t=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),e.plugin("ascii",function(){function r(){l=h.height,u=h.width,f=Math.ceil(u/8),c=Math.ceil(l/8),d.resolution=h.uniforms.resolution,d.transform=t,n&&n.resize(f,c)}var o,n,s,a,u,l,f,c,d={},h=this;return{initialize:function(u){function l(){a.bindTexture(a.TEXTURE_2D,s),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,!0),a.texImage2D(a.TEXTURE_2D,0,a.RGBA,a.RGBA,a.UNSIGNED_BYTE,i),a.bindTexture(a.TEXTURE_2D,null)}var h=this;u(),this.texture=this.frameBuffer.texture,a=this.gl,s=a.createTexture(),i.naturalWidth?l():i.addEventListener("load",function(){l(),h.setDirty()}),d.letters=s,a.bindTexture(a.TEXTURE_2D,this.texture||this.frameBuffer&&this.frameBuffer.texture),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),a.bindTexture(a.TEXTURE_2D,null),r(),n=new e.util.FrameBuffer(a,f,c),a.bindTexture(a.TEXTURE_2D,n.texture),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),this.uniforms.transform=t,o=this.baseShader},commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D letters;","uniform vec4 background;","uniform vec2 resolution;","const vec3 lumcoeff = vec3(0.2125, 0.7154, 0.0721);","const vec2 fontSize = vec2(8.0, 8.0);","vec4 lookup(float ascii) {"," vec2 pos = mod(vTexCoord * resolution, fontSize) / vec2(752.0, fontSize.x) + vec2(ascii, 0.0);"," return texture2D(letters, pos);","}","void main(void) {"," vec4 sample = texture2D(source, vTexCoord);"," vec4 clamped = vec4(floor(sample.rgb * 8.0) / 8.0, sample.a);"," float luma = dot(sample.rgb,lumcoeff);"," float char = floor(luma * 94.0) / 94.0;"," gl_FragColor = mix(background, clamped, lookup(char).r);","}"].join("\n"),t},resize:r,draw:function(e,t,i,r,s){s(o,t,i,n.frameBuffer,!1,{width:f,height:c,blend:!1}),d.source=n.texture,d.background=i.background,s(e,t,d,r)},destroy:function(){n&&n.destroy(),a&&s&&a.deleteTexture(s)}}},{inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},background:{type:"color",uniform:"background",defaultValue:[0,0,0,1]}},description:"Display image as ascii text in 8-bit color.",title:"Ascii Text"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("bleach-bypass",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","const vec4 one = vec4(1.0);","const vec4 two = vec4(2.0);","const vec4 lumcoeff = vec4(0.2125,0.7154,0.0721,0.0);","vec4 overlay(vec4 myInput, vec4 previousmix, vec4 amount) {"," float luminance = dot(previousmix,lumcoeff);"," float mixamount = clamp((luminance - 0.45) * 10.0, 0.0, 1.0);"," vec4 branch1 = two * previousmix * myInput;"," vec4 branch2 = one - (two * (one - previousmix) * (one - myInput));"," vec4 result = mix(branch1, branch2, vec4(mixamount) );"," return mix(previousmix, result, amount);","}","void main (void) {"," vec4 pixel = texture2D(source, vTexCoord);"," vec4 luma = vec4(vec3(dot(pixel,lumcoeff)), pixel.a);"," gl_FragColor = overlay(luma, pixel, vec4(amount));","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},amount:{type:"number",uniform:"amount",defaultValue:1,min:0,max:1}},title:"Bleach Bypass",categories:["film"],description:["Bleach Bypass film treatment","http://en.wikipedia.org/wiki/Bleach_bypass",'see: "Saving Private Ryan", "Minority Report"'].join("\n")})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";function t(e,t,i){function r(e){var r={base:(t||"base")+"."+e,blend:(i||"blend")+"."+e};return function(e){return r[e]||e}}return"vec3("+e.replace(/blend|base/g,r("r"))+", "+e.replace(/blend|base/g,r("g"))+", "+e.replace(/blend|base/g,r("b"))+")"}var i={normal:"blend",lighten:"max(blend, base)",darken:"min(blend, base)",multiply:"(base * blend)",average:"(base + blend / TWO)",add:"min(base + blend, ONE)",subtract:"max(base - blend, ZERO)",divide:"base / blend",difference:"abs(base - blend)",negation:"(ONE - abs(ONE - base - blend))",exclusion:"(base + blend - TWO * base * blend)",screen:"(ONE - ((ONE - base) * (ONE - blend)))",lineardodge:"min(base + blend, ONE)",phoenix:"(min(base, blend) - max(base, blend) + ONE)",linearburn:"max(base + blend - ONE, ZERO)",hue:"BlendHue(base, blend)",saturation:"BlendSaturation(base, blend)",color:"BlendColor(base, blend)",luminosity:"BlendLuminosity(base, blend)",darkercolor:"BlendDarkerColor(base, blend)",lightercolor:"BlendLighterColor(base, blend)",overlay:t("base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))"),softlight:t("blend < 0.5 ? (2.0 * base * blend + base * base * (1.0 - 2.0 * blend)) : (sqrt(base) * (2.0 * blend - 1.0) + 2.0 * base * (1.0 - blend))"),hardlight:t("base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend))","blend","base"),colordodge:t("blend == 1.0 ? blend : min(base / (1.0 - blend), 1.0)"),colorburn:t("blend == 0.0 ? blend : max((1.0 - ((1.0 - base) / blend)), 0.0)"),linearlight:t("BlendLinearLightf(base, blend)"),vividlight:t("BlendVividLightf(base, blend)"),pinlight:t("BlendPinLightf(base, blend)"),hardmix:t("BlendHardMixf(base, blend)"),reflect:t("BlendReflectf(base, blend)"),glow:t("BlendReflectf(blend, base)")},r={},o=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("blend",function(){function e(){var e=s&&r[s.mode];e&&a&&(u.blendEquation=a[e[0]],u.srcRGB=a[e[1]],u.dstRGB=a[e[2]],u.srcAlpha=a[e[3]],u.dstAlpha=a[e[4]])}var t,n,s,a,u={clear:!1};return this.resize=function(){var e,i,r,o,s,a=this.inputs.sizeMode,u=this.inputs.bottom,l=this.inputs.top;for("bottom"===a||"top"===a?(r=this.inputs[a],r?(e=r.width,i=r.height):(e=1,i=1)):u?l?(o="union"===a?Math.max:Math.min,e=o(u.width,l.width),i=o(u.height,l.height)):(e=u.width,i=u.height):l?(e=l.width,i=l.height):(e=1,i=1),(this.width!==e||this.height!==i)&&(this.width=e,this.height=i,this.uniforms.resolution[0]=e,this.uniforms.resolution[1]=i,this.frameBuffer&&this.frameBuffer.resize(e,i),this.emit("resize"),this.setDirty()),this.uniforms.resBottom[0]=u&&u.width||1,this.uniforms.resBottom[1]=u&&u.height||1,this.uniforms.resTop[0]=l&&l.width||1,this.uniforms.resTop[1]=l&&l.height||1,t&&(u&&(n.resolution[0]=u.width,n.resolution[1]=u.height),l&&(t.resolution[0]=l.width,t.resolution[1]=l.height)),s=0;s 1.0)"," hsl.x -= 1.0;"," }"," return hsl;","}","float HueToRGB(float f1, float f2, float hue) {"," if (hue < 0.0)"," hue += 1.0;"," else if (hue > 1.0)"," hue -= 1.0;"," float res;"," if ((6.0 * hue) < 1.0)"," res = f1 + (f2 - f1) * 6.0 * hue;"," else if ((2.0 * hue) < 1.0)"," res = f2;"," else if ((3.0 * hue) < 2.0)"," res = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;"," else"," res = f1;"," return res;","}","vec3 HSLToRGB(vec3 hsl) {"," vec3 rgb;"," if (hsl.y == 0.0)"," rgb = vec3(hsl.z);"," else {"," float f2;"," if (hsl.z < 0.5)"," f2 = hsl.z * (1.0 + hsl.y);"," else"," f2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);"," float f1 = 2.0 * hsl.z - f2;"," rgb.r = HueToRGB(f1, f2, hsl.x + (1.0/3.0));"," rgb.g = HueToRGB(f1, f2, hsl.x);"," rgb.b= HueToRGB(f1, f2, hsl.x - (1.0/3.0));"," }"," return rgb;","}","vec3 BlendHue(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(RGBToHSL(blend).r, baseHSL.g, baseHSL.b));","}","vec3 BlendSaturation(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, RGBToHSL(blend).g, baseHSL.b));","}","vec3 BlendColor(vec3 base, vec3 blend) {"," vec3 blendHSL = RGBToHSL(blend);"," return HSLToRGB(vec3(blendHSL.r, blendHSL.g, RGBToHSL(base).b));","}","vec3 BlendLuminosity(vec3 base, vec3 blend) {"," vec3 baseHSL = RGBToHSL(base);"," return HSLToRGB(vec3(baseHSL.r, baseHSL.g, RGBToHSL(blend).b));","}","vec3 BlendLighterColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal > baseTotal ? blend : base;","}","vec3 BlendDarkerColor(vec3 base, vec3 blend) {"," float baseTotal = base.r + base.g + base.b;"," float blendTotal = blend.r + blend.g + blend.b;"," return blendTotal < baseTotal ? blend : base;","}","#define BlendFunction(base, blend) "+i[u],"varying vec2 texCoordBottom;","varying vec2 texCoordTop;","uniform sampler2D top;","uniform sampler2D bottom;","uniform float opacity;","uniform float blendGamma;","vec3 BlendOpacity(vec4 base, vec4 blend, float opacity) {"," vec3 blendedColor = BlendFunction(base.rgb, blend.rgb);"," return mix(base.rgb, blendedColor, opacity * blend.a);","}","vec4 linear(vec4 color, vec3 gamma) {"," return vec4(pow(color.rgb, gamma), color.a);","}","void main(void) {"," vec3 exp = vec3(blendGamma);"," vec4 topPixel = linear(texture2D(top, texCoordTop), exp);"," vec4 bottomPixel = texture2D(bottom, texCoordBottom);"," if (topPixel.a == 0.0) {"," gl_FragColor = bottomPixel;"," } else {"," bottomPixel = linear(bottomPixel, exp);"," gl_FragColor = vec4(pow(BlendOpacity(bottomPixel, topPixel, opacity), 1.0 / exp), bottomPixel.a);"," }","}"].join("\n"),s)},draw:function(e,i,o,s,l){r[this.inputs.mode]?(this.inputs.bottom?l(e,i,n,s):(a.viewport(0,0,this.width,this.height),a.bindFramebuffer(a.FRAMEBUFFER,s),a.clearColor(0,0,0,0),a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT)),this.inputs.top&&this.inputs.opacity&&l(e,i,t,s,null,u)):l(e,i,o,s)},requires:function(e){return this.inputs.opacity||"top"!==e?!0:!1},inputs:{top:{type:"image",uniform:"top",update:function(){t&&(t.source=this.inputs.top,t.transform=this.inputs.top.cumulativeMatrix||o),this.resize()}},bottom:{type:"image",uniform:"bottom",update:function(){n&&(n.source=this.inputs.bottom,n.transform=this.inputs.bottom.cumulativeMatrix||o),this.resize()}},opacity:{type:"number",uniform:"opacity",defaultValue:1,min:0,max:1,updateSources:!0,update:function(e){t&&(t.opacity=e)}},blendGamma:{type:"number",uniform:"blendGamma",defaultValue:2.2,min:0,max:4},sizeMode:{type:"enum",defaultValue:"bottom",options:["bottom","top","union","intersection"],update:function(){this.resize()}},mode:{type:"enum",shaderDirty:!0,defaultValue:"normal",options:[["normal","Normal"],["lighten","Lighten"],["darken","Darken"],["multiply","Multiply"],["average","Average"],["add","Add"],["subtract","Subtract"],["divide","Divide"],["difference","Difference"],["negation","Negation"],["exclusion","Exclusion"],["screen","Screen"],["overlay","Overlay"],["softlight","Soft Light"],["hardlight","Hard Light"],["colordodge","Color Dodge"],["colorburn","Color Burn"],["lineardodge","Linear Dodge"],["linearburn","Linear Burn"],["linearlight","Linear Light"],["vividlight","Vivid Light"],["pinlight","Pin Light"],["hardmix","Hard Mix"],["reflect","Reflect"],["glow","Glow"],["phoenix","Phoenix"],["hue","Hue"],["saturation","Saturation"],["color","color"],["luminosity","Luminosity"],["darkercolor","Darker Color"],["lightercolor","Lighter Color"]],update:function(){e()}}}}},{inPlace:function(){return!!r[this.inputs.mode]},description:"Blend two layers",title:"Blend"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=[.2,.3,.5,.8,1],i=t.length-1,r=[1,0],o=[0,1],n=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("blur",function(s){var a,u,l,f={amount:0,blendGamma:2,inputScale:1,resolution:[this.width,this.height],transform:n,direction:null};return{initialize:function(t){var i;t(),i=this.gl,i&&(l=this.baseShader,a=new e.util.FrameBuffer(i,this.width,this.height),u=new e.util.FrameBuffer(i,this.width,this.height))},commonShader:!0,shader:function(e,t){this.gl;return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","uniform vec2 direction;","uniform float amount;","uniform float inputScale;","const vec2 zero = vec2(0.0);","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position = screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," vTexCoord = texCoord;"," vec2 one = vec2(1.0) * inputScale;"," if (inputScale < 1.0) {"," one -= 1.0 / resolution;"," }"," vTexCoord = max(zero, min(one, texCoord.st * inputScale));"," vec2 amount = direction * (inputScale * amount * 5.0 / resolution);"," for (int i = 0; i < 4; i++) {"," float s = pow(3.0, float(i));"," vTexCoords[i].xy = max(zero, min(one, vTexCoord + amount * s));"," vTexCoords[i].zw = max(zero, min(one, vTexCoord - amount * s));"," }","}"].join("\n"),t.fragment=["precision mediump float;\n","uniform sampler2D source;","uniform float blendGamma;","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","vec3 exp;","vec4 sample(sampler2D sampler, vec2 coord) {"," vec4 pixel = texture2D(sampler, coord);"," pixel.rgb = pow(pixel.rgb, exp);"," return pixel;","}","void main(void) {"," exp = vec3(blendGamma);"," gl_FragColor = sample(source, vTexCoord) / 9.0;"," for (int i = 0; i < 4; i++) {"," gl_FragColor += sample(source, vTexCoords[i].xy) / 9.0;"," gl_FragColor += sample(source, vTexCoords[i].zw) / 9.0;"," }"," gl_FragColor.rgb = pow(gl_FragColor.rgb, 1.0 / exp);","}"].join("\n"),t},draw:function(e,n,s,c,d){var h,m,p,v,g,y={width:0,height:0,blend:!1},x=1;if(p=this.inputs.amount,!p)return s.source=this.inputs.source.texture,void d(l,n,s,c);if(.01>=p)return s.inputScale=1,s.direction=r,s.source=this.inputs.source.texture,d(e,n,s,a.frameBuffer),s.direction=o,s.source=a.texture,void d(e,n,s,c);for(f.amount=p,f.blendGamma=s.blendGamma,f.source=this.inputs.source.texture,h=0;ho&&(o=parseFloat(e))):o=e,0===o||1===o||2===o||3===o?o:l.inputs[r]}function o(){var e,t,i,r,o=l.inputs;for(e=0;et;t++)r[t]=0;r[o.red]=o.redSource===i?1:0,r[4+o.green]=o.greenSource===i?1:0,r[8+o.blue]=o.blueSource===i?1:0,r[12+o.alpha]=o.alphaSource===i?1:0}}function n(){function e(e){var i,r;i=t[e],i||(i=l.sources[e]=t[e]=t.source),r=s.indexOf(i),0>r&&(r=s.length,s.push(i),l.uniforms["source"+r]=i)}var t=l.inputs;s.length=0,e("redSource"),e("greenSource"),e("blueSource"),e("alphaSource"),l.resize(),o()}var s=[],a=[],u=[],l=this;return this.resize=function(){var e,t,i,r,o,n=this.inputs.sizeMode;if(s.length)if(1===s.length)o=s[0],e=o.width,t=o.height;else if("union"===n)for(e=0,t=0,i=0;i 0.0) {"," if (hsl.z < 0.5) {"," hsl.y = delta / (maxColor + minColor);"," } else {"," hsl.y = delta / (2.0 - maxColor - minColor);"," }"," if (c.r == maxColor) {"," hsl.x = (c.g - c.b) / delta;"," } else if (c.g == maxColor) {"," hsl.x = 2.0 + (c.b - c.r) / delta;"," } else {"," hsl.x = 4.0 + (c.r - c.g) / delta;"," }"," hsl.x = hsl.x * 360.0 / 6.0;"," if (hsl.x < 0.0) {"," hsl.x += 360.0;"," } else {"," hsl.x = mod(hsl.x, 360.0);"," }"," }"," return hsl;","}","void main(void) {"," vec4 color = texture2D(source, vTexCoord);"," vec3 hsl = calcHSL(color.rgb);"," float adjustedHue = mod(hsl.x - adjustedHueRange.x, 360.0);"," float maskValue;"," if (adjustedHue < adjustedHueRange.y) {"," maskValue = smoothstep(0.0, adjustedHueRange.y, adjustedHue);"," } else if (adjustedHue < adjustedHueRange.z) {"," maskValue = 1.0;"," } else {"," maskValue = 1.0 - smoothstep(adjustedHueRange.z, adjustedHueRange.w, adjustedHue);"," }"," if (maskValue > 0.0) {"," if (hsl.y < saturationRange.y) {"," maskValue = min(maskValue, smoothstep(saturationRange.x, saturationRange.y, hsl.y));"," } else {"," maskValue = min(maskValue, 1.0 - smoothstep(saturationRange.z, saturationRange.w, hsl.y));"," }"," }"," if (maskValue > 0.0) {"," if (hsl.z < lightnessRange.y) {"," maskValue = min(maskValue, smoothstep(lightnessRange.x, lightnessRange.z, hsl.y));"," } else {"," maskValue = min(maskValue, 1.0 - smoothstep(lightnessRange.z, lightnessRange.w, hsl.z));"," }"," }"," if (mask) {"," gl_FragColor = vec4(maskValue, maskValue, maskValue, 1.0);"," } else {"," color.a = min(color.a, maskValue);"," gl_FragColor = color;"," }","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},hueMin:{type:"number",uniform:"hueMin",defaultValue:0},hueMax:{type:"number",uniform:"hueMax",defaultValue:360},hueMinFalloff:{type:"number",uniform:"hueMinFalloff",defaultValue:0,min:0},hueMaxFalloff:{type:"number",uniform:"hueMaxFalloff",defaultValue:0,min:0},saturationMin:{type:"number",uniform:"saturationMin",defaultValue:0,min:0,max:1},saturationMax:{type:"number",uniform:"saturationMax",defaultValue:1,min:0,max:1},saturationMinFalloff:{type:"number",uniform:"saturationMinFalloff",defaultValue:0,min:0},saturationMaxFalloff:{type:"number",uniform:"saturationMaxFalloff",defaultValue:0,min:0},lightnessMin:{type:"number",uniform:"lightnessMin",defaultValue:0,min:0,max:1},lightnessMax:{type:"number",uniform:"lightnessMax",defaultValue:1,min:0,max:1},lightnessMinFalloff:{type:"number",uniform:"lightnessMinFalloff",defaultValue:0,min:0},lightnessMaxFalloff:{type:"number",uniform:"lightnessMaxFalloff",defaultValue:0,min:0},mask:{type:"boolean",defaultValue:!1,uniform:"mask"}},title:"Color Select",description:"Create a mask by hue, saturation and lightness range."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("color",function(){function t(){i.resize()}var i=this,r={width:1,height:1},o=!0;return this.resize=function(){var e,t,i,r;for(this.inputs&&this.inputs.width?(e=this.inputs.width,t=this.inputs.height||e):this.inputs&&this.inputs.height?e=t=this.inputs.height:(e=1,t=1),e=Math.floor(e),t=Math.floor(t),(this.width!==e||this.height!==t)&&(this.width=e,this.height=t,this.emit("resize"),this.setDirty()),i=0;i 0.5 ? 1.0 - dist1 : dist1;"," float dist2 = abs(hsv.x - hsvPole2.x);"," dist2 = dist2 > 0.5 ? 1.0 - dist2 : dist2;"," float descent = smoothstep(0.0, correlation, hsv.y);"," vec3 outputHsv = hsv;"," vec3 pole = dist1 < dist2 ? hsvPole1 : hsvPole2;"," float dist = min(dist1, dist2);"," float c = descent * amount * (1.0 - pow((dist * 2.0), 1.0 / concentration));"," outputHsv.x = hueLerp(hsv.x, pole.x, c);"," outputHsv.y = mix(hsv.y, pole.y, c);"," gl_FragColor = vec4(hsvToRgb(outputHsv), pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:.8},concentration:{type:"number",uniform:"concentration",min:.1,max:4,defaultValue:2},correlation:{type:"number",uniform:"correlation",min:0,max:1,defaultValue:.5},guideColor:{type:"color",uniform:"guideColor",defaultValue:[1,.5,0,1]}},title:"Color Complements",categories:["color"],description:"http://theabyssgazes.blogspot.com/2010/03/teal-and-orange-hollywood-please-stop.html"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("colorcube",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","uniform sampler2D source;","uniform sampler2D colorCube;","varying vec2 vTexCoord;","vec3 sampleAs3DTexture(sampler2D tex, vec3 coord, float size) {"," float sliceSize = 1.0 / size;"," float slicePixelSize = sliceSize / size;"," float sliceInnerSize = slicePixelSize * (size - 1.0);"," float zSlice0 = min(floor(coord.z * size), size - 1.0);"," float zSlice1 = min(zSlice0 + 1.0, size - 1.0);"," float xOffset = slicePixelSize * 0.5 + coord.x * sliceInnerSize;"," float s0 = xOffset + (zSlice0 * sliceSize);"," float s1 = xOffset + (zSlice1 * sliceSize);"," vec3 slice0Color = texture2D(tex, vec2(s0, 1.0 - coord.y)).rgb;"," vec3 slice1Color = texture2D(tex, vec2(s1, 1.0 - coord.y)).rgb;"," float zOffset = mod(coord.z * size, 1.0);"," return mix(slice0Color, slice1Color, zOffset);","}","void main(void) {"," vec4 originalColor = texture2D(source, vTexCoord);"," vec3 color = sampleAs3DTexture(colorCube, originalColor.rgb, 8.0);"," gl_FragColor = vec4(color, originalColor.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},cube:{type:"image",uniform:"colorCube"}},title:"Color Cube",description:"" +})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("crop",function(){function e(){var e,i,r=1,o=1;t.inputs.source;for(t.source?(r=t.source.width,o=t.source.height):t.sources&&t.sources.source&&(r=t.sources.source.width,o=t.sources.source.height),r=r-t.inputs.left-t.inputs.right,o=o-t.inputs.top-t.inputs.bottom,r=Math.max(1,Math.floor(r)),o=Math.max(1,Math.floor(o)),(t.width!==r||t.height!==o)&&(t.width=r,t.height=o,t.uniforms.resolution[0]=r,t.uniforms.resolution[1]=o,t.frameBuffer&&t.frameBuffer.resize(t.width,t.height),t.emit("resize"),t.setDirty()),i=0;i 0.33 && cbtype < 0.66) {"," lms = vec3( LMS.r, (0.494207 * LMS.r) + (1.24827 * LMS.b), LMS.b );"," }"," if (cbtype > 0.66) {"," lms = vec3( LMS.r, LMS.g, (-0.395913 * LMS.r) + (0.801109 * LMS.g) );"," }"," const mat3 LMSRGB = mat3( 0.0809444479, -0.130504409, 0.116721066, -0.0102485335, 0.0540193266, -0.113614708, -0.000365296938, -0.00412161469, 0.693511405 );"," vec3 RGB = lms * LMSRGB;"," RGB.rgb = color.rgb - RGB.rgb;"," RGB.g = 0.7*RGB.r + RGB.g;"," RGB.b = 0.7*RGB.r + RGB.b;"," color.rgb = color.rgb + RGB.rgb;"," gl_FragColor = color;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},type:{title:"Type",type:"enum",uniform:"cbtype",defaultValue:"0.2",options:[["0.0","Off"],["0.2","Protanope"],["0.6","Deuteranope"],["0.8","Tritanope"]]}},title:"Daltonize",description:"Add contrast to colours to assist CVD (colour-blind) users."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=[.2,.3,.5,.8],i=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("directionblur",function(r){var o,n,s={amount:0,blendGamma:2,angle:0,inputScale:1,resolution:[this.width,this.height],transform:i,projection:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])};return{initialize:function(t){var i;t(),i=this.gl,i&&(o=[new e.util.FrameBuffer(i,this.width,this.height),new e.util.FrameBuffer(i,this.width,this.height)])},commonShader:!0,shader:function(e,t){this.gl;return n=this.baseShader,t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 projection;","uniform mat4 transform;","uniform float angle;","uniform float amount;","uniform float inputScale;","const vec2 zero = vec2(0.0);","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position = screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," vTexCoord = texCoord;"," vec2 one = vec2(1.0) * inputScale;"," if (inputScale < 1.0) {"," one -= 1.0 / resolution;"," }"," vTexCoord = max(zero, min(one, texCoord.st * inputScale));"," vec2 amount = vec2(cos(angle), sin(angle)) * amount * 5.0 / resolution;"," for (int i = 0; i < 4; i++) {"," float s = pow(3.0, float(i));"," vTexCoords[i].xy = max(zero, min(one, vTexCoord + amount * s));"," vTexCoords[i].zw = max(zero, min(one, vTexCoord - amount * s));"," }","}"].join("\n"),t.fragment=["precision mediump float;\n","uniform sampler2D source;","uniform float angle;","uniform float amount;","uniform float blendGamma;","varying vec2 vTexCoord;","varying vec4 vTexCoords[4];","vec3 exp;","vec4 sample(sampler2D sampler, vec2 coord) {"," vec4 pixel = texture2D(sampler, coord);"," pixel.rgb = pow(pixel.rgb, exp);"," return pixel;","}","void main(void) {"," exp = vec3(blendGamma);"," gl_FragColor = sample(source, vTexCoord) / 9.0;"," for (int i = 0; i < 4; i++) {"," gl_FragColor += sample(source, vTexCoords[i].xy) / 9.0;"," gl_FragColor += sample(source, vTexCoords[i].zw) / 9.0;"," }"," gl_FragColor.rgb = pow(gl_FragColor.rgb, 1.0 / exp);","}"].join("\n"),t},draw:function(e,i,r,a,u){var l,f,c,d,h,m,p={width:0,height:0,blend:!1},v=1;if(d=this.inputs.amount,!d)return void u(n,i,r,a);if(.01>=d)return void u(e,i,r,a);for(s.amount=d,s.angle=this.inputs.angle,s.projection[0]=this.height/this.width,l=0;l 1.0 || pos.y < 0.0 || pos.y > 1.0) {"," "+r," }"," gl_FragColor = texture2D(source, pos);","}"].join("\n"),i},requires:function(e){return this.inputs.mapScale||"map"!==e?!0:!1},resize:function(){var e=this.inputs.source,t=this.inputs.map;e?(this.uniforms.resSource[0]=e.width,this.uniforms.resSource[1]=e.height):(this.uniforms.resSource[0]=1,this.uniforms.resSource[1]=1),t?(this.uniforms.resMap[0]=t.width,this.uniforms.resMap[1]=t.height):(this.uniforms.resMap[0]=1,this.uniforms.resMap[1]=1)}}},{inputs:{source:{type:"image",uniform:"source"},map:{type:"image",uniform:"map"},xChannel:{type:"enum",defaultValue:"red",options:["red","green","blue","alpha","luma","lightness","none"],update:function(e){this.uniforms.xVector=i[e]}},yChannel:{type:"enum",defaultValue:"green",options:["red","green","blue","alpha","luma","lightness","none"],update:function(e){this.uniforms.yVector=i[e]}},fillMode:{type:"enum",shaderDirty:!0,defaultValue:"color",options:["color","wrap","clamp","ignore"]},color:{type:"color",uniform:"color",defaultValue:[0,0,0,0]},offset:{type:"number",uniform:"offset",defaultValue:.5},mapScale:{type:"vector",dimensions:2,uniform:"mapScale",defaultValue:[1,1],updateSources:!0},amount:{type:"number",uniform:"amount",defaultValue:1}},title:"Displacement Map",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("dither",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","#define mod4(a) (a >= 4 ? a - 4 : a)","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","const mat4 dither = mat4(1.0, 33.0, 9.0, 41.0,49.0, 17.0, 57.0, 25.0,13.0, 45.0, 5.0, 37.0,61.0, 29.0, 53.0, 21.0);","float find_closest(int x, int y, float c0) {"," float limit = 0.0;"," int x4 = mod4(x);"," int y4 = mod4(y);"," for (int i = 0; i < 4; i++) {"," if (i == x4) {"," for (int j = 0; j < 4; j++) {"," if (j == y4) {"," limit = dither[i][j];"," break;"," }"," }"," }"," }"," if (x < 4) {"," if (y >= 4) {"," limit += 3.0;"," }"," } else {"," if (y >= 4) {"," limit += 1.0;"," } else {"," limit += 2.0;"," }"," }"," limit /= 65.0;"," return c0 < limit ? 0.0 : 1.0;","}","void main (void) {"," vec4 pixel = texture2D(source, vTexCoord);"," vec2 coord = vTexCoord * resolution;"," int x = int(mod(coord.x, 8.0));"," int y = int(mod(coord.y, 8.0));"," pixel.r = find_closest(x, y, pixel.r);"," pixel.g = find_closest(x, y, pixel.g);"," pixel.b = find_closest(x, y, pixel.b);"," gl_FragColor = pixel;","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source"}},title:"Dither"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";function t(e,t){var i;for(i=0;i 0.5 ? d / (2.0 - hi - lo) : d / (hi + lo);","}"].join("\n"),global:!0},lightness:{source:["float lightness(float r, float g, float b) {"," float lo = min(r, min(g, b));"," float hi = max(r, max(g, b));"," return (lo + hi) / 2.0;","}"].join("\n"),global:!0},hue:{source:["float hue(float r, float g, float b) {"," float h;"," if (r > g && r > b) {"," h = (g - b) / d + (g < b ? 6.0 : 0.0);"," } else if (g > r && g > b) {"," h = (b - r) / d + 2.0;"," } else {"," h = (r - g) / d + 4.0;"," }"," return h / 6.0;","}"].join("\n"),global:!0}},u={radians:1,degrees:1,sin:1,cos:1,tan:1,asin:1,acos:1,atan:1,pow:2,exp:1,log:1,exp2:1,log2:1,sqrt:1,inversesqrt:1,abs:1,sign:1,floor:1,ceil:1,fract:1,mod:2,min:2,max:2,clamp:3,mix:3,step:2,smoothstep:3,and:2,or:2,atan2:2,hue:3,saturation:3,lightness:3,luminance:3},l={"-":!0,"!":!0,"+":!0},f={"+":!1,"-":!1,"*":!1,"/":!1,"%":"mod","&&":"and","||":"or","===":"==","==":!0,"!==":"!=","!=":!0,">=":!0,"<=":!0,"<":!0,">":!0};["E","LN2","LN10","LOG2E","LOG10E","PI","SQRT1_2","SQRT2"].forEach(function(e){s[e]=e,a[e]={source:"const float "+e+" = "+Math[e]+";",global:!0}});for(r in s)s.hasOwnProperty(r)&&(o=s[r],"string"==typeof o&&(o=[o]),i=o[0].split("."),i.length>1&&o.push(i[0]),s[r]=o);for(r in a)a.hasOwnProperty(r)&&(o=a[r],"string"==typeof o&&(a[r]={source:o,global:!1}));e.plugin("expression",function(){function e(){var e=i.inputs;e.blue===e.red&&e.green===e.blue?e.rgb=e.red:e.rgb=""}var i=this;return{shader:function(e,i){function r(e){var i,n,c,d;if("MemberExpression"===e.type)throw new Error('Expression Error: Unknown object "'+(e.object.name||"this")+'"');if("BinaryExpression"===e.type||"LogicalExpression"===e.type){if(!e.right)throw new Error("Expression Error: Bad binary expression");if(!e.left)return e.type="UnaryExpression",e.argument=e.right,r(e);if(i=e.operator,n=f[i],void 0===n)throw new Error('Expression Error: Unknown operator "'+i+'"');if("string"==typeof n)if(n in f)i=f[n],n=f[i];else if(2===u[n])return o[n]=!0,n+"("+r(e.left)+", "+r(e.right)+")";return(n?"float":"")+"("+r(e.left)+" "+i+" "+r(e.right)+")"}if("CallExpression"===e.type){if("Identifier"!==e.callee.type)throw new Error("Expression Error: Unknown function");if(i=e.callee.name,n=u[i],void 0===n)throw new Error('Expression Error: Unknown function "'+i+'"');if(n>e.arguments.length)throw new Error('Expression Error: Function "'+i+'" requires at least '+n+" arguments");for(d=[],c=0;n>c;c++)d.push(r(e.arguments[c]));return o[i]=!0,i+"("+d.join(", ")+")"}if("Identifier"===e.type){if(d=s[e.name],!d)throw new Error('Expression Error: Unknown identifier "'+e.name+'"');for(c=d.length-1;c>=0;c--)n=d[c],a[n]&&(o[n]=!0);return d[0]}if("Literal"===e.type){if("true"===e.raw)return 1;if("true"===e.raw)return 0;if("number"!=typeof e.value||isNaN(e.value))throw new Error("Expression Error: Invalid literal "+e.raw);return t(e.value)}if("UnaryExpression"===e.type){if(i=e.operator,n=l[i],!n)throw new Error('Expression Error: Unknown operator "'+i+'"');return i+"("+r(e.argument)+")"}}var o,c,d,h,m,p={},v={red:"",green:"",blue:"",alpha:""},g={},y=[],x=[],b=[];for(d in v)v.hasOwnProperty(d)&&(c=e[d]||d,v[d]=c,p[c]="");for(c in p)if(p.hasOwnProperty(c))try{o={},m=n(c),p[c]=r(m);for(d in o)o.hasOwnProperty(d)&&(g[d]=o[d]);o.luma&&(g.rgba=!0)}catch(w){console.log(w.message),p[c]="0.0"}for(d in g)g.hasOwnProperty(d)&&(o=a[d],o&&(o.global?y.push(o.source):x.push(" "+o.source)));for(d in v)v.hasOwnProperty(d)&&(c=v[d],b.push(p[c]));return h=["precision mediump float;","varying vec2 vTexCoord;","varying vec4 vPosition;","uniform sampler2D source;","uniform float a, b, c, d;","uniform vec2 resolution;",y.join("\n"),"void main(void) {",x.join("\n")," gl_FragColor = vec4("," "+b.join(",\n ")," );","}"],i.fragment=h.join("\n"),i},inputs:{source:{type:"image",uniform:"source",shaderDirty:!0},a:{type:"number",uniform:"a",defaultValue:0},b:{type:"number",uniform:"b",defaultValue:0},c:{type:"number",uniform:"c",defaultValue:0},d:{type:"number",uniform:"d",defaultValue:0},rgb:{type:"string",update:function(e){var t=i.inputs;t.red=t.green=t.blue=e},shaderDirty:!0},red:{type:"string",update:e,shaderDirty:!0},green:{type:"string",update:e,shaderDirty:!0},blue:{type:"string",update:e,shaderDirty:!0},alpha:{type:"string",shaderDirty:!0}}}},{inPlace:!1,title:"Expression"}),!function(e){var t="Compound",i="Identifier",r="MemberExpression",o="Literal",n="ThisExpression",s="CallExpression",a="UnaryExpression",u="BinaryExpression",l="LogicalExpression",f=!0,c={"-":f,"!":f,"~":f,"+":f},d={"||":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10},h=function(e){var t,i=0;for(var r in e)(t=r.length)>i&&e.hasOwnProperty(r)&&(i=t);return i},m=h(c),p=h(d),v={"true":!0,"false":!1,"null":null},g="this",y=function(e){return d[e]||0},x=function(e,t,i){var r="||"===e||"&&"===e?l:u;return{type:r,operator:e,left:t,right:i}},b=function(e){return e>=48&&57>=e},w=function(e){return 36===e||95===e||e>=65&&90>=e||e>=97&&122>=e},T=function(e){return 36===e||95===e||e>=65&&90>=e||e>=97&&122>=e||e>=48&&57>=e},C=function(e){for(var u,l,f=0,h=e.charAt,C=e.charCodeAt,E=function(t){return h.call(e,t)},S=function(t){return C.call(e,t)},R=e.length,D=function(){for(var e=S(f);32===e||9===e;)e=S(++f)},P=function(){D();for(var t=e.substr(f,p),i=t.length;i>0;){if(d.hasOwnProperty(t))return f+=i,t;t=t.substr(0,--i)}return!1},B=function(){var e,t,i,r,o,n,s,a;if(n=_(),t=P(),!t)return n;if(o={value:t,prec:y(t)},s=_(),!s)throw new Error("Expected expression after "+t+" at character "+f);for(r=[n,o,s];(t=P())&&(i=y(t),0!==i);){for(o={value:t,prec:i};r.length>2&&i<=r[r.length-2].prec;)s=r.pop(),t=r.pop().value,n=r.pop(),e=x(t,n,s),r.push(e);if(e=_(),!e)throw new Error("Expected expression after "+t+" at character "+f);r.push(o),r.push(e)}for(a=r.length-1,e=r[a];a>1;)e=x(r[a-1].value,r[a-2],e),a-=2;return e},_=function(){var t,i,r;if(D(),t=S(f),b(t)||46===t)return F();if(39===t||34===t)return z();if(w(t))return L();if(40===t)return O();for(i=e.substr(f,m),r=i.length;r>0;){if(c.hasOwnProperty(i))return f+=r,{type:a,operator:i,argument:_(),prefix:!0};i=i.substr(0,--r)}return!1},F=function(){for(var e="";b(S(f));)e+=E(f++);if("."===E(f))for(e+=E(f++);b(S(f));)e+=E(f++);if("e"===E(f)||"E"===E(f)){for(e+=E(f++),("+"===E(f)||"-"===E(f))&&(e+=E(f++));b(S(f));)e+=E(f++);if(!b(S(f-1)))throw new Error("Expected exponent ("+e+E(f)+") at character "+f)}if(w(S(f)))throw new Error("Variable names cannot start with a number ("+e+E(f)+") at character "+f);return{type:o,value:parseFloat(e),raw:e}},z=function(){for(var e,t="",i=E(f++),r=!1;R>f;){if(e=E(f++),e===i){r=!0;break}if("\\"===e)switch(e=E(f++)){case"n":t+="\n";break;case"r":t+="\r";break;case"t":t+=" ";break;case"b":t+="\b";break;case"f":t+="\f";break;case"v":t+=" "}else t+=e}if(!r)throw new Error('Unclosed quote after "'+t+'"');return{type:o,value:t,raw:i+t+i}},A=function(){var t,r=S(f),s=f;if(!w(r))throw new Error("Unexpected "+E(f)+"at character "+f);for(f++;R>f&&(r=S(f),T(r));)f++;return t=e.slice(s,f),v.hasOwnProperty(t)?{type:o,value:v[t],raw:t}:t===g?{type:n}:{type:i,name:t}},M=function(){for(var e,i,r=[];R>f;){if(D(),e=E(f),")"===e){f++;break}if(","===e)f++;else{if(i=B(),!i||i.type===t)throw new Error("Expected comma at character "+f);r.push(i)}}return r},L=function(){var e,t,i;for(t=A(),D(),e=E(f);"."===e||"["===e||"("===e;){if("."===e)f++,D(),t={type:r,computed:!1,object:t,property:A()};else if("["===e){if(i=f,f++,t={type:r,computed:!0,object:t,property:B()},D(),e=E(f),"]"!==e)throw new Error("Unclosed [ at character "+f);f++,D()}else"("===e&&(f++,t={type:s,arguments:M(),callee:t});D(),e=E(f)}return t},O=function(){f++;var e=B();if(D(),")"===E(f))return f++,e;throw new Error("Unclosed ( at character "+f)},N=[];R>f;)if(u=E(f),";"===u||","===u)f++;else if(l=B())N.push(l);else if(R>f)throw new Error("Unexpected '"+E(f)+"' at character "+f);return 1===N.length?N[0]:{type:t,body:N}};if(C.version="0.2.9",C.toString=function(){return"JavaScript Expression Parser (JSEP) v"+C.version},C.addUnaryOp=function(e){return c[e]=f,this},C.addBinaryOp=function(e,t){return p=Math.max(e.length,p),d[e]=t,this},C.removeUnaryOp=function(e){return delete c[e],e.length===m&&(m=h(c)),this},C.removeBinaryOp=function(e){return delete d[e],e.length===p&&(p=h(d)),this},"undefined"==typeof exports){var E=e.jsep;e.jsep=C,C.noConflict=function(){return e.jsep===C&&(e.jsep=E),C}}else"undefined"!=typeof module&&module.exports?exports=module.exports=C:exports.parse=C}(window),n=window.jsep.noConflict()}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("fader",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec4 color;","uniform float amount;","void main(void) {"," gl_FragColor = texture2D(source, vTexCoord);"," gl_FragColor = mix(gl_FragColor, color, amount);","}"].join("\n"),t},requires:function(e,t){return t.amount<1},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},color:{type:"color",uniform:"color",defaultValue:[0,0,0,1]},amount:{type:"number",uniform:"amount",defaultValue:.5,min:0,max:1}},title:"Fader",description:"Fade image to a color"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("falsecolor",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","uniform vec4 black;","uniform vec4 white;","const vec3 luma = vec3(0.2125, 0.7154, 0.0721);","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float luminance = dot(pixel.rgb, luma);"," vec4 result = mix(black, white, luminance);"," gl_FragColor = vec4(result.rgb, pixel.a * result.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},black:{type:"color",uniform:"black",defaultValue:[0,0,.5,1]},white:{type:"color",uniform:"white",defaultValue:[1,0,0,1]}},title:"False Color"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("filmgrain",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","uniform float time;","uniform float amount;","uniform bool colored;","float timer;","const float permTexUnit = 1.0/256.0;","const float permTexUnitHalf = 0.5/256.0;","vec4 rnm(in vec2 tc) {"," float noise = sin(dot(tc + vec2(timer,timer),vec2(12.9898,78.233))) * 43758.5453;"," float noiseR = fract(noise)*2.0-1.0;"," float noiseG = fract(noise*1.2154)*2.0-1.0; "," float noiseB = fract(noise*1.3453)*2.0-1.0;"," float noiseA = fract(noise*1.3647)*2.0-1.0;"," "," return vec4(noiseR,noiseG,noiseB,noiseA);","}","float fade(in float t) {"," return t*t*t*(t*(t*6.0-15.0)+10.0);","}","float pnoise3D(in vec3 p) {"," vec3 pi = permTexUnit*floor(p)+permTexUnitHalf;"," vec3 pf = fract(p);"," float perm00 = rnm(pi.xy).a ;"," vec3 grad000 = rnm(vec2(perm00, pi.z)).rgb * 4.0 - 1.0;"," float n000 = dot(grad000, pf);"," vec3 grad001 = rnm(vec2(perm00, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n001 = dot(grad001, pf - vec3(0.0, 0.0, 1.0));"," float perm01 = rnm(pi.xy + vec2(0.0, permTexUnit)).a ;"," vec3 grad010 = rnm(vec2(perm01, pi.z)).rgb * 4.0 - 1.0;"," float n010 = dot(grad010, pf - vec3(0.0, 1.0, 0.0));"," vec3 grad011 = rnm(vec2(perm01, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n011 = dot(grad011, pf - vec3(0.0, 1.0, 1.0));"," float perm10 = rnm(pi.xy + vec2(permTexUnit, 0.0)).a ;"," vec3 grad100 = rnm(vec2(perm10, pi.z)).rgb * 4.0 - 1.0;"," float n100 = dot(grad100, pf - vec3(1.0, 0.0, 0.0));"," vec3 grad101 = rnm(vec2(perm10, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n101 = dot(grad101, pf - vec3(1.0, 0.0, 1.0));"," float perm11 = rnm(pi.xy + vec2(permTexUnit, permTexUnit)).a ;"," vec3 grad110 = rnm(vec2(perm11, pi.z)).rgb * 4.0 - 1.0;"," float n110 = dot(grad110, pf - vec3(1.0, 1.0, 0.0));"," vec3 grad111 = rnm(vec2(perm11, pi.z + permTexUnit)).rgb * 4.0 - 1.0;"," float n111 = dot(grad111, pf - vec3(1.0, 1.0, 1.0));"," vec4 n_x = mix(vec4(n000, n001, n010, n011), vec4(n100, n101, n110, n111), fade(pf.x));"," vec2 n_xy = mix(n_x.xy, n_x.zw, fade(pf.y));"," float n_xyz = mix(n_xy.x, n_xy.y, fade(pf.z));"," return n_xyz;","}","void main(void) {"," timer = mod(time, 10000.0) / 10000.0;"," vec4 pixel = texture2D(source, vTexCoord);"," vec3 noise = vec3(pnoise3D(vec3(vTexCoord * resolution, timer + 0.0)));"," if (colored) {"," noise.g = pnoise3D(vec3(vTexCoord * resolution, timer + 1.0));"," noise.b = pnoise3D(vec3(vTexCoord * resolution, timer + 2.0));"," }"," gl_FragColor = vec4(pixel.rgb + noise * amount, pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source", +shaderDirty:!1},time:{type:"number",uniform:"time",mod:65536},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:.03},colored:{type:"boolean",uniform:"colored",defaultValue:!1}},title:"Film Grain",description:"Don't over-do it."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("freeze",{draw:function(e,t,i,r,o){this.inputs.frozen||o(e,t,i,r)},requires:function(){return!this.inputs.frozen},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},frozen:{type:"boolean",defaultValue:!1,updateSources:!0}},title:"Freeze",description:"Freeze Frame"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("fxaa",{commonShader:!0,shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","varying vec2 vTexCoord;","varying vec2 vTexCoordNW;","varying vec2 vTexCoordNE;","varying vec2 vTexCoordSW;","varying vec2 vTexCoordSE;","const vec2 diag = vec2(1.0, -1.0);","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," gl_Position.w = screenPosition.w;"," vTexCoord = texCoord;"," vec2 invRes = 1.0 / resolution;"," vTexCoordNW = texCoord - invRes;"," vTexCoordNE = texCoord + invRes * diag;"," vTexCoordSW = texCoord - invRes * diag;"," vTexCoordSE = texCoord + invRes;","}\n"].join("\n"),t.fragment=["precision mediump float;","#define FXAA_REDUCE_MIN (1.0 / 128.0)","#define FXAA_REDUCE_MUL (1.0 / 8.0)","#define FXAA_SPAN_MAX 8.0","varying vec2 vTexCoord;","varying vec2 vTexCoordNW;","varying vec2 vTexCoordNE;","varying vec2 vTexCoordSW;","varying vec2 vTexCoordSE;","uniform vec2 resolution;","uniform sampler2D source;","const vec3 luma = vec3(0.299, 0.587, 0.114);","void main(void) {"," vec4 original = texture2D(source, vTexCoord);"," vec3 rgbNW = texture2D(source, vTexCoordNW).rgb;"," vec3 rgbNE = texture2D(source, vTexCoordNE).rgb;"," vec3 rgbSW = texture2D(source, vTexCoordSW).rgb;"," vec3 rgbSE = texture2D(source, vTexCoordSE).rgb;"," float lumaNW = dot(rgbNW, luma);"," float lumaNE = dot(rgbNE, luma);"," float lumaSW = dot(rgbSW, luma);"," float lumaSE = dot(rgbSE, luma);"," float lumaM = dot(original.rgb, luma);"," float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));"," float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));"," vec2 dir = vec2(-((lumaNW + lumaNE) - (lumaSW + lumaSE)), ((lumaNW + lumaSW) - (lumaNE + lumaSE)));"," float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * 0.25 * FXAA_REDUCE_MUL, FXAA_REDUCE_MIN);"," float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);"," dir = min(vec2(FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX), dir * rcpDirMin)) / resolution;"," vec3 rgbA = 0.5 * ("," texture2D(source, vTexCoord + dir * (1.0 / 3.0 - 0.5)).rgb +"," texture2D(source, vTexCoord + dir * (2.0 / 3.0 - 0.5)).rgb);"," vec3 rgbB = rgbA * 0.5 + 0.25 * ("," texture2D(source, vTexCoord - dir * 0.5).rgb +"," texture2D(source, vTexCoord + dir * 0.5).rgb);"," float lumaB = dot(rgbB, luma);"," if (lumaB < lumaMin || lumaB > lumaMax) {"," gl_FragColor = vec4(rgbA, original.a);"," } else {"," gl_FragColor = vec4(rgbB, original.a);"," }","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1}},title:"FXAA",description:"Fast approximate anti-aliasing"})}),function(e,t){"use strict";"object"==typeof exports?t(require("seriously")):"function"==typeof define&&define.amd?define(["seriously"],t):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("gradientwipe",function(){return this.uniforms.resGradient=[1,1],this.uniforms.resSource=[1,1],{shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform vec2 resSource;","uniform vec2 resGradient;","varying vec2 texCoordSource;","varying vec2 texCoordGradient;","const vec2 HALF = vec2(0.5);","void main(void) {"," gl_Position = position;"," vec2 adjusted = (texCoord - HALF) * resolution;"," texCoordSource = adjusted / resSource + HALF;"," texCoordGradient = adjusted / resGradient + HALF;","}"].join("\n"),t.fragment=["precision mediump float;\n","varying vec2 texCoordSource;","varying vec2 texCoordGradient;","uniform sampler2D source;","uniform sampler2D gradient;","uniform float transition;","uniform float smoothness;","uniform bool invert;","const vec3 lumcoeff = vec3(0.2125,0.7154,0.0721);","void main(void) {"," float gradientVal = 1.0 - dot(texture2D(gradient, texCoordGradient).rgb, lumcoeff);"," if (invert) {"," gradientVal = 1.0 - gradientVal;"," }"," float amount = 1.0 - transition;"," float mn = (amount - smoothness * (1.0 - amount));"," float mx = (amount + smoothness * amount);"," if (gradientVal <= mn) {"," gl_FragColor = texture2D(source, texCoordSource);"," return;"," }"," if (gradientVal >= mx) {"," gl_FragColor = vec4(0.0);"," return;"," }"," float alpha = mix(1.0, 0.0, smoothstep(mn, mx, gradientVal));"," vec4 pixel = texture2D(source, texCoordSource);"," gl_FragColor = vec4(pixel.rgb, pixel.a * alpha);","}"].join("\n"),t},draw:function(e,t,i,r,o){var n;return i.transition<=0?void o(this.baseShader,t,i,r):i.transition>=1?(n=this.gl,n.viewport(0,0,this.width,this.height),n.bindFramebuffer(n.FRAMEBUFFER,r),n.clearColor(0,0,0,0),void n.clear(n.COLOR_BUFFER_BIT|n.DEPTH_BUFFER_BIT)):void o(e,t,i,r)},inPlace:!1,requires:function(e,t){return"source"===e&&t.transition>=1?!1:"gradient"===e&&(t.transition<=0||t.transition>=1)?!1:!0},resize:function(){var e=this.inputs.source,t=this.inputs.gradient;e?(this.uniforms.resSource[0]=e.width,this.uniforms.resSource[1]=e.height):(this.uniforms.resSource[0]=1,this.uniforms.resSource[1]=1),t?(this.uniforms.resGradient[0]=t.width,this.uniforms.resGradient[1]=t.height):(this.uniforms.resGradient[0]=1,this.uniforms.resGradient[1]=1)}}},{inputs:{source:{type:"image",uniform:"source"},gradient:{type:"image",uniform:"gradient"},transition:{type:"number",uniform:"transition",defaultValue:0},invert:{type:"boolean",uniform:"invert",defaultValue:!1},smoothness:{type:"number",uniform:"smoothness",defaultValue:0,min:0,max:1}},title:"Gradient Wipe"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("hex",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;\n","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","uniform vec2 center;","uniform float size;","void main(void) {"," vec2 aspect = normalize(resolution);"," vec2 tex = (vTexCoord * aspect - center) / size;"," tex.y /= 0.866025404;"," tex.x -= tex.y * 0.5;"," vec2 a;"," if (tex.x + tex.y - floor(tex.x) - floor(tex.y) < 1.0) {"," a = vec2(floor(tex.x), floor(tex.y));"," } else {"," a = vec2(ceil(tex.x), ceil(tex.y));"," }"," vec2 b = vec2(ceil(tex.x), floor(tex.y));"," vec2 c = vec2(floor(tex.x), ceil(tex.y));"," vec3 tex3 = vec3(tex.x, tex.y, 1.0 - tex.x - tex.y);"," vec3 a3 = vec3(a.x, a.y, 1.0 - a.x - a.y);"," vec3 b3 = vec3(b.x, b.y, 1.0 - b.x - b.y);"," vec3 c3 = vec3(c.x, c.y, 1.0 - c.x - c.y);"," float alen =length(tex3 - a3);"," float blen =length(tex3 - b3);"," float clen =length(tex3 - c3);"," vec2 choice;"," if (alen < blen) {"," if (alen < clen) {"," choice = a;"," } else {"," choice = c;"," }"," } else {"," if (blen < clen) {"," choice = b;"," } else {"," choice = c;"," }"," }"," choice.x += choice.y * 0.5;"," choice.y *= 0.866025404;"," choice *= size / aspect;"," gl_FragColor = texture2D(source, choice + center / aspect);","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},size:{type:"number",uniform:"size",min:0,max:.4,defaultValue:.01},center:{type:"vector",uniform:"center",dimensions:2,defaultValue:[0,0]}},title:"Hex",description:"Hexagonal Pixelate"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("highlights-shadows",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float shadows;","uniform float highlights;","const vec3 luma = vec3(0.2125, 0.7154, 0.0721);","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float luminance = dot(pixel.rgb, luma);"," float shadow = clamp((pow(luminance, 1.0 / (shadows + 1.0)) + (-0.76) * pow(luminance, 2.0 / (shadows + 1.0))) - luminance, 0.0, 1.0);"," float highlight = clamp((1.0 - (pow(1.0 - luminance, 1.0 / (2.0 - highlights)) + (-0.8) * pow(1.0 - luminance, 2.0 / (2.0 - highlights)))) - luminance, -1.0, 0.0);"," vec3 rgb = (luminance + shadow + highlight) * (pixel.rgb / vec3(luminance));"," gl_FragColor = vec4(rgb, pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},highlights:{type:"number",uniform:"highlights",min:0,max:1,defaultValue:1},shadows:{type:"number",uniform:"shadows",min:0,max:1,defaultValue:0}},title:"Highlights/Shadows",description:"Darken highlights, lighten shadows"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("hue-saturation",{commonShader:!0,shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 projection;","uniform mat4 transform;","uniform float hue;","uniform float saturation;","varying vec2 vTexCoord;","varying vec3 weights;","void main(void) {"," float angle = hue * 3.14159265358979323846264;"," float s = sin(angle);"," float c = cos(angle);"," weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c) + 1.0) / 3.0;"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position = screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," vTexCoord = texCoord;","}"].join("\n"),t.fragment=["precision mediump float;","varying vec2 vTexCoord;","varying vec3 weights;","uniform sampler2D source;","uniform float hue;","uniform float saturation;","void main(void) {"," vec4 color = texture2D(source, vTexCoord);"," float len = length(color.rgb);"," color.rgb = vec3(dot(color.rgb, weights.xyz), dot(color.rgb, weights.zxy), dot(color.rgb, weights.yzx) );"," vec3 adjustment = (color.r + color.g + color.b) / 3.0 - color.rgb;"," if (saturation > 0.0) {"," adjustment *= (1.0 - 1.0 / (1.0 - saturation));"," } else {"," adjustment *= (-saturation);"," }"," color.rgb += adjustment;"," gl_FragColor = color;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},hue:{type:"number",uniform:"hue",defaultValue:.4,min:-1,max:1},saturation:{type:"number",uniform:"saturation",defaultValue:0,min:-1,max:1}},title:"Hue/Saturation",description:"Rotate hue and multiply saturation."})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("invert",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","void main(void) {"," gl_FragColor = texture2D(source, vTexCoord);"," gl_FragColor = vec4(1.0 - gl_FragColor.rgb, gl_FragColor.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1}},title:"Invert",description:"Invert image color"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("kaleidoscope",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float segments;","uniform float offset;","const float PI = "+Math.PI+";","const float TAU = 2.0 * PI;","void main(void) {"," if (segments == 0.0) {"," gl_FragColor = texture2D(source, vTexCoord);"," } else {"," vec2 centered = vTexCoord - 0.5;"," float r = length(centered);"," float theta = atan(centered.y, centered.x);"," theta = mod(theta, TAU / segments);"," theta = abs(theta - PI / segments);"," vec2 newCoords = r * vec2(cos(theta), sin(theta)) + 0.5;"," gl_FragColor = texture2D(source, mod(newCoords - offset, 1.0));"," }","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},segments:{type:"number",uniform:"segments",defaultValue:6},offset:{type:"number",uniform:"offset",defaultValue:0}},title:"Kaleidoscope"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),i=/\d+/;e.plugin("layers",function(e){function r(){a.resize()}var o,n,s,a=this,u={clear:!1};for("number"==typeof e&&e>=2?o=e:(o=e&&e.count||4,o=Math.max(2,o)),s={sizeMode:{type:"enum",defaultValue:"0",options:["union","intersection"],update:function(){this.resize()}}},n=0;o>n;n++)s.sizeMode.options.push(n.toString()),s.sizeMode.options.push("source"+n),s["source"+n]={type:"image",update:r},s["opacity"+n]={type:"number",defaultValue:1,min:0,max:1,updateSources:!0};return this.uniforms.layerResolution=[1,1],this.resize=function(){var e,t,r,n,s,a,u=this.inputs.sizeMode;if("union"===u)for(e=0,t=0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.max(e,s.width),t=Math.max(t,s.height));else if("intersection"===u)for(e=1/0,t=1/0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.min(e,s.width),t=Math.min(t,s.height));else e=1,t=1,n=o-1,a=i.exec(this.inputs.sizeMode),a&&(n=Math.min(parseInt(a[0],10),n)),s=this.inputs["source"+n],s&&(e=s.width,t=s.height);if(this.width!==e||this.height!==t)for(this.width=e,this.height=t,this.uniforms.resolution[0]=e,this.uniforms.resolution[1]=t,this.frameBuffer&&this.frameBuffer.resize(e,t),this.emit("resize"),this.setDirty(),r=0;r=o?!1:!(!t[e]||!t["opacity"+n])},draw:function(e,i,r,n,s){var a,l,f,c=this.gl;for(c.viewport(0,0,this.width,this.height),c.bindFramebuffer(c.FRAMEBUFFER,n),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT),a=0;o>a;a++)f=this.inputs["source"+a],l=this.inputs["opacity"+a],f&&l&&(r.opacity=l,r.layerResolution[0]=f.width,r.layerResolution[1]=f.height,r.source=f,r.transform=f.cumulativeMatrix||t,s(e,i,r,n,null,u))},inputs:s}},{inPlace:!0,description:"Multiple layers",title:"Layers"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("linear-transfer",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec4 slope;","uniform vec4 intercept;","const vec3 half3 = vec3(0.5);","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," gl_FragColor = pixel * slope + intercept;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},slope:{type:"vector",dimensions:4,uniform:"slope",defaultValue:[1,1,1,1]},intercept:{type:"vector",uniform:"intercept",dimensions:4,defaultValue:[0,0,0,0]}},title:"Linear Transfer",description:"For each color channel: [slope] * [value] + [intercept]"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("lumakey",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float threshold;","uniform float clipBlack;","uniform float clipWhite;","uniform bool invert;","const vec3 lumcoeff = vec3(0.2125,0.7154,0.0721);","void main (void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float luma = dot(pixel.rgb,lumcoeff);"," float alpha = 1.0 - smoothstep(clipBlack, clipWhite, luma);"," if (invert) alpha = 1.0 - alpha;"," gl_FragColor = vec4(pixel.rgb, min(pixel.a, alpha) );","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},clipBlack:{type:"number",uniform:"clipBlack",defaultValue:.9,min:0,max:1},clipWhite:{type:"number",uniform:"clipWhite",defaultValue:1,min:0,max:1},invert:{type:"boolean",uniform:"invert",defaultValue:!1}},title:"Luma Key",categories:["key"],description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("lut",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D lut;","uniform float amount;","void main(void) {"," vec4 textureColor = texture2D(source, vTexCoord);"," textureColor = clamp(textureColor, 0.0, 1.0);"," float blueColor = textureColor.b * 63.0;"," vec2 quad1;"," quad1.y = floor(floor(blueColor) / 8.0);"," quad1.x = floor(blueColor) - (quad1.y * 8.0);"," vec2 quad2;"," quad2.y = floor(ceil(blueColor) / 8.0);"," quad2.x = ceil(blueColor) - (quad2.y * 8.0);"," vec2 texPos1;"," texPos1 = (quad1 * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.rg);"," vec2 texPos2;"," texPos2 = (quad2 * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.rg);"," lowp vec4 newColor1 = texture2D(lut, vec2(texPos1.x, 1.0 - texPos1.y));"," lowp vec4 newColor2 = texture2D(lut, vec2(texPos2.x, 1.0 - texPos2.y));"," vec4 newColor = mix(newColor1, newColor2, fract(blueColor));"," gl_FragColor = mix(textureColor, newColor, amount);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},lut:{type:"image",uniform:"lut"},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:1}},title:"Color Look-Up Table",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("mirror",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","uniform vec2 resolution;","uniform sampler2D source;","varying vec2 vTexCoord;","void main(void) {"," gl_FragColor = texture2D(source, vec2(0.5 - abs(0.5 - vTexCoord.x), vTexCoord.y));","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"}},title:"Mirror",description:"Shader Mirror Effect"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("nightvision",{commonShader:!0,shader:function(e,t,i){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float time;","uniform float luminanceThreshold;","uniform float amplification;","uniform vec3 nightVisionColor;",i.shader.makeNoise,"void main(void) {"," vec3 noise = vec3(makeNoise(vTexCoord.x, vTexCoord.y, time), makeNoise(vTexCoord.x, vTexCoord.y, time * 200.0 + 1.0), makeNoise(vTexCoord.x, vTexCoord.y, time * 100.0 + 3.0));"," vec4 pixel = texture2D(source, vTexCoord + noise.xy * 0.0025);"," float luminance = dot(vec3(0.299, 0.587, 0.114), pixel.rgb);"," pixel.rgb *= step(luminanceThreshold, luminance) * amplification;"," gl_FragColor = vec4( (pixel.rgb + noise * 0.1) * nightVisionColor, pixel.a);","}"].join("\n"),t},inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},time:{type:"number",uniform:"time",defaultValue:0,mod:65536},luminanceThreshold:{type:"number",uniform:"luminanceThreshold",defaultValue:.1,min:0,max:1},amplification:{type:"number",uniform:"amplification",defaultValue:1.4,min:0},color:{type:"color",uniform:"nightVisionColor",defaultValue:[.1,.95,.2]}},title:"Night Vision",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("noise",{shader:function(e,t,i){var r=["precision mediump float;","#define Blend(base, blend, funcf) vec3(funcf(base.r, blend.r), funcf(base.g, blend.g), funcf(base.b, blend.b))","#define BlendOverlayf(base, blend) (base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)))","#define BlendOverlay(base, blend) Blend(base, blend, BlendOverlayf)","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec2 resolution;","uniform float amount;","uniform float time;",i.shader.noiseHelpers,i.shader.snoise3d,i.shader.random,"void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float r = random(vec2(time * vTexCoord.xy));"," float noise = snoise(vec3(vTexCoord * (1024.4 + r * 512.0), time)) * 0.5;"];return e.overlay?(r.push(" vec3 overlay = BlendOverlay(pixel.rgb, vec3(noise));"),r.push(" pixel.rgb = mix(pixel.rgb, overlay, amount);")):r.push(" pixel.rgb += noise * amount;"),r.push(" gl_FragColor = pixel;}"),t.fragment=r.join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},overlay:{type:"boolean",shaderDirty:!0,defaultValue:!0},amount:{type:"number",uniform:"amount",min:0,max:1,defaultValue:1},time:{type:"number",uniform:"time",defaultValue:0,mod:65536}},title:"Noise",description:"Add noise"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("opticalflow",function(){var t,i;return{initialize:function(r){t=new e.util.FrameBuffer(this.gl,this.width,this.height),r(),i=this.baseShader},resize:function(){t.resize(this.width,this.height)},commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D previous;","uniform vec2 resolution;","uniform vec2 scale;","uniform float offsetX;","uniform float lambda;","void main() {"," vec4 a = texture2D(previous, vTexCoord);"," vec4 b = texture2D(source, vTexCoord);"," vec2 offset = offsetX / resolution;"," vec2 x1 = vec2(offset.x, 0.0);"," vec2 y1 = vec2(0.0, offset.y);"," vec4 curdif = b - a;"," vec4 gradx = texture2D(source, vTexCoord + x1) - texture2D(source, vTexCoord - x1);"," gradx += texture2D(previous, vTexCoord + x1) - texture2D(previous, vTexCoord - x1);"," vec4 grady = texture2D(source, vTexCoord + y1) - texture2D(source, vTexCoord - y1);"," grady += texture2D(previous, vTexCoord + y1) - texture2D(previous, vTexCoord - y1);"," vec4 gradmag = sqrt((gradx * gradx) + (grady * grady) + vec4(lambda));"," vec4 vx = curdif * (gradx / gradmag);"," float vxd = vx.r;"," vec2 xout = vec2(max(vxd, 0.0), abs(min(vxd, 0.0))) * scale.x;"," vec4 vy = curdif * (grady / gradmag);"," float vyd = vy.r;"," vec2 yout = vec2(max(vyd, 0.0), abs(min(vyd, 0.0))) * scale.y;"," gl_FragColor = clamp(vec4(xout.xy, yout.xy), 0.0, 1.0);"," gl_FragColor.a = 1.0;","}"].join("\n"),t},draw:function(e,r,o,n,s){o.previous=t.texture,s(e,r,o,n),s(i,r,o,t.frameBuffer)},destroy:function(){t&&(t.destroy(),t=null)}}},{inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},lambda:{type:"number",uniform:"lambda",min:0,defaultValue:0,description:"noise limiting"},scaleResult:{type:"vector",dimensions:2,uniform:"scale",defaultValue:[1,1]},offset:{type:"number",uniform:"offsetX",defaultValue:1,min:1,max:100,description:"distance between texel samples for gradient calculation"}},description:"Horn-Schunke Optical Flow",title:"Optical Flow"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("panorama",function(){function e(){t.resize()}var t=this;return this.resize=function(){var e,i=this.width,r=this.height,o=t.inputs.source;for(this.source?(i=this.source.width,r=this.source.height):this.sources&&this.sources.source?(i=this.sources.source.width,r=this.sources.source.height):(i=1,r=1),t.inputs.width?(i=t.inputs.width,t.inputs.height?r=t.inputs.height:o&&(r=i*o.height/o.width)):t.inputs.height&&(r=t.inputs.height,o&&(i=r*o.width/o.height)),i=Math.floor(i),r=Math.floor(r),o&&(this.uniforms.resolution[0]=i,this.uniforms.resolution[1]=r),(this.width!==i||this.height!==r)&&(this.width=i,this.height=r,this.frameBuffer&&this.frameBuffer.resize(this.width,this.height),this.emit("resize"),this.setDirty()),e=0;e=0;u--)a(e,o,n,s,null,r),u&&i.multiply(n.transform,c,n.transform)},inputs:{source:{type:"image",uniform:"source",update:function(){e(),this.uniforms.transform=o}},transform:{type:"image"},repeat:{type:"number",step:1,min:0,defaultValue:8},width:{type:"number",min:0,step:1,update:e,defaultValue:0},height:{type:"number",min:0,step:1,update:e,defaultValue:0}}}},{inPlace:!0,description:"Draw image multiple times, transforming each time",title:"Repeat"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("ripple",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float wave;","uniform float distortion;","uniform vec2 center;","void main(void) {"," float scalar = abs(1.0 - abs(distance(vTexCoord, center)));"," float sinOffset = sin(wave / scalar);"," sinOffset = clamp(sinOffset, 0.0, 1.0);"," float sinSign = cos(wave / scalar);"," sinOffset = sinOffset * distortion / 32.0;"," gl_FragColor = texture2D(source, vTexCoord + sinOffset * sinSign);","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source"},wave:{type:"number",uniform:"wave",defaultValue:Math.PI/.75},distortion:{type:"number",uniform:"distortion",defaultValue:1},center:{type:"vector",uniform:"center",dimensions:2,defaultValue:[.5,.5]}},title:"Ripple Distortion",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("scanlines",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float lines;","uniform float width;","uniform float intensity;","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," float darken = 2.0 * abs( fract(vTexCoord.y * lines / 2.0) - 0.5);"," darken = clamp(darken - width + 0.5, 0.0, 1.0);"," darken = 1.0 - ((1.0 - darken) * intensity);"," gl_FragColor = vec4(pixel.rgb * darken, 1.0);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},lines:{type:"number",uniform:"lines",defaultValue:60},size:{type:"number",uniform:"size",defaultValue:.2,min:0,max:1},intensity:{type:"number",uniform:"intensity",defaultValue:.1,min:0,max:1}},title:"Scan Lines",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=/\d+/;e.plugin("select",function(e){function i(){a.resize()}function r(){var e,t=a.inputs.active;e=a.inputs["source"+t],a.texture=e&&e.texture,i()}var o,n,s,a=this;for("number"==typeof e&&e>=2?o=e:(o=e&&e.count||4,o=Math.max(2,o)),s={active:{type:"number",step:1,min:0,max:o-1,defaultValue:0,update:r,updateSources:!0},sizeMode:{type:"enum",defaultValue:"0",options:["union","intersection","active"],update:i}},n=0;o>n;n++)s.sizeMode.options.push(n.toString()),s.sizeMode.options.push("source"+n),s["source"+n]={type:"image",update:r};return this.uniforms.layerResolution=[1,1],this.resize=function(){var e,i,r,n,s,a,u=this.inputs.sizeMode;if("union"===u)for(e=0,i=0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.max(e,s.width),i=Math.max(i,s.height));else if("intersection"===u)for(e=1/0,i=1/0,r=0;o>r;r++)s=this.inputs["source"+r],s&&(e=Math.min(e,s.width),i=Math.min(i,s.height));else if("active"===u)r=this.inputs.active,s=this.inputs["source"+r],e=Math.max(1,s&&s.width||1),i=Math.max(1,s&&s.height||1);else for(e=1,i=1,n=o-1,a=t.exec(this.inputs.sizeMode),a&&(n=Math.min(parseInt(a[0],10),n)),r=0;n>=r;r++)if(s=this.inputs["source"+r]){e=s.width,i=s.height;break}for((this.width!==e||this.height!==i)&&(this.width=e,this.height=i,this.emit("resize"),this.setDirty()),r=0;r=1?(r.source=r.sourceB,void n(e,i,r,o)):r.split<=0?(r.source=r.sourceA,void n(e,i,r,o)):void n(t,i,r,o)},inPlace:!1,requires:function(e,t){return"sourceA"===e&&t.split>=1?!1:"sourceB"===e&&t.split<=0?!1:!0}}},{inputs:{sourceA:{type:"image",uniform:"sourceA",shaderDirty:!1,update:function(){this.resize()}},sourceB:{type:"image",uniform:"sourceB",shaderDirty:!1,update:function(){this.resize()}},sizeMode:{type:"enum",defaultValue:"a",options:["a","b","union","intersection"],update:function(){this.resize()}},split:{type:"number",uniform:"split",defaultValue:.5,min:0,max:1,updateSources:!0},angle:{type:"number",uniform:"angle",defaultValue:0},fuzzy:{type:"number",uniform:"fuzzy",defaultValue:0,min:0,max:1},blendGamma:{type:"number",uniform:"blendGamma",defaultValue:2.2,min:0,max:4}},description:"Split screen or wipe",title:"Split"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("temperature",{commonShader:!0,shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","uniform float temperature;","varying vec2 vTexCoord;","varying vec3 tempFactor;","const vec3 luma = vec3(0.2125,0.7154,0.0721);","vec3 temperatureRGB(float t) {"," float temp = t / 100.0;"," vec3 color = vec3(1.0);"," if (temp < 66.0) {"," color.g = 0.3900815787690196 * log(temp) - 0.6318414437886275;"," color.b = 0.543206789110196 * log(temp - 10.0) - 1.19625408914;"," } else {"," color.r = 1.292936186062745 * pow(temp - 60.0, -0.1332047592);"," color.g = 1.129890860895294 * pow(temp - 60.0, -0.0755148492);"," }"," return color;","}","void main(void) {"," vec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);"," screenPosition = transform * screenPosition;"," gl_Position.xy = screenPosition.xy * 2.0 / resolution;"," gl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);"," gl_Position.w = screenPosition.w;"," vTexCoord = texCoord;"," vec3 tempColor = temperatureRGB(temperature);"," tempFactor = dot(tempColor, luma) / tempColor;","}\n"].join("\n"),t.fragment=["precision mediump float;","varying vec2 vTexCoord;","varying vec3 tempFactor;","uniform sampler2D source;","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," gl_FragColor = vec4(pixel.rgb * tempFactor, pixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},temperature:{type:"number",uniform:"temperature",defaultValue:6500,min:3e3,max:25e3}},title:"Color Temperature",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("throttle",function(){var e=0;return{draw:function(t,i,r,o,n){this.inputs.frameRate&&Date.now()-e>=1e3/this.inputs.frameRate&&(n(t,i,r,o),e=Date.now())},requires:function(t,i){return i.frameRate&&Date.now()-e>=1e3/i.frameRate?!0:!1}}},{inPlace:!0,commonShader:!0,title:"Throttle",description:"Throttle frame rate",inputs:{source:{type:"image",uniform:"source"},frameRate:{type:"number",uniform:"opacity",defaultValue:15,min:0}}})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("tone",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform vec4 light;","uniform vec4 dark;","uniform float desat;","uniform float toned;","const vec3 lumcoeff = vec3(0.2125,0.7154,0.0721);","void main(void) {"," vec4 sourcePixel = texture2D(source, vTexCoord);"," vec3 sceneColor = light.rgb * sourcePixel.rgb;"," vec3 gray = vec3(dot(lumcoeff, sceneColor));"," vec3 muted = mix(sceneColor, gray, desat);"," vec3 tonedColor = mix(dark.rgb, light.rgb, gray);"," gl_FragColor = vec4(mix(muted, tonedColor, toned), sourcePixel.a);","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},light:{type:"color",uniform:"light",defaultValue:[1,.9,.5,1]},dark:{type:"color",uniform:"dark",defaultValue:[.2,.05,0,1]},toned:{type:"number",uniform:"toned",defaultValue:1,minimumRange:0,maximumRange:1},desat:{type:"number",uniform:"desat",defaultValue:.5,minimumRange:0,maximumRange:1}},title:"Tone",description:""})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=.2,i=.8,r=.02,o=.3,n=20;e.plugin("tvglitch",function(){var s,a,u,l,f,c;return{initialize:function(a){var d,h,m,p,v,g;for(c=this.gl,s=this.height,g=[],h=o-r,m=i-t,d=0;n>d;d++)g.push(2*Math.random()-1),g.push(Math.random()*m+t),g.push(Math.random()*h+r),g.push(.2*Math.random());u=c.createBuffer(),c.bindBuffer(c.ARRAY_BUFFER,u),c.bufferData(c.ARRAY_BUFFER,new Float32Array(g),c.STATIC_DRAW),u.itemSize=4,u.numItems=n,p=["#define SHADER_NAME seriously.tvglitch.particle","precision mediump float;","attribute vec4 particle;","uniform float time;","uniform float height;","varying float intensity;","void main(void) {"," float y = particle.x + time * particle.y;"," y = fract((y + 1.0) / 2.0) * 4.0 - 2.0;"," intensity = particle.w;"," gl_Position = vec4(0.0, -y , 1.0, 2.0);"," gl_PointSize = height * particle.z;","}"].join("\n"),v=["#define SHADER_NAME seriously.tvglitch.particle","precision mediump float;","varying float intensity;","void main(void) {"," gl_FragColor = vec4(1.0);"," gl_FragColor.a = 2.0 * intensity * (1.0 - abs(gl_PointCoord.y - 0.5));","}"].join("\n"),l=new e.util.ShaderProgram(c,p,v),f=new e.util.FrameBuffer(c,1,Math.max(1,this.height/2)),a()},commonShader:!0,shader:function(t,i){return i.fragment=["precision mediump float;","#define HardLight(top, bottom) (1.0 - 2.0 * (1.0 - top) * (1.0 - bottom))","varying vec2 vTexCoord;","uniform sampler2D source;","uniform sampler2D particles;","uniform float time;","uniform float scanlines;","uniform float lineSync;","uniform float lineHeight;","uniform float distortion;","uniform float vsync;","uniform float bars;","uniform float frameSharpness;","uniform float frameShape;","uniform float frameLimit;","uniform vec4 frameColor;",e.util.shader.noiseHelpers+e.util.shader.snoise2d+"void main(void) {"," vec2 texCoord = vTexCoord;"," float drandom = snoise(vec2(time * 10.0, texCoord.y /lineHeight));"," float distortAmount = distortion * (drandom - 0.25) * 0.5;"," vec4 particleOffset = texture2D(particles, vec2(0.0, texCoord.y));"," distortAmount -= lineSync * (2.0 * particleOffset.a - 0.5);"," texCoord.x -= distortAmount;"," texCoord.x = mod(texCoord.x, 1.0);"," float roll;"," if (vsync != 0.0) {"," roll = fract(time / vsync);"," texCoord.y = mod(texCoord.y - roll, 1.0);"," }"," vec4 pixel = texture2D(source, texCoord);"," float barsAmount = particleOffset.r;"," if (barsAmount > 0.0) {"," pixel = vec4(pixel.r + bars * barsAmount,pixel.g + bars * barsAmount,pixel.b + bars * barsAmount,pixel.a);"," }"," if (mod(texCoord.y / lineHeight, 2.0) < 1.0 ) {"," pixel.rgb *= (1.0 - scanlines);"," }"," float f = (1.0 - gl_FragCoord.x * gl_FragCoord.x) * (1.0 - gl_FragCoord.y * gl_FragCoord.y);"," float frame = clamp( frameSharpness * (pow(f, frameShape) - frameLimit), 0.0, 1.0);"," gl_FragColor = mix(frameColor, pixel, frame);","}"].join("\n"),i},resize:function(){f&&f.resize(1,Math.max(1,this.height/2))},draw:function(e,t,i,r,o){var d,h=a!==this.inputs.time;s!==this.height&&(s=this.height,h=!0),i.lineHeight=1/this.height,this.inputs.verticalSync?(d=.2/this.inputs.verticalSync,i.vsync=d):(d=1,i.vsync=0),i.time=this.inputs.time%(1e3*d),i.distortion=Math.random()*this.inputs.distortion,h&&(this.inputs.lineSync||this.inputs.bars)&&(l.use(),c.viewport(0,0,1,this.height/2),c.bindFramebuffer(c.FRAMEBUFFER,f.frameBuffer),c.clear(c.COLOR_BUFFER_BIT|c.DEPTH_BUFFER_BIT),c.enableVertexAttribArray(l.location.particle),c.bindBuffer(c.ARRAY_BUFFER,u),c.vertexAttribPointer(l.location.particle,u.itemSize,c.FLOAT,!1,0,0),c.enable(c.BLEND),c.blendFunc(c.SRC_ALPHA,c.ONE),l.time.set(i.time*this.inputs.barsRate),l.height.set(this.height),c.drawArrays(c.POINTS,0,n),a=this.inputs.time),i.particles=f.texture,o(e,t,i,r)},destroy:function(){u=null,f&&(f.destroy(),f=null)}}},{inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},time:{type:"number",defaultValue:0},distortion:{type:"number",defaultValue:.1,min:0,max:1},verticalSync:{type:"number",defaultValue:.1,min:0,max:1},lineSync:{type:"number",uniform:"lineSync",defaultValue:.2,min:0,max:1},scanlines:{type:"number",uniform:"scanlines",defaultValue:.3,min:0,max:1},bars:{type:"number",uniform:"bars",defaultValue:0,min:0,max:1},barsRate:{type:"number",defaultValue:1},frameShape:{type:"number",uniform:"frameShape",min:0,max:2,defaultValue:.27},frameLimit:{type:"number",uniform:"frameLimit",min:-1,max:1,defaultValue:.34},frameSharpness:{type:"number",uniform:"frameSharpness",min:0,max:40,defaultValue:8.4},frameColor:{type:"color",uniform:"frameColor",defaultValue:[0,0,0,1]}},title:"TV Glitch"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("vibrance",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","void main(void) {"," vec4 color = texture2D(source, vTexCoord);"," float average = (color.r + color.g + color.b) / 3.0;"," float mx = max(color.r, max(color.g, color.b));"," float amt = (mx - average) * (-3.0 * amount);"," color.rgb = mix(color.rgb, vec3(mx), amt);"," gl_FragColor = color;","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},amount:{type:"number",uniform:"amount",defaultValue:0,min:-1,max:1}},title:"Vibrance",description:"Non-peaking saturation effect"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";e.plugin("vignette",{commonShader:!0,shader:function(e,t){return t.fragment=["precision mediump float;","varying vec2 vTexCoord;","uniform sampler2D source;","uniform float amount;","void main(void) {"," vec4 pixel = texture2D(source, vTexCoord);"," vec2 pos = vTexCoord.xy - 0.5;"," float vignette = 1.0 - (dot(pos, pos) * amount);"," gl_FragColor = vec4(pixel.rgb * vignette, pixel.a);","}"].join("\n"),t},inPlace:!1,inputs:{source:{type:"image",uniform:"source"},amount:{type:"number",uniform:"amount",defaultValue:1,min:0}},title:"Vignette",description:"Vignette"})}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["seriously"],t):"object"==typeof exports?t(require("seriously")):(e.Seriously||(e.Seriously={plugin:function(e,t){this[e]=t}}),t(e.Seriously))}(window,function(e){"use strict";var t=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);e.plugin("whitebalance",function(){function i(i,r){var a,d,h,m;if((o!==i||n!==r)&&(o=i,n=r,d=Math.ceil(Math.log(Math.max(r,i))/f),a=Math.pow(2,d),a>u&&(d=Math.ceil(Math.log(u)/f),a=u),d++,s!==a)){for(s=a;l.length>d;)l.pop().fb.destroy();for(;l.length=0;)a=l[s],n(r,t,a.uniforms,a.fb.frameBuffer,null,a.opts),s--;i.whiteSource=l[0].fb.texture}n(e,t,i,o)},destroy:function(){for(;l.length;)l.pop().destroy()},inPlace:!1,inputs:{source:{type:"image",uniform:"source",shaderDirty:!1},white:{type:"color",uniform:"white",defaultValue:[1,1,1]},auto:{type:"boolean",shaderDirty:!0,defaultValue:!0}}}},{title:"White Balance"})}); \ No newline at end of file diff --git a/build/seriously.min.js.gz b/build/seriously.min.js.gz new file mode 100755 index 0000000000000000000000000000000000000000..06976e57e9ec43607a7f76d48281dc45e2ddb6a0 GIT binary patch literal 50963 zcmV(gp*Ze4&Rv->>nIq&QSt8dla)!o(ARn^rCy@}t6y}&nID>fg> zlgKSaap-m8@=jT#m2EqojoqME>bgD8cNZ7gZ`B!fTkO*)M{ei^lV~_ATN0-EaO;F6 z&yEe(+zH)y68a^#dMWG5kp;S%M!N z55i821Guoy2c&dD!xj^Cl# zcjaA+309--0gA=?kxh-0If$dV6YrRiHCD#$RE#%FvY1ag7zmi`6P(diA10=4!vd9c z35ZF%iGoQ6WHkI&}jJQ%an_eYe_Lg9R*o`G`*|7q^Vqjlg!xX%# zUE96^MJ=~dUs=VNx{Se4Lxz@l`s%d}9ZGr`$=SrZYM1|6wtU-#jK9@eYt2#U*V}0GCKp0G5T0n5gy^60NA8V#*5e*2=iM|;14ZzF>p((V> zwQ>blP{j^KpOqFl*diX?4nt>F^&&1p?nDhK40Tf~o26rXjy({g9A>aWvh4{i7 zxxpm<(+z`?nD8YpD)~WNa!L}4T)MBT<4H8YX;|)gu2B zb8ja753x6lfMmk|fq+58Zs5o6G;U=wRY%S@cTdS;&|(vT@|}CrAC{pmvssWZhsJdV z1}rE<`9f&2=IFU$KZG74TAkr?x~LCDIby@4i#_^4sd}$??Vh zr;9I#C+8PmKJLGMdkC}f)+Q9!OzZaXae;UF%!LgK=Phs3}<{p>LEw__zs`VwlC9 z4osjDb-jvxQ6^8v@Z?@>`BsEP83qhy=T+Go^~;t(fmOcsx^7Sgx&-4Y2{dF6ot4gcgNa`11}*7i;9~`|c zQ#|KM3hF!IsO0isZ~x>a)m&n!ylQ+K=CSz@ z**?eD1&re)M7Ak{*dXq`i(cR!pRTzvkre|FZA-GHB*N!SU4C|d3YBL^tChYc$$GnaRrRyDA<0j^P& z3qi!Jqs>ye;#4_JL?m>9kxh^pA-d<;*f}vrz8z@9r~$*nG1U#7J3^Ha0(NQ$8FEt0 zo)bF;#94K#F7Psuc$xfX@q+Et@WPf1qGghx1#mDI+)uLHyGV}m&kOzz?#wOZ@qzCk z9-$6fJuvSOV`UB!z`zg#pfLZ0zX9XrR+HDIFf$Uz_WvQb|_#z`hR zQ=aHdZA?;&?E=RY%d!;81E6N(AsrNK9b=Y`U$$CF(B%b#F2BO1T(h93xWCbG3@moU++Kr|fe6^;h zt~D3bFw9imu_Vq+m(YR=XR8&`bJd{-(E#XpxaYx)vKJP#u$9AC!p7kYy)JDeMiQ{c zY^q$ca1cgU3<Ggm= z!9L)Iq{acPv-Z*c>kn_9QZs+NWR6A!7HieRTTe;^fQz z-rM~jD}IqJo*9K2+f$PXWQ$4FGJyR7%1TpjwZRU4F`T2Yq4`j}ELhh*cz(R~iyceBr4y_#=Q2CLq*k3434r#G z_x8{Dy7MtpsARx7jhs#@A22Zcrx)+O?4BH*o*cu$yS_ov5J>1Hi#k=4y1)g1_Qgee z_Z=SHt-Piv!1$aY#ORQAPYzGc6i79zaIGS@<{)|oZs(gqevq4=L^@>5Nz*Zj`f_lL zJwDvO*jMVy@&N~aCm4;9tt=@$XqKJ@1w1AU;FI+p9h{#Z9KZcL>(7FGK|A&iAmjPL z$?^Fw*PnnYsu!mDhtt!Ovy1(`pQ}v)!0T8@*CCqo@(SR1VeUM!OE6OLf>o#FE8Y_o z!qXoDr%hkfp4XJ!4p#5iTdPA}e5reXk|x z$~o~htbK2BzI-`<*M|O>%}kEVeZcuAkq(_?JkfbD2|IXziZKq+>kUPr5Dq0S9;sMZ zZa0t{7yHra!QuXw^NaSyhjZZCnOHKeM&qFu8!K0T`G1AiD{yqMYdgVjF=st@f=b1V zuYzkksMIUv=0D064DGP7j;j-&2?6=hi8TlhPvwf?waS3zKFO(@z?p_XOv+}ZTw+~m z!Z{^%0E??%0}oF4fB9u#!tBlV&8W{zMh5uV4%MtR=G8G8m( zO-LA|G(JRee19l5TKB5V=ViGPUIQ8@z6XdK)jb3Gzxj?1`1Q%j;p3wcaR5|CY5*ed z-hEYX$+}_`TuFep05LY_&4Of>nyQbs=NDGcd%A*NaRpy4_jel^OsSgPYz3D395SaNQL;;+q+r{9lsc z^Mn7*2VRe_k`gaj!m4oUvr0`>&l1aXyrNZ-+C^9?9~cZH!WxCT#F|(`t7mnrt~Ibm zcDc;9kPr`*aF)Rq!mb}lrU=gbeV{1B4>@rR$4^do0G4S1WzDWhjE5uIsA88dY59vz z$%QO*B@TJPj(U!78j0L%~r zQ5FO-=@Dv?%(+HFcZ12WOHxzM_hJvu$oHqc=H%b-NnzW8IEkSH-IWk#)#=M zNR-d9Vw4A_{tg@zf$M{V2>ndxN0H!+ai7;!($cB}xHhq&qO3ON)bF)83^Ely560E@ z*;)JZ7tU&WluSt^(M~11Rb+y^jtlszBCR>t{jzt~{%Ber?cMgO6+T-b*Vum1AcvWX zbF-l=wVPLe@MHZ9p6h2P2*Pf*7S_v#^}v|Hre~3~xC!j6JKe=H&A?)eXH&M7bE4KL z=(-S#KgeUjx@jN3J={N^n@!d1z>x}hSb}mWCFZljk*npp1^-9g1OLIl%k*=N9p&wi zvWNNxFNk>?khfv2QbyM6oEn&BLx2Vj$pRW~shfCDF(V+mjW(C7Gu^|BbfULhLiVB} zp^NGtw_64VfEDv1uCzG>Xoe~H7}A&)t3GMhCViQ%ORJVXdc$EU4re8&k2;sTf$K{} zn-`Tt1FB`V#@j$tUfZJe)>qpx+NO0$*c=&ctNc%99aLgRqA$mA!YfHte)YzQT-?U) zUYhX&MhpmU{9DfzXB}pp(ZkIXRwR(QHvA;JrGe}8X5tOIoIIJ*wj=({NkMTq6t%dL zeUi#P;n{I^4^fT7zU;3^8mKn=Qk6k>IBn&UXq+;~i;H~L#P)GDc0#m@!t+m=21Yp` zmkS2h6%42tT|P!72CRgAk4sQ{79cjjMHRmF;0(tD2W_*)p*xxkV-F6PZnv$(lCo!y zY1tTo!33P89dC%Asu@M|ShK2_3x(5*rfXr3*j(ih_zc7~XdQDoz(v5%fURRqSb)=U z0Mqf9$p+w;i3P|)K+pQ11e&x1Sso0&_gf$b--E#q?EuZTPz~b7r1LOPtK*KmxM0be zJG!z{S7ImG=E{V*RS66+dax&_mbDIt>%g`SmMXn~fBq80A~tPT?Q(J1iG zd120PjA7)egCO{JZA!>oja5rlF0YsaLM-r!hmFX_0tp-r@nGOmdS)K5fq4P#Np(Df zN~k8dJ9B$5V+I)W()xy}`i8u|=Wzd0_)ii?*7QtOPs6@kT)a%i`BE9*HVk{4bDf;o z`C4V{2_&Wy1e=nRM4Sw)jjsTZ&kg~|l3`IkiDAWHyQ5xQvY$5ldCmA%xrY0it)b0~ zUT^^dIF2!s%yV(}F;sRnRCW=OYGdM@zG-%0h;nS07(eQ z1TCm8TMam733+?TU^|mIAd@-)o6%*18a*g#@IZq$Q2T4{z`9)^(gisCWb{pi|C&i- zRo{vjl2ZZ_Yi!*Dru(+Pxab3cdVFkSOZw)6-!gi3w7AH{#gC7^_~;8>jO`U2mWyo| zm`!}id@RCjrT{(-Ctcd2Gd#@ge)ZOK@6hUtY-^w^7?+lo_cdvGh*@0PFPX@O9V58` zsbY2+L>}2mzASsPaANrl1JPFx8GZc}5i5oId?hjHrvY%`Bqh(lS4z=g14=R-=0crp zjsyaVsuU~#*$PGfWtrUS(zWHD%3?tTXjHrII3Bdx9H~H?n8NR3|NO#i0@d-NY`hgQ z>sPd@i>i?9cOM`5N6S!Py*}JO-a|o@l06DLXK!CajVH(ZO%b%CIKLv)T}qK^3L6{6T+F(=)&?ESYuNp?thKiS$;;6$MulskB)mzFpGZ;PFul zze|NbwEo?O0<0i6^5fi&$2}KqpOP&AuyOXmE ztRjDvDO~dnYzwNP4^n)2=O?*f^!T{oEiNJwJTm!OT+G~A3egmgZZzQ)pX{}v#l^iV z5;ihk3G$@|*-H(w7XEAowkIzcX-U7Qvi^|@|BKF30UT_AmG!#UXi}WfN$fg4N{)f4 z@}XB~rjI5&eZS-bj?3KivquL0X){LHy2);gFynE{XKC}yOrVA3vuXKwQ9@xmeB=qR zc@A0*TE+t48Z|BfaoqqiASI}SlUsh0ZcZEsgPnj5Z3lcP=h+(*`)L6n3SbO3g>Y9# zxMre_O^TDtFlfFNk)}2xI)Vr<1=Nu=DPa@F4(J4kP#z!mNxf_4+^rEc4Ln#<3nYV9 z8#Ok?LR(;&U_1pH5Ctgq+`(SHw%`D3eYGyF57vS8&iZVNJafC<2pYga0V z7Vzx|#R^>e>e}*MlxauEZaNe(p}#}=+oQi7%F?Cp0sS3O%$WY(qWPHB$G^H;?VIU%+Jr_Ok^z%YYbh{9y=JY z6B5Nq$&np$srQf{ZWE!u*R>-TP*bVQtq+NQ+i3?y{>{vfId#DmdV+VW%02 zD+|jh62wF%vAr-7JMM34yjV3ZD(#hcpe(X2hM8&O2R|%qWnm-hY9lB9-`GsvoScTT zqjfPd`B}kGT1HW#UHWMMS}XZcMsFh?vEL|1Q}s$|TQn?BoRmLlExewpRe+c|MWe|` zfh|rh3?GrrmkB?iEVK*hIYKLu4Q5oD_^~$x%FgeH0A=CSo&-)}CMa#^im`N`4O6Te zdD>I$Yw&80;01isPaE`kOX1R*a$Pnse5;(Km(3z8BjDgr#OGix(v>F{$fC@Vr>z}% z(j8O3fwfj}E>YcPc7*M;jU#Me>G2|!M|#RyF;k_nO`>HmLd%0<9%ymmWT?c!aX}5` z1A7W+K5%Ak&tY?`e<~~?tC0etxE{dIr0x^ISe_OD%PHD~N`SQBO;DFvkoSfG-Jym^ zB@D-0BUv!^{X1Y1O-rv?9;+fPIS>Y?YMl#*;&?5u6x|wbOjzBRdPNmI5U>E_p>s4dmHUgObb8_1#IUOg;FF4qWL?e9grD5~P@g zramWA0NoTodBk6)J3vD!X>zCc}@G0hUWM0HXO6aA67v z0C2eBjM{Y$r&pU>ziSgi^%anqbNcEP^NtYQ^V>--vhN)h5@%41eC9wTF9kX5x{f2S z_+-urbh(QipCa-sfd?k#N*D+6_*lLP0ysJQ3RqE)ng<6i382X@z{spGIHZ|Y0O{n0 z;6Uka8Cob4nC}aj(lUHluD5sxja^W2Sqh$*=?)JM=j)I<1INeP*`b`)WSaI&Dc;vq zAwD5;Mk?e7Z+23D;INyXCCWE->XkLQ6IQ>WT_!>JO)y2odVCC+blmMWV~&XcCJbyg zghX_9VOr%5%0RTy2<*rR%xW~bfth5~tWCr}-dDnv!vNWVIiJ%^om<(C*`ZYq34uvl z3@^t#ARl3QIr9euwuP7H#c7a(CFm5+6pkspcM|?LnI9;d@Jve^G2ayU#vGdKi|qUm z8=f7~{1K$YV>{-}JY~X?KfPjGsZd(CkYg7O#H64F!a|y{3#yNU+$wpD+DS4W?V)WO zQ<~$xk|KsE=txDS$ytx7@il41RWIjiC_kyd@P&7w2P2c*S}#|6=1xMt(iFLO&E|T( zZy6G7^j_j##(~C?cNrf(=4SI(;SB}63BjA^!SmdRL406+YCh<2(zPJmykSEj*?exr zUJUtu5(dXA!FYU>Fo~)DS(sE9fN-AwXM0Db0gTuESrA@#KA&p`R68%5JiB7XxyW98 z6c4nrnd2kSYksFM&7yaz{7YoWFwGr|Q?sz?p2OI(>)a$gO|1<}xK<#^Bha=Mu(uCn zVa~3>TKozu-5SUHx=N7GrclfXcWx<62)}lW;&;!t>2kFd(+zC8K@Hz@Pnunqwn#{C zv%AvG)CK8QEN?b@hI;$iY-X-G(_W}tD%S2BTf|Y4^C^B*Q^U5F3L|Wid~k=%2jyM( zz|2T)>E?NS?UP!C(h|ZjP#kffVBbwt92Ec`JK|WL$eY<3I&*vWIWml@ zBt?pX`3VS5!^yM|Y=q3E3nEi?Lu`JIFYi)>5cLM{O#Schy>fs?sx#;fq!GNf=Z(1_OK zBjPF(O-HbVcm<5`=y?)%UF^e|0v8^T>k0gEra+G*+nx{MiYqm*o9fvtKkq`lnVcC5 z@|4R7u?*xvLC+H?em_XD7Dz`4%5dt1(6Ad$^pYz>loCgtTb2+Wq(J~yFv0e%gf)|G zbSOp0)#R{2=0MD#v?%RLrd+27&)ktRbiI9U^p>Ez9LA(>=HkI+I)0y97idp8Rq-wZ{({{!zG>s%) zkX9}x7RJtbGC&Req6Mw|Xk~UPJ;>-~3^?h{t+td=XA*M+Si0AXjLb^+n4y_k*5=wc z73li$^3#d9t z!{R)u?p-UCBo>rpLEU{J&*Nh{hVA+Yb^(Rt-zOe)@9{DDRwj$55+oD;d+-1z5h$d8KgwZwA>jtGbMGdfZsk8=82#Q^ECnhPe zmdfSDF}fbhsgPZ{&s7{SC%TiHl+d0}qXi|9mDh816`$nsHRH82abBWk<&jKGnW~ac zdsABkg_Vj$qSdNJ%4(BXR-h*UW1WR&FvxjRdEP-tGvt#Ne{d&88=-%(3#ZQLYbAS;evqP&(%+^KSn z#NrjdMP^gznZ<^l?v|lp#eN{fHR~3?PplN4XJBQIJlS=Z7R0C%N^Uuk`H+}x2f*Q@ zA0O2fuR2|PHeG-Q@jFtfZCWnJG#{zWtt|hjoacBl+jbs)a(xDJdxF^%}pF57>S-=;boI$E@WK`A@J8ZY>=1beKgHnPFn)9%xoF#H$CMUf~|xP)DM&} zmV&Di%6e>H8PyHYoSE@LASwr?!_ki9b?LENVfW^lEta{3)1?WTpJYL@CK9z=t*p!p znMPY9BgK>A$)O~&y;Hc~-tn}((U@>24^p&YP2}u<{(S8+(R`T4i@7Q<#zb#yHSv3g zH{>l`SRW=mXYR{kwd@;g`sUd2wBy(vjbpr}hklYvommI=WoIbtkWda$Hg{5xQ7Dq| zC5-ExlRaul)33_{KzxC-3(_qF0>RHu-`rWG?R}~9Ao}=QT&$!066bEv=b8o%jXtgm z?AqV9r3E5Q+>RLR?*U}Lg8Ll1X9qCbM>}ZE` zRD1!lcGOiNlaL`tH6BSn77}5skk2k8vfQSTDhgE<9{EG%$Zuw5TuX4@kwT`m13bEz zWD)0@rIdck4^wY-qN+a#cd zo^|jtmHmJg-%WOCLNHBtZslvl&|LN<`mn6P)>G7tq$$hMV0x+^7LjfW0lJF(tQ=kS z&6_yMK|WsiT21@RZ>1t&ZRf@z_eX{u7@|zL?%XE+y;79JUV-~i>B`@RL-KUlt4_@& z!>!KXYi2G(9Q(pJmI@>bc(&=Xo5~r(m#gQDY^A&?v#iu3%AokqaO_|uLa!O{*Lj7+ z?v?Gp?!!MPX6s?v1PB!;0cOo0X2xO|sJZ5rAx!C|tds{L`--;51=w9Z^cg1{l;MHW zt-9U5tDPk=5v}Yg0WS=~c2%kGgz3B?lwlae!9G2HZu}Dc~!r&hR$; zZIjyL<6U=b3TiXQ9NJv*8N%ApL8ocrtD6JNm%xH&fpt}29lGdU#iDixLij;Z5b7#v zT?i#<-JNdm;Mfm@V3_BYr~$v(P&U!Ps>kZ#o}xr1Z0p1x0t`67E3Fd*k=*;qSmmH@ zIeeT6>ebL1Qk$+ZLGR-bYhz+V(do~Hpd0XX3t*1ccq9DfI{6InUwJ!lXtbEW00ns}f{zfwGvM_EthIYcRa1J>$WvxHCq?N|l^fR-^(8!UWs7e+LN+=UXw zLFSVY2^a`Y9IPI;k>Wab$m6;chwugzhww%=r%~3}<`m4D*}>9a*CG{hlNJKd$7t{dnF<`~WL{_K z(^r!f=R$oXOEXSU1N&CYD_~WILFd~?FLL?4X>46cM6!=+n2;IX=cWbA_2rN$#F0MQ zjU^w(xQ1qP%XOHbjU8h0qvhq_fQR8zWQHvm+MzXkMPkz-I*SPHVWo}+yFQum*3k1+ z2r<1^K4Alm&Ws@pR1dn^=dLO{cK>R44RZt=0~4fw)w@=y}_7GmP|Vm0M>UOyzmWY zr9rZd&<---`w1MCwQWHS@x2BHZ&Doq`z|-31WdA*!Pg|a(G4I6&c;ca+`ekiVpxUq zMJ5fe`6hH6_W=SoF*({Z1qlCLwJSaBin>>cro%>o^$uaDVP#<%!7_o#u)J(e>=6z= zxq4up%dM+;dh76=+pT%Z9UY!wowTKYMt>^v zqp*#gin6O;q#Q$mlAiBFvHS`(h;iovx=*a>Al#J(_@yL-oM$BGyWk<&RAM<9;isAtIz7e zmgLw0L!)o+an*~jSTxdE#kbWcwq(b=thL}v*9mA23`bmptSk4}T@dLG7Mj1Nh?iz(;uBe$4F1Zn@*H59*GM z?)-B7l7!4J2^mfLIetl?L4b!4Pi1+2NkVa3Eo6Qw(DdvH_Z>xkP3Y(sv7w@kawz2O z+|KnD4PQt05XVElS;Ecih7+KKHrMEJ7ax$5fAMJPcnniy0DaZ)oe3H*0(gaO0a_5? zqXFgJ_VH!=Tzh!1rQRD3v-k2Ljt`7Vkd$wFi)NR3GQHJpdL{C-?l@*M^U9)reOZ5$ z@$s>qY7kF-$1h;xvs&Wy4b)ZWg^iKTZb)VCYvG%U+Kb&|b%{bzV=V7nr@@Ys+t;ZE zndEIUuP4^HpbwBBR6KaJQ*;lW*nGSDLo8{>j5@F(te!GhyQ^#1n6rO z@FH9#g*p1nV|ve)lx*DHDAy*VR)#IAuGwNA1JvVp?Sa`8VLU72nO2zrU2Vh%R*Hr| zi4NLQC>@m#f8|*vs<_}8)7U85Z|C&->@6T+$j(!^E$yL%YcIVgO-!T!6F~tci~`{0 z?1!ZO$$xnLCx(3sx7mS{4=_+>;Y>ndmI0p<_skfAp?6l>@G?W;g91b011%-rP?%Y<;?htjpK29@Zs6^9=E1nO z=60;Dy^V&c>ML>Wm%I|!PCd7#fo$i!64#b5y}h(-@=Dwfm*ua-wbReM{YdePyyAsu zR3BdxPumpJ1l=#JxTKPJ#h7O%!{6!i=0Q9|t2WmXuPHX&dAb4rd8^ce|Fl)=!Sm+h zRxHhX3cQe{@m=JOL>Y@@>~1oC9BwrCBl&}wGPuh3vZ5P7zrY4sLn@i{D8?WN_(E9D z2(!IxWQr#KqN^_57A5C0%D>H(*TIu^lgTX&zID-!88{czXp*OBbDAI&+C-`Zg2Q0D zv=-p)5rDbN;M8`_OQakJXQ3!oHf?K$zUxd4aLOT>H15kqk-`>c9xKtX#aO-gZ^RQd z7MPzWh_y=h3b(&EhX-e3Ty z&R_Y&C)r-`sJFm%+EID2fBz?5`xYm5e7IYi6HkfUled2ICb%xj)+5!^d0WtS!4e7Y z;bQ!?A^$f>V1bvaa_ijP zZOSao+#C;vX>@^5RG$!>0}ePn}o zg`CERPa&l7rI5zw^o%ZfiU5EiZTP}2{TRFS?hCrcYd=0>d;3EZ>*?dg{WfI~7ln6~ zSCOP3p4oIw$l``9)vT#?W9>58$v!d;=RYJnkD2T|e%hxuay}?KkL-|y`xDg%z7X!S zFRNn%HX`@Hj}38Js-x2>HJTs2Fuspo^p(eta^>r%BwuHv9;Jn$@);vL6I1v$6yRrO zy~l2Rsu!5(Uc#>q#OFe87OLd`E;_$q>}7I|PkU{UPH5l~oH zT8eixiQ*El6sVj?+}hrG@gVbj6@T9fg?zTGiZ^3UjgIqMi_PoUe7l5E6uXjTEVS{h z0tSMyJDiI>cL9Fa31`#@oLT3%d~W|eZ)f$b zAvO&4+8_sE-B}l=a^cE$(igk>Lgd6e3@hGBv|IH3VMZV*;$L_~64`%V==Wm~@ z1ffU(_~Srw#DFTRqI{<&Ueh=R>UC`M0}9gH+rqL`#L7^R)|28rq{1lZZ@z4%naP6B zT`Dkz@!XUwsqB(J@rScg;EUJY_^Wk%YKTn_va^Rk17NH!fykw}+s8VWT4 z$IywTzr&UsLpcQfMZ~f>$E}jo4*Mkbxj`=I6bbHWngzNsk+Rc|-zS$?QA#fv*=X*)%)KS%TwNNnNbSktS}C3S{ewyd#Fxi*S5eqM^)NY4U$y{;wg zu;-K&5u{Y2{e4o=#6J$bQpK*<;unu-CK0!;LTDqqrmKBi_hovYiJA<|-^+A4?+bJ} z@3jjSmE$2LkY{YBBkjovYMg#(ZEW3EtOPN!t3nL~H;38}E+xJHXpnR4}_yymrnW5HH>pie=L2wQDChagFb@NS{do3ur7 zeIsW!>D|mss{&G`TArx@)k8XmKt$uYa+&jcQnH?&w`qw*`vvm)Y@EW{&8$o7Yi4;! zE+Jovnz+#6OT4X$!*$0AQs2Ur^{OULQW?b^XEJpKkx_ESswKfMOrVxtQ!;PVf;o4( zn>q7>wBUNY^&Kemn7mm$4bMzH3qj3aQ5Lgi6wDjHqOM}Row{V>Z=L@(`0pzJU4vf_ ze%JZ$2LIip-y%e~`MY)9v}Oj(n3O+;G*760Q=;`Y*I7f#S3}-3)Y-a1k5xPQ^G}-! z`cpD`8}zA&$L^Ot;-Maj#A2fWm-VAgWGP-+6GTcJpY)efD2thHjFc*(zd_g1>e9{^ zLdhedG*yp?Bux)ONkxf3N(H1=<)#9?peUg4T3CR~DIz0k3V3qYIo_smz?6yrYst zAiHYnOrP)t_5MX_G?jK2vy0C%l1C&w`JrgY^Eef}JSX`5Qb>77Nfr|;$Z5ZHV!0QWM@0Rb1 z!^xh^3}OF078BuLPrRQYE*0bZ8NNMy!5bO6)v{FHkbQu;AEhNMT+9D9(9xiUbPFwZ`z;Z~jTcsMhL7EtI3yEw=n zug#c?iCY}N>GqiKo~LaOlJ_QmO7%Sa8y;^MiY<$~>L30Mk2ehemRnuJUw^z|$S$b; ziit;J9WK7;8I_DN!Z2mrF=t9_GJ79ZM{Ya_x{)cr@@(K~Qd~{0ZO4%LAZTikxKBUv zkq5^&CW4+(dB$61@4F4N_uXFdP=uT@sfQv;?4by2Aw&Z-!YaO6uxM2CSSBrU!F)FHs*6ie~CgoexWF9UiAD$@+1Vq z2P20voPA(fD2$VeG>xN-l`ldkQK>h7^Ch%QinFKLuI4=kEsHC0-0mfLdPBvlnT^VO zfP=w!GOzvyN9qj?jcA+MsHfi0&@$4K4w5$I`f}yOUmZE}55xn_+(Hqa?{ibQQBX21 z2pIIRtD*)u&Ai7${??BFOv`iVPl7*sIYTn5?9d(A1y7W;{ATJYji}(=4KfzA9L4{q z!<=&z6mW7M>cE>~h-+*U^J-6>RV#vX?9MZ)Ng>Q267?^hYp9iZqd#>4B=TkY%g+V+ z%gh8GZ(ZZV0eJ@+s}&J~wTn_9W%u1($3!RP01 z4!!i@i67G6{oKP7TvC{KS?BW$b=KSuaaL_jnx((h|M1_T`hKylTfb;D*AeoczXJF9 zKYInvdIE^J?5ZOuJz?@ZcJl|Q@yS-jOYV~!h-$XZFUR<)!F(th^(XUSL+bK2u(G&?Z`uH)H8=|3B-|_?fYK+M}`R z`-#7Ej)+wv{%+64VS?l!ExJMhRWe|Kg{=?rB~d5?M&(h8E=O@ez5?Px<0mV}pc`E#jx-ZRbx74!f<5BB-l^e@)rCBRIr5o^yD5 z@;0{lqc#>rCK5SF_&LJ>Gw;Nfy4#)sB20yw>U_)=(L1DFK+m2i>sp;=GmjU9aeMKE zdRkYkH3KQLe)rYPY{|us(+cmm!up$@6PD$*csjY*#gr%$Sa!h99ig~}$ zuD&^IAML;X@aE0_*^@KOwA3qH5@Q8-Uf~et>uCQm?~Q3CbCLJPUrB+sGmX2m%S_X`OWi2)OX$#;7MkJfzyvgo{ zh2rv)vN%)RG?GDlUbxu4pFas-Dpz3nv8O~Z*E=dNsG!F*S?UQ?-w3#58js2p+>tD5 zQZU)Wb2xsa_1SB4B+7R!moYP}J7-UJC()BqkLF@CaPgoc6-bg%eS9o8x@D^X=y8z1 zD@9|sK{GOxHQYRIi4m ziK5zVb=>4iwWLk@i|8)Hx~}FCn-rxcdMuhlc?Z`Jr?HEu$hb>)P5x$dEL2G(fo^67 z3I*7d#FYT1srb=HlI)rpf-K+k6>S3=LXMLqGsG+BuKE$o$Tdf~fRg5g*LfGflQoO5 za@Y(PVJOm=-)a=Wr9HXN@-8k8lr4fv420Mhm_GEEPES{O%A~{RD`38P*LWQr_E201 zUBz43z?H^&eWU2Mx-4MVtby|V(TGv#=i0TodPK+F!mN+Qc)TJgCad zcq__`IbSYU;)E}|$9CN3wc|e3j=jIF9c<^vb|lVk#E={#5117fCr@JGO?_ArWKtXB z{U~)DO}y2vK+BQGYfr{ebCYJ z1T8TJ`&lC=&rRHqBs+!tWbd6Oz7FoJ3v1T~{yON8oX^^~neHqYy4E?W)6ekF9{xGS zKd*5$f5ERe_~+ghEGtBl)hj*egjTKe*hrf$bOOweuJi54880s4HqQgrAuRh7%}=Ox zY%@DJWEcFnd4<;!;D6WF&Cuz56XE)`6}sK#Rb7Poq3imXT5oKvG}hNy>;XAi8-pQnj*mZ^~I+P^m`@~^&QPlyN zwGzCIby>~a`f9KIZzJsAJPx9v>9qbb{)(22zq%C@eyxIULj;V!s(*Et%oawPt-s6_ z&$KMyDA%1SX11LxBPhWOVj$R+27)IP$IXG&+ z-T(68_~7CkfMb?7XYIE~`^Og;`R3&8=*#8)?#0QONG>jT**^PxaQrrv|8oBfihOBb zT$~-ePDMTei)BbR;oABJ*t_~GE?qD2hp;J7QC`FTE2oC)k?4_ik@*n8fg!TL3uU^=PKS;iFT2*n4wpS^X#2}j*@X}5*o~!N#jzs1>sf=J z2K!lMKWpq~on@QA=LU<}WItQiwh_abjUa48Agp*M<*NheWy7xo=E@L*0DifSAH0G( zuc5w1`IdsE2G6-p33ChRC!XI>Senye;oHVrI&$IxoKzr_D z$DOf^_7lrKAdJD8TS9fv%s(H;^jIML;M#EMN$qHv77&;s9oZzerB-w}DSV#fS;3kH2g9W><^|u%G3z4^U!4D#Rh#W%X03!Qz+Ycfm zi0nb+2qI@x?Ha3gomIQRs)Y{WwZNSE*7NGy$g6KNzrHP2-!`ick%Sc@l3bi#*&4U= zYOL4ts;t-Z>qOKOZdZA&YrNKVthL_AMeJ&By=%Gku4n6Y(a;&TKrfy(bJz^w z8XK}28>AXTeT^Zz&d^(92(2+B)fif891(Ti^&0O?jW@r>8(iZ}tYf24InmTlifWT+ z_EW290Z_we4N%)?8Bp_RB~S}#F;F9EJy1JiHiNdV*{Yz{(!yX3W{ZP0I_6_vr;6%S zQ=O`+Q(bkctWLGnsX7|9`P}-Hb>&%;tA!p?2i~>q16PB2NI&rS=vMFCn{QrxR+Kyn z?hDg`;!;sTl6p}=xg}*jct%k189PVRTzL%^S*$%E=q7n)1J=SoaSjo?kux=5f8SU( zf@PHQ;PZ~xk_!Jnc6msP>I{rsNygQV`{G?>$Z zeTgeN#?Z&PXo5KVuupN6A}mPpn~D?Jb`;NG7er|(ek~_^Rn8TtksC$y{(?I6s6A9J zo}#o>SS>HdY&tB9f+&}(0=gVB%g0vWq08wzY<63(#q)kOQ#`o+x*8366WQr2ZJDMzV zwtoyvrCNp!Vp2%C4({m}!9Dc~I1hMfEhq`4Jr0#si|&U3V7hj%y0?FN@ecX-)01Q1 z&g&Z%m&7YB#W`xIHEMso>h8(m$r&=??cI0C++&*x&}Y>II&v{B8vPu;)O^JwLAg)` zKX`#ISk5IBvAEn3unIdnt|FJ#(ww2BsNl}O5PpV5!CXJXFH`iYHRNf4wYdIpj&Ed2 z984np5iXVoqhYbaVVrxD8?yi)a9kh+)Qt6jOh}^w<{My_pLw|I%@Fr;x%L$(6ZeSM zLeWKz2SGIa>H*b2vznP*?nu9aO$gB~=rVpuuruw2TSmG9CO`}d%*8dqof^c~W3qBX z0=W090CNR^V{vC8?L(Bf4?(q23E3h%r#yzSeWY|%uDF%*we%c@4+o*Dt!b#1in+=X za+(>opo8pwR*{Cm2$TyDSSF|nV?q0~B@Fcz7rRD)Y5ZE5!N1Vx4?AH8)))Li>9w$G zq^ZWXw$n5&6nQfjCMz;PCVoC=cj3|rv5gfm+4D}UngxiR$MO`l0AD#+MmRC$QRm_| z4mLASeVZPvy`sTl8~m>i7VLCCHC{Pmvd6~c{)sUuvhIFrO!kV#a!xU-^xd-D?m_a-}VXWGE!==sy5 zc3L=U%va)nr^R&2hNb<~uoM{PKQ$(&MPt(bi7{zs$K+HU6PkRN%#c06TYu!^jGR-9 zB}^BtyQgh;PusR_Oxw0?d(X6O?Y3>(wr$(y`A+_v`;)9nB`Z})-K%)51XZ|cKk&{1xzf;&NjMeD1RMxH7lwyVJTP|)7-+I0--GZ zM14Q@LW{zJiaqv+b=en|=&_~R`Bo04eFi(ZQ3@01CZ}kBDd-S&!$5smJTXze3EA9Z zYdkzi5BpZQ6M+HSH%R`V7(0?Nx-qk=QQHKS{cu0v1}`S z-+*pe4J&AEg0hA(j<&R@lyGI*R1?4hUwXV;k~srcK}{!`f|H3hDt(Em4BT2o83EY~ z$2(g>KbxH&>Ed-6Uj_|k4tDwaLsl|x0WXhqXkB;?nvpK!Xs5Ck+7Kh_-aw95J6_8C;VB$~(+6_)2 zsu~jR`aJg=pVGAY`ySp{^tPtYs50~CyGGl-hbw~#^&AkP1@$xX5xPeo|{C(n{ky7CWg8mtJY&E$kTc5 zPTK%yOPX+re9NZVT$vT^9aQg9;uEN@b0OL|SskQ!L1lVP)DY0R%j1N>jeZ4LQMTp- z7$27glYW4u|44NYbw#X-?}LRwrUdrIxUNqAmBw|JY^jfyj?kRnQ?Gt55U+=Yxbi%7 z3qc8gQ$Co}F6C^yg2C;=3-dZyuVlV)zoj0jEq`9Ys zvD_698r{FZI~(vO z33lWOU0YGcnolnqq>&x7pxJ3F{*kpFnEJ^nzoQ8erz_->usxGH&fHcsr^NjL_0M>` zb|D-x^Jlc2rw`W$5$1a~LfArwwk;`v2y>(|+g>7Z_jN>sqV(+tdX; z{mv=3lmEqQO`sF*ey+d?pN@8siKpxAWawf_tq{%urCz;W{WfN7&zynesq(>fOVXls zy$6zF8r0X1Rxv1GKLkaCD$?+HoBD%<$xOdiBxP0R3io5UkCO!2ebF1MYJ>T$ZgY%y zIFgxW0vlg}JOXD}TQ~N=l%_{cn^diWniH6n$BKj7WZk9O=POhBYaHtD@3c1q|FwVv zSI*z;6F-mM0(AZJS|6S_ho_7=8&RW76$wWihKW{5zRQC8Mpf;IYI{3H%8af&btrv} zr;v4f8YQe1LE=%~1?^o;U1rG~E#=WmY71wjZnJM5UnoXSbr`xXlx>zM{e4M2DNo-^>T#@; zI6kgzG=ha>RCNVwlf_HqEItmzPH6={<4&vDjn)X`rIuwIs@qh(sNBd`_3Cq{7~^ww zg{P5TzfmV7XH0=ryLejcaUN;5<@+h1jBVk$YBo1KSM0yL5Yl{0UESLxAILUy`{hx$ zp1qKmU~0;yCS_&BiEV*~mSlOrF0PI1zB1XaZQTnSYsbAdLlbv5Z`+mj5%^&xc?$&v`2e z9kXT-Ti-{x$?&TMmvj%G9SLl&9WZ)e9{OD$$@3NS)%4NMZUv7&P2yG$61l;2$b-QX zar5(Yb=wjWT>Aa%A$%SxI||vR59r%!6V}-D%^ifx>3-Yo*$tk-q?_+Kahox3|LvBC z4lAw@PN61sTIF}dtw`(T$6*uD@i&`%5hn5)Z`MAfy7$njfnPkBzonH;7Gl!~jw6-G z9MjmS+LZnq+AeDbZ3Hp%jt(uHdPYvIT8?&9*@qI#)s_l0)oRRR%+Lbs%d#U`&ovca zgKB!6{2@#4u`-(ag3l~jd6}uGPnpAW9H*$#WSmB3?U4Fn#f733Pm|QfwrDDw-#<}1 zZg%W|R55D%fYg?9Yh;8+V71>rGv%&}X0k3y&(JnXio7-iW2X?xtQO4OV#q`$ho3r- zzqSLJa#S3NWMt9oBIVuUsf=|wO50xUO3z%bWuo%T9mtOFJ`!uG&3+4gku2?0%o1ZUb(ZkVPOw)nhR0L7n3GKy)0NG$=;rUPYUJ{)$f)0|o zEwr2R3wPxiAN(DCwX>O#h)E}48a2Cg;1r!dzkSsq@F!p8G0e=Bt2xCsl*X_J_Y?WIBuE`QkV+;ynsl= zBP0_k1bZ5XeHs_TkVeRfwEiui1$Hri8;-LJE*}Lz`P@#t^#SimMODC9S^^Ca3XMpO z(TKxg%!$_M9iAu|2RqIDslPLR!a`KPHPryq+F014#iRa_x~*jWM%yiLxZXnAtxoLM zOWms;a9k-m=TX#qF>4)Ihhtvxs<*+{T2axX9n^V|+N~trD*5Y?X@nB5xOzOBqP$dk zCcTNWK%tCk&s{6(9*^_db|}w);%<6|XRT%$Ds&Qn^`FOFD{SXf3SF$T-a=6^%cwURuDsp+z7PJvn)!%tkru&a#Ml(XSjphL3cL>){m7M}wN2CE^2(FQaep=R zn0^Hxw8#y?w8C_4lz+m&@2;I>mC@9d;-f<8`gt|0glTQA6+RqnBnn_fEc|~KU($z= z+p=hAiRA4ui7MT3ilSi>*SnSQ9Bib7S)SU8kA93rWQdDyuH8L)9|Jy^g@3yH#)@$uf?zBZOrLClfum>D@P-J88s4?*zj6+@ zP$n_M2!Ew=X`TV6Se7RH60C4Cea3B>eQM%>ZgXQbSCyV|Kz3TemIqji{HrRiIQ;Vy zBP~s-hV#i^E%Jfdi~eTr^1nsHB%;yw@$_s&GD*KVUKyQZ7$$zJ46}Q?SpVOQ{jI?v zp2;-RJ9dZ?O6OpN3p<{`UbndKn2}6`=XgrGj#$j4Zacsbj3t`0| z)BpqdR)P=@I`hPhUCjSCgz*-{I$q_E)a)x9q~zrO{*|yA8_PEdSw1@KgzXy@(pBlkH%7KwA%yJbcb~F&gAF2j0ECg_% zsEe#WX`1H>8y%-kT%;PhcEw`a7$Os}&=O&BSRz{#B_l9of>7U&8Whw#eHH=zV~m_c z9KV*L<^8u6py-pESbdRmubymcT|}&{l{GCbBmGsBtPCdp!t$m6*3DX14lpI6(6|1t z9+bYnZzsx>v$Dnq(m|R;ws=Sy6JFK=Ug|UB(JSTIxt4%HP`6YFw?9BK={glyccnll zy)PUP?+HNO{ptQ0wGyAau`Q_u8$mnqtz(otRtz!6r`+kIhtk<#`Vb@fEk6H01^lcF z1T!A`?|bc~KW6j19$_y^c4ZOV0^D3XKlk=Ox2`{zd~>6P`DKi?y|_9XvW%=tk1PxG z&f#+ii@&hla4<)8g6R=MVS3WGAz*80{;C5YX48LJUae?@b7A*MPuZZ>3@{bTRM;qX z21Ha9m6frHQfJwZz)6ox!%MvM_VE7@48u#5_LXXIw&3d6L|?sYSE(E9gj6q;>s(Z1 zRM=!huRp(A`yr$;L;>cF3e|Y68>!hSBqfC`aaI$CN_>_eQp;V$&f@g@fR0#mh9=Y9%WFD*q!YlAsg z+uK)FRoSZ?YrFZ4#Q{@MZqmH4_c=K=R&1jGThj8ggh`;YiFcU@xLH}FP8LgR6Qq#L zcN%Y6@>Ee1kD5IGUGAD~{Z>8&+h3(dkWpLngytmrG@NII+RHmS0&}2zBA!0JpoV&< zH-=laWtyR^%@Pp8tU^Vd(?3~%Z>DlFKZQ+cgJzuAZ%DEf;x7?b4Wd$r@??;+tlT(z z6UEM;q;j|jc^fun>q7UVR$z))O#A3w9&Bs&)GRW#@~Ij3s&`p~Y%N-^zGB|u zhmW%I3T`Vu-3A^z!GhR<_x*34busn>v1sudot2x7lYEAOz3bE~-y3r5b z1=E3ljxdMwrAgoBhcG0+Nr14vvQ%9i9jw^dX2YPSuJ*TnJ~#tzKxEmYpezRJ1n%!TkFuWuc=ev zXRgr~0^eyeV!}q^)y_+n-rIt#+2u;r7yj!)6|2ml)kKkLw8bSuEafZX$cJL&=bup% zBrfc->b1E7U=mGlVgAaz3>_laW0?|AWP=3(HAh4aurBefEe3U9;^ysi}0e0?zDlvAk1rbZc;hVFo5 zp$Ixs+O5Pjr^M3AahBHP-5G-9`Le`ZdoQv-pZf%XKVC~d5~j;!@t|xz2%j>A5~gC_ zY%&&EO3PaE%T_!WN%iI6QB!U|aEdj(HNx~Z%ooEc*pw*+N$l|fzqcfO^6S*rgGS|4?792js{ipPQPGBuHnD}H2>ycBjyJ|o;6U;Lpdi)zK0Vw6!LSj*HxE@ty(OVrE4oF z$M?^~bvLX{#+cPV&PM0MarxtL`f_r-)k!2cD-~wbD>G6hEcP+EtDtGoc&B(L6zRu7 zDAmc5nHi3)nNsK#eeFY*PJUe?j!S&PO$P|=mNaP9&+%$*$mtzd(sJM2++3s5a2%g% zu{%zHTq2e)1QA4ENYfa5D5{k%wGyjbbXJOd4_8Rj(E6l44vh=|vj*Z8LIj2r>sDt+ z{(d;=f#V=shV{~b&z{5gi6|KUh_y!H2R27CO>tOOL8DE8U7_vqu2ly0ts24)YZCeSFxONWgpPX9m=WCsb){Oa5 zm*&z%wA<@|yy2=2k80JxTZIyBmmV4~BHkJYr+SM9ZWH8T4Z9|2+KzU1)BE~=dziYN zo105l^Lj2{g*L&e+RERm%9?72ni@L?hZ+Z?gW+_Y#M5u9W_a^FR`@t0?18*%~fuvcr z4u*>nijXxM{Eb!$bdp%blo*sR>&gGm85OFCdCx@=ox4{^NWwq4{!LpqejU;*dhTO0 z?8YFs(SzB9E3Unv+_f}sz>Ittom+H~`YLr8V>~?Xu$AN$Ob8t}+IHQ*4*v)6uE22q zs^;mWF9|&GWKXhI3r2PopV{cu1LLP$7gw#!G+CF(v}?vZi&~2u3tG!!tx|=&;_w%7 zML*m)3O=o=Yf)Vng*@lzvQ_})VLn(9p51zsE3U?!;fi7huIuNI<{j?J*W z_zqfCupXS0BphBAf50u-&ahHI7;h;>f}PgtydhK6S^Eu&biCkwzSN%F4zI!v?|~zo z?ZTD7#GVE++j2-NTg)D&=^?ANGtq@M%P#d42MR_2S4TQ5Jqb;bpK zP>O-;Suy~pCrTZ_@jOnB(J7xAbP44iPkvM^-&zqfCS0xE%XTuHb>b1oJM~xXA}e3$ zxCI=;!?wDW_0{n}%pPqAnf5?qtum?ND8gn79yC%8?B;2%L^2Jo$uTCMDQI{8{*h^9_#?=P5}< z#4Qs6c=e4OX!)p-6EcWQu7re|CpF|dWN~UhPvKjfl(7@jzjXtX{*Lep;XndzCQ#SG^5nAN3) z^2#cHm7NJ0%0JA9ERSN$@ib$BaW$ipA-!UN&}ELT{PEaZlcllZI8mpv`V_J2K8UEuH7gm| z$%X6pwQ1ATX5?8CNYCZoDmV9BReO@SOk>) zI%`<+&o#a@Zr2linYCo)s6$I+a7E2Zb0uFv3tE{E8pwl7BGBt?A8$PwxEN^II7_niC&Whx1(0WPvhalMxFvLV0OFA@lvibg3IASv^TH;a84UsJZ6-->{5BD%f;y-HI6_#50-#c-j&oA~R zYYZSV@sWxc1;+sDz<4Xx_@_=UMx3ct(1)Qy24(`!$ohB7AIcYMHTg@N?W+u`mpVG!rnGy2z(1p>N_Idq$R^ZZqj|j*d`#GAYa} z{2Huo6FPWl5HgI!3N4eIhB!W1U7?T-f?kZ0&bgZzNAq`P zVM&6^FPZPH1&})Rr#597;wnRQ$dV1nwm;_5QExB(nx7YSgNQty6blY$fY-~*#0wY= z)ZwyORhF^}ENx?u`_Qa2Tl;Ov%b;jByr&zeHEhAj9t=M_St!&~`#0gN82Qv0r?efD ztNf@{5)?0Z6>(Hx?HdS>THHq^vT+zAaT&#PzD|WJB@hs-g9@d5MVZ4{477_Ux%uGy z?{bcSAl-7;7Q+0t{a{DZSd1eM%(lc}6!k>i@uOX;_%x?ho&qp-CxOZqF!UIeYd)40 z*A)eYV+mj8c9HrI>>E+SYNCH0NDvo;3muPu&*%TYf_moXaMFfnYPsQv!j zsrnB}wt*DA=SK?8gj1qh?RlES7$is!{5jo4b9q;>PXWBg$a2`>wYN~^D5+pm1k^43 z)5?^~Rqu9_AT|D*;KXeNk!BTzm&i^`K9_5*Ub=yy;aVS7_N%OM(D2cr@re1p_>2!P ziToUOB)hzzI-&^`4X)wXT@%Jyfv{s3chsiMEVcU@ydc!A&NiSx!w_qeTt~dCWK{qS zuYOyR^mY&D@dF&_xslyoZA#2n^eBfs(kBTbDII|#Z{U`HrKPGRM@XXlQjEU4MhcFr z1x08<29v%b+R6OuL>Oo!Ttu($cn*Q{wab{2B>Sq%T?;1S_lt4!K0?!K*R)GlbdnUBWWG`71eq zZgB7j)22|fdU5wS^3;V;Bsx@})cs>z%FSS%S_{J1-}0nDCa`YFI8rlWF1wuUGPuK( zHN{mbvj3ieY@}(8sAf$Kzsh@-j^$4he}kJXR3j4hp6H!eXso5Ulwf7>I%Y^n=Uoim ze}q&>Jn?{Y&fTfuOVtH^-}tjAb@Bx7B(2!(Y&XB9IU^{p=i`z$&7YjIQEo5ZLEQm0 z%8=(w{yQ}wo2-Z2T5o?gxntI(TXSNv4meb|gU)C_MPF>b+ZLpww`E1^5<{!XO2UXz zr7HhMahin@S&&Nluf|knq3JGAa;~tEoGxtT6p` z`p^HIbWsrFbsMLgVKF$&LvB!sgAxic|NA)vDJ3K4F_1K2OAN}8A}Mz^!x{g>yVZ~r4LSd>g~vixz(pCWPhARqj zj0$M(8Z*ewd57;F+qS;3^qTC(H8(Z|jR~rPlV* zMPft8`bW!GF2WCf4&e7C;B;Vx9&!V!<7(!%VWR?1T)?;UO&9n2$H}Yt*=qjP#l-IF z_|U%DLsv_y4F3x;)2cS90vr#MDH_)fi=o&fSh2 z55QhQ?`Pq7>?P7;>tXx!QpLd)C+kCJVWGg0>+;dP$BohFW_oMNq(w&u_@4@9n`1ls zxx1$Z@2Wf7&HCk~W#MJ}eeLX}YWmO}P<8L)$?5OX=+)Ww)Xkis+Pz~7xTyB;sr-C< z8gSh*D3kqCDA9S6|8zPU=n!01(AaU;;IsxQ(70=9cNkevz`Fhz8_wN(oy&-fzO$?S zZmzpOcJ=w-dY|36u9gkG{@o#Is`?%PdxrVanQs{cUcRV`H2Q)T68M$iWa>!5rd6|1|k>C98YUycK z2K-#TPJK(0iG-XgboGK4s$0?oo|0Od^q16u>coHv<~V&X-_yg zC0IGj8nmffHC;7XRTDE%JDfWPs+k!dxh-cQEdcu`0XsJh{~R}Ug+EyMKXmX4FAnCZ zSl`>r;ztkX%dcA!CU%Rw0??cii64nqPY=nKiU1$nM-74hU=CckBgv&M9xct@J3s!f zO)mFV9WF1!TY^6aUo?|JOT&a;-$S?88_V4-Zuc<5C-JS~fV*v;zr{4{-iWN2((q{=XUR}O^v@p*k- zgA5;kn$<5jZNuky5Z-+6)hsCpBATS-l=KK*2tuQ@%P-cNU~x1VFz%Q-WdO;uk=dly!p?v4DOca;Ku zE7=^eIsX3d#;aa#%WffO>nk;k-IdKV6b07?ciNrGJKUPQ{_b<{-YLD_u^|T~gjrQ% z@|4^k7l*MsUps&tME##PGnm!MFE~Lx7s!F#E!V1t%LC`eFWVEX+2FQ@^vtW*k!h)~ zi=2tQN2!;uj+z?}^`DkEr>mp4>-h)98iAY`fCE%ja;ybbV$XNW+70}$Ob;Rae?``3 zZDB_1{q;GZ{M*m#`_Jb{WW()CgHme}xWmlC$W*M(cVEZ5xC`4_79QYtr|;Fz+}%e3 z<`r>8$AHp@+^fYb&=c_e_PO+o_VZGd_;3{YI=1HN`@H?OWA9;C`+olETeERVX^`#k z<8U!FX7AHp|5zgU+qUb&_m09IDL^n)eW&SSW~KeAhBmRrhn7*$W4~dhpveM@aHi8@ zJ7doh(E4N6x}4q2gN0?2)p8J9VKdV)qkX3B=lPxgz5lhc;xG+0^QGYis9LM~d0R2? znGvjs`tiiBQ@f zNZfvSUnn|seIr<4TRIa~~UC)R8m7}cCT^4@qr-53G9 zKdi~QW#+MB1!eUI0WmW>PwJ32iJS&I&y3q|3Qz#}kidhNikpM?3RVk;Cn8S3o6qyd&FW)mK4Z`I=i>Wh zZd|)@-oM^sj~^SJ(jmt^Rp8oPW9M1mI@=DvvU>wD%Yu>OW2Qv|N&cG)=^O8x08zcC zny$tkqO0h6Tlu#A!RMjt=iKDy>urtgGCDhyK}rxh;%R#p z>SdH4W#tsc_di}MeDDgAMAO)Ox!Ft8Uld4qHhB6`^}m%6Qb_~7i-;&TQ3hk7?gkI< z(Hf3op)DWJyyV$LV*@%$Yn$4jrS1knky#LtYCq17ImX;S3 z6ta8xR<{CsS2}cjIzFHtEd0OUkAZ@hc3oeMNT9roE&5$wuD8bv*9RpXD--^TNqQsd zFR)Ilb9aABNXvXE652o4=RGZbl(T3LPpG#C?fKN#unTBM+VNq_)HqB*z{k5(jpK zuzY`~n%wufL6Bt>JHe!``yV2ON>eu+HMW=fH|@Lf7KSvQVu zA0-M@dSZ@3_NZZK^pyI8QlAbXh|N6`21YvKmiM|34m^m8`8dLHMe=!1CrKuQBV15BJ9SRdKhROB<_?D}R>22zg&l_>c

UL28`ffg0@gCjQ5j^7eZK(Um)&%`#?CZf(x;7nX;KWvQa zuz7&;&`_5>)Rz&W?pEbV`azsCHo9bUxkM>pB9G6o^D%hL-g$MGklX>^Dek6BMB zOdmIH%hVuX_Iaz617#i1|Hnw^-{+fgVPzp~qsG3)S907A zgPg`3=Vmhak-bFv9}>H8v;;$cLb5}ONb(njKy*J)Bgf=WYETb#7Pzx!tKC|jL?|SR z@g4;&kxs)LG-4& zZvt1mUaJ8xk8vZs&0(n9w9rW-gLIvw^V==IXw8nP|Y$W zD=3kFy3X&EKaYU~E+?)!CZ7y=NE= zv5rruECKaD(z|pDdc}{^|Gm4ZSMc#g81D{_MaNT#9nnM`Yc+XDKwvE-I5L|J6wym| zbzSz&;reEiQFqNRi8(p)3csh+fhuA)bX$Uv)-#q350E1@;9}=Ov@QNFPSF28Y;uBH zbb(q_S&sD(;{X2)fCsNVLaBxGqiBCgCpa^GrE zIw9w8K1z=8zS+ubnT5!SkU6J+mRnvG0br!;fm7PwTDC4?KoMN=9ev24?%z0B8Q^EP zx7nab3KA}`?cKvoWTsSPGkJqP5L9>nkwW5oEHi5SkO*oq3ukQ;Ru$-M{K&k2sqv(( zo7U^+>SzkZUXboyd>wyLoOQxRYe6%rqz=(NoATW%gQZgyX_(t9#`_2?$z@Hp=Km4f z#=n<)n>Q!bR41=CQBtgk)1QR1CfApip&8CUso0Y*zN6N( zZtR7hV5LvMM|!!z!pp~=VB$F#JBBz$r@JmU-$F+G-b*nkv_B>2&tA9Oh_2q!6i+Vh zm1~<{%r_Y+Jz3-v$)PWm7@LX*h`l)H`MbS7Q5%rh4emJm!~N%Fiselo&&@& zsLI!zt|+C@sMr~|lg*1Xs2#*qP8k(#|O7Kk6G2kZ2ZICQcaVLzCg4x&uT??Y=z#}F>P`XX|Gw6r;rkV zwds21Y&8;s+*BK2qy2V?`#`O8miTMkRz@j4uO?|J?TpeVsdq22hutagc9h`|vj{aE zyB`=eD8fcjA{=@Ou^)Uk4zxh7N>w>pkf-$T>NJ>n>P%gOwE9X#ST3T&g?M0OR1nq) z@8&mzdI|Tlj=f_2ScUWt|3}3J5hkMYk7^aGx&Z~=#^m6667#Pg!1fMBHlli$PEv$% zwinTwR2>Pfj3a%TRD(3X8EK_1F=SJFb2Ymp2-Km_g6DAoMm!=ewF<~+9pa8Jx-IEp zi-c=E-4^}~W?Wsp7{0N|$-@T2ftmRLbq{?djae)_lo|Icmr$kAP9%frtgVlJNd`RAD|K`Zap{Q&N@4zk zfQn(40vIJBt8MsZqWT^lh%H2ANOU;wM~7ThnmfED@A1r{>9WHkiH{l5nVtg_$cz|8 zN)!HJh%jiY{#L_estgOxg@XgQ%!AU|BSrjD&#!cRlTMO~AfNEuGK;1r&okF228A#n zj?`YCtGBEtCT3akZr=|ETgtJJ4vFp zJt(z*CPlg%?U3EEuD7Tw6+hC4=so`qDQnrT?|N$X1MMlf{h<96FmSja$olVO_xrt| z5Plgop5FNSBsG$+Tr=xd^MbsQ`w16%zA1S*U47V|!Fh}wp=yT$Z|9J%PtTRE<1NgO z(8p;%F&8c!ehYTdR{HI$V?aRrvLKo;WA0sYb!hlcYJGh?+l*POK|E~&%AaE}(j&nn zi3kBEl87==L`$8dV0omAH58vN? zZ-QLTXMy}H$OHSm(1W2_-iutrN(11JSsHYjxy>fL;ppBSS9&6qG<`iFh#F(ydEX80y`%}o(Q%uIpQNJPU?ZMqW`K08T zq;F`u6_yT2Id_Yft(j2IUT`)L(Z9y9s(i;7qO!-%HfrDc-bR0%9c%w%H%rFX_7&MD z3xL?zgkBsRv?(N`tZXsDmk7vGP_wj-RHjplx@#;>KBhDBdVM)Z4XiB{gPuw*RbMmG zthxWkT~Eq}JmUe$i5zNud-=HnsS_T&1ncN@-XK$Vy5ubsa>rbMm*4ms+e6LJOa4XC z6s0V-lt4qXx`dT}Wr46(SE0tNEqmIkZMwZ_RFQWS#~P|V@41D}V{AEGn_SHh<8}u6 z2YwHU0p&(9P7oE#g+A;Z%VSzKn)N!Tpk1dwO#Q;DOFE&t_By4$kR+KHQ-ik|8;DX8 zX-Q`SZKk>_*x+djVIi5zS{SDwR*=W@U6iiCrH0<_U7&Q8X6ShUR!aCwH_F=FsX3ue zNByWT5cU`wbRq~lVj+PVob3C#rndiQVm!Wnvu@Nrj+B6N!A=q$!F-4S=f@|9N5n^U z^b^SkLkhRKwWrv49a9$OTRh?Fwy%ga{%B$?n z{&1=}IQm5m0rx&OJyk9@LjKIg94MG;ujGqlwALSW4l%CzN-W?2d6kyK8EFiDJe5}m zyJ8u(_LQHaf@@C&dK4l4Jc{>wt`Zl`QIpgmvu7y7*W}mL1nQ0{udPgJ=l!sW>DSNN z3e(r~;Y-h}6XX3pHr1apZOtf*ZrEf(8_kCCUKv-EnVQe%D7k3}5)#5N~qA(<7GR!wiV`JvkHkX%?p*Zu& z4KItyPDvDN34L~-Hi|YCyv=lWIUQ)Snio<)l(4H8wk<21*qcC&g)ph$3ekL83YANR zG%Wu$_L+7O(roa))Uww8-+v)RkeOVO5@d3}Z-Zj8)Cn{`!_E>?l=C7d>2UBnTwKRy zzcX1(T`)7m**$FEb4It)fgQ;cUG4RY=k8aVl(Qxdx!6)PKDUy}06I6%6~Dw&XQ)@m zZ%6O1&8s5{-i8K7u>0L*Bq}hC*WZ3VaV>KN9S6F2Cr&{~8f_UjjDDy3Uw;d-5+NKo zx1r;w+@wGELRcp7UMGVtjtQee8y7ctma;eEb@8?6<@$+!NM(dR`y5ZZ z*s&~9FV5~?NlQap0pJ!xWC_YV-gf+qX&RkAelKP63-z@Ix42CwIpCtQGb7k&ry7Z)!C- z6i`kqcLop;ovZA1mG%sR{0NS}uFTHb62KgZuRa)N$iU+tyR*s&o-0B5 z<845m_>*gu5_a)+YMRh>E44H?-;#%pN?~A5yC(aQ8`f5N<3{LLWo%g&Ia(4X6-@2m z+;OgxrgZ)DQQwC_-KbXo*pkk2xT8E^B^lHXslqm?{?Ka=2Cq!#Gy~%?YdOzp8zm1S zU^nCMWpI|?JugfQV)m?wZd1jKZ$v006eXo)4Pa5>m?VK#N|?nAF_dGHqGHDckTxtb zdggl$Y}Q&V_py&_IpS7mktCt#nqoVewr1Gac&5UUbarmcc;X>>R0%k4#L%Lrtl*ZW zyHPmM1Eq=x?cz zi{XS?RiNRn?3?9WqMzw*W0@8><$$ML&x*}tvZu~ekfs}JN)4F8a?hr}d?eoOHtRp3JF|Jb+jGDzzDLaoTf(EC(-uV7E_t(zXK8}YY#iy-cPzkf{s zK=G0XMLuAW8N#LGp(Qg~>x=~c*Q~#>mpC-9Xd{lwBE;G95g+0b%El$JZOz&~r4`t9 z98DdwACM=XQdFdG&#!5v`Ti`_TuhcDiN<17?c{^Lhr%3jR^=woU zX@tM1%!n9doD@J7|57tp7WF}vPlliVMpSmJ#zV+=Oi&yx)fW)RU@fBfTg87o~2I(|F$uC)3xXRT|R zIRB99&v)ESAzxS%j&^3VKN)wQhfMH-9&tYsKlr5e#@ZJSBYylf7pZ#OL*)Vw9EpaD z$L^M&v7?Ai1ft;PF@Jd*h5aFZF+eD8MP2^x*SR%75S(fJe)4L3y(@W@C~`X;eJ zO~VK?)K5}m2_=BuJ}O|Oa`n>qi0l*r;rt7c?)gqRwkF)@v6-=yBVUZvlx=6zwN|`6 z7*WT3#mT@>t9#j0)4wuG@_g~u_Rn&uWP~#F7b6p#bzv`0MKm=t1T;O?Ak~RqVT<7( zdxU11JTd>m>SVhJsd zJ&upA)*jUIlbi9izUWpVHd|!MKpX|B^DsXW?g9psv!GPu_z*vV{p^)U`Ie!xX4unauC0{2?zr7$O(M!AcWrd~EcRk;1Mx(3&ln4~U&a!(Yj79|az3Mx zTdH7n3^rL-c&Wrn5*bGeA598K(3RCV(>aQ6k<&Iw$z46te4Zu;C%k!;Jc&~etbgAZ zi_Z@%1T);npGrzeJ=@D>fDk^#$ zeDPi&<9_abhn~U2r#zst>*Z)!wC0&AGWVf=>YB^PLc}CZV5Q3zE0}xai-3$&%uaoc zgdthVDJ&`Ag$e4*llT5sFqS(p5>mrkGKaEe&8RRtpG>l$wGtFC{F4f42NR0zK{juJ zsiW%vZNCZW0gMXh?m^1K_*X!4Ira!%STLqihBsuD6Y2;vzfe9|>tc*}J+CtH>PCph z@n%0sMxg3o%vd__ZlqF?ww$BU7mHgr*u9R_LYiV%=qoePkIE<*5n}^qNRckbcBM+)b56~+Wjj$V^zS?pMKs-?cKAWYDz+@ArC|(zBa&m$iOiOve(1`~ z_&LLmpUo{Fm9gGun>h#l8+EqASLOc$OF*>05%`_9?{&3(ng4}T6KSE&x|)U%)i7b; zg^x4%36n#^$WI6e-z6fs=1_`Aa1umRCuSAo$e{M)#IQBshdL)ma1MmmU;MywdA);J zTCT%EtGtHgu8!m$Y7UEce94A(mOouXa6ZjGX6DviC6!J@^k*v|H^?2gn0$RBwix@?xveZFN^2 z9@w*>+V?10eCgf0mr+XPg*~Fe5SLIZeR;X0bR-ocO=v)8thPR$D8% zYRoMC>cV78YKu_WweFhJHi~UFR-2B~T$6ob6sOGzh=nnca{~UO;azR6b>P1h7*{C3 zX*avgP6tOBemKi3EvE^CfA1c|HJv83u-k@7gA=sdX~G0*;ncv4PJ7wutTb17+Gex8 z+-FASlSNW&Hd=;< zNa%2=-<#o(9O+SP^=%xbUKovi9<~f&kA2wuV?A^gLJ#6Vq|_wSkJTw<2o<&l8v1z} zQTI&Z1iyMog0CMt?;kS+`boUl8wKb*8V(eCJ)iB{y}o7rBSm_N;f^3`aL~tQY3o0R9R$do@nix%AT% znP0`_&IR9pG{De*nhQRvV?Ro2G)?JADCFO*S$_D~o5r0RzH7SSyXIza=e6(7Yu^ue z?L)AB&z>+IU}O)`g`Z8{`)2y>J7a$P28Dk61_IfihHX*{St-gVUp9d+65tb%pyLi~ z_==0cECfT)uZTQprH?jN&n1n~7`e@jk@Ai=g2C*Y-tk69O9RV3(Ut!DhIhQvf+)f3 zNN0b;&7trpr&}aso%Idf=y3Euts~p;MR*3i*|*31h35pm@fV&`n{`cM5A*KqV1QNe zvV;s_k>9h59NlG~jkJ!-xt`D*-H}rsNPm^Dy9hGg$laYRKzX?%TG~(U?Jj)qAk>1B zIi26-WYD+b4X~swnp2Jpnws zXmmEn#7$)!wY>-sD_}=gjGn0)!(cQ*{}@N&mKglKcR~@hpX2pJ4D?x!Z_CY~;%J^# zyZ=4gdig}%|7Q3_EH{|qygx@CK-dip`5oz7#_f)>nDs@)Ws!YJH6FNf%x+|W7UWW6 zm`a*qV1l{%?H}mS>!}W&dIb;mWz0HzLCwtrpds&l#b#$lC|@zT@Tm$fzr90QdE8V8 zwDoS#u7ME6$cl-D$ex0TE$V`X6Gk|%i+-Uj+8$BZE=$0x-J*PDUXa})FPZXQ45S2* zO6B|a3j6tpm|y;LYQ|1ktYGD<^|*+$E__ph>_xnEfE*Pag2}pm#^{@)gbHTu`2M{L zU#n(Fj})G<7;h&3Gk#e%+>K-Neaj*3AS0%~X|Z^sB1!fGV(tKe;`;0pZ!~cXng(!7_V+qlxZ0#h>1=S7i8II1_D-I2v zFWsT4mZ*XR=?Ql1Pq8!*5b$t$=+r!`Qu8X0+)AgiS@GaB>r~b&o;6c4H>a&^mdBK@ z(47ivAA5!7)`x8pq^{wg4hD4StFwZCyY#o!g})9Z>vSoY@?qREGhn1FU1ks}^hh`c zI&}S~{wPY|>P9v^2v?xo5-MBh6Zqh~sWS}tYyizPj za&pw~xadeoCz0xkm`1xoz+<`e_P$@o?tyOPB%xs~N^!!VBRHwhaHV>gLo zS{LLE!E1#xk~g&AHOorR)_-o;4|UsaAt?O|1rP`=@Q~pS{a#z%@jTy=4!jzu?sHW(x~? z!S$sM`6YLFZPN?B?J-$z@>iUacW5FLxrb@ZS*o=byjsh$Y&gsDi+o{UbnHb6SagoC z{$^5&r|2e6#=>$*RYFH6isG7VQeGNM#-u?!IVEj$Z7w4+(#SZON$3g4+AL#@7h5*{ z>Bw(dviJ`UKgF*-zl7~z8lkBK2>!W@QU@L_ypZG?Hv zjR^^Q3$!3w#+bD5FYkaBeza6$6>H!RaE%ozM!-x%D+QD7r3L+gB=ycxR;q2Ldd8&q zJQ)|B!z%9iBlNp%+~$CD-ZV)(b(8gMNLb?UkSfDuca6UjAa3)=Cj7U6tN_2^GRDzUdW8JO=jddV>D1vkCsAh)}bnl z1Zq$}W@QOSsp>PkQiJl%h-dt{g`N)ii#XQO;3ar%13mPzw8d(Q7)^&>tuXH|Pq9tS zBfIh({*rSR5$I5$V+OV;5cU#Q4IG#NI|KpkiwQl*vgS^U%D^yG)26l^0Y))TZLUk zn}1tnGg7sSTJ&mZU(}rYQz<5ee6Owm4!S6fx{iq1|>IZk@%S-dZy$gp)<*}aDhAlIUrLxg(y*a>4H$>Rk$SBiqIB> zOm5&X4TI5X7KTYAW#%x^KOI6zmv_l&?=Ko4#=y@uH~o6G(X6ifri{z|hB`%6m^)qr z#;?boGx1li$`y>*&*LgrC}Kaos(rCu9R#P1i>f_k-=di7GHBKcDWe&;t< z)+xBE_+^q*rEP?KD$1OqZEO-!CfKyKceI$3e)P zW6JV1#s!C9C-Q;mQup|Ru2;`bk{+*oEGmDTZ3V9%jxG^~l#r%p*;=7Rd#6@;g(;uw zJr#9jMR>&{u1LszMp0dKiNZ<14HLMZs9XX(NNPZ)4oSI(Ctaq6D2FH&8b$gW&qxA9 z4wO$Oo(@4*DHML!@%I%&DK!VPogriX4Sm7eRnQUTH9wj7xjIAGoV7iXx<@f|<}sQ# z;}?k$Ljq&Oa{#|3aCSL%Kf>>@p}}8|1$ivYV}ZbD`>ncIMTV(*pMBJ; zG<}8;fnOb);^AX~eJrt$|EaE5p}x@14<1xezZ<`P{|;YCrv;8=_zHjUE2mFE_c7=` z4|>EuABs;NOjX!8tnNbEm#1+itA-?V5hdj*Kw#?>ywGKQ4%(7}7xeG{E2j)tjH_TuIxQnooSV`l=OWvG^ zZ{uj}BWhD@kqK#X7$4bHWM9H##Z^VjyfivOn^RKuPsSqzm}-!kCliA|avnU0*n?1j zLS!3hxsg_^XL%*XdZoo;jBIcu+v8kXmU#gICIfE|S0I|X0hb#>W@M-6*#(#^gt8)r ziUKfZ(?{-t#jdmO)vD%ULs;n+Dmlx7k-=jxKETiQ?EzuByz-GB-&J*{Lb1_SdJ;$H z6?`w-jbrGy-&86VvR-)?ehH)Vu)NYHy zcv@5-Bz_qk2Yqi;Se`@YZ6)N*yJ=IgfY4JthcbS^m z!0^Y%6S@@gf^FfE~I+L@1-XToY;>UaRjo73{r0^;32Nh8Bc|ICY0s z0Of^8yjY2>(}I#G5H6Y(!FLySfv{e!RqIf3*64cGuCSl1E9+IO$|q1Q++^n)Y%efo znQV|Npuc9`ORVjVH!2^s>hl3~VK5Bf;)gn{4H)8)Uoy)IMpE>Yyq?Js;Dm6hL2pcM zJ_vG=7=sW#QZqn6)6GNmNrqZQDEw9klMRs>eyhWU2u)TkNR zy~J!zX7?E3#J&HcyM}nim+Mx{7&a9y8Q_Fwris>=>{c&t@Zw@G@9@=2`xsMBab{lN zpPtZf8Q^AgW}Riv(E*;Leb+x69DV;ju+QKV%@kqq;nd9+_A zJ#|C)&9cU|Q%e;aSy5rJ$5>bdf2@tDfj2b_!voX9$#&WIQs8CIt#8P!AUZoRnzi%B zDfBUlhIu6suH{k|b!;6M7KNO`;D{MDHW)9kIpskl~BctC)=lwIlDl`EdVruvPc=p4im>6~a$U zEUucmSqW_W zA{y$zO*zAvGDg(D%ykHE6UD^+Tw1o5%$u4voOu(oT`7|~lgNZQbTrAa*o-eN`+mMp zstEHRP4NB|xcaGS$8Mfawj)=bRj`Fu4}j0rqZ2pF6xm(@i#c)g95LJ_3pio8NWwYa zXV=Uj-7?|t|E0fhzZ}ABfjGQ4I_xUhf@@?IuBp}kQ(f;sP<6e_?vTsu-nh&!m&^P{ zxlGr_6}mO9u&d+>yIJBdh+2hTkN5}sgmTyDTDwNKTBk|3TKxDQ{J6AF++07CS|4tJ zWPOR7pl{VuHx~TWqW~{JMRzl}?5I-?Plppa9pGbN;Zepo0lN4OJ=D>m`!!m2SJ%nD z8;&w|AA#en!1QVWH`VXoq1G3!E_hd#qS(7G`SQaK#&4UW^@+HB(WH!RaWcc~B|y=X zBX|ZdEqg`9`j6bs>VpT}l}EVn&Wn2_;>BAjBxGNAqJa-TcU3<1&UQjPJH2OI+WSQ*cJvf` zuFvO%{aAMmDQe-n`?aC9(Qfh9;m3xBq4oL@^1szHJ+4`D;^B=hne<=_sSWKh;a5pL z(?`t>#vf;AVQLBXa#(i*JKabT5S&qI+KY>Ub;;uKi=BK)dW#ykUwQdOgLfMq0tK@%k)i$Ymk! zVF(pUjy7sk3%1O#EV~JtLSSvMzRuPrxZDs6_EGD>gW#bXABup*)=>i!ZCDAc>Txut zCh~8LM}`ek#Q5$-EhSfmcFedPcER>pON%dv*K8>#9BD-mf9J_vXVHO*#E0I|hWE(9 z33O3|UyIHWuP^>+9ofJldW&vLY(lU&K4nLlxhsVRJf>#j^t5}>pWnZCa0$vmeo~`m zwsFd)-@mszdgNCYd9Ka4mn^8$)YHA;Gdj>`^C_ay2U0g$%;tV}HV67_j%~Jod20U( zY;l2D$Dx3}9tIaAPYi&(Htl15+CM2?rq$|3uZEogGs>^KyR{+QZt0HJz>RblV=%Rf zD@pE)J zrbX-?AI_hzg@Xgrw2C|r@4VQ(?`-Tn8nS8Qi(r&b!bupT-(Iq3qI>SY{zd1Yl|YT* zY9&&`4act+WQjAV{56Tt88q8HeuM2pyGffJno=hQkOU9%t^Bf&*;-HBAyrcjlSXz|7jorq&V-YAIf0n*#BFkDC+aM7dFmRe#%g4{(iwKmNroE@e|)Qa?S zJ%v#_=JDYr=cof4ry@jO+OLXd3OeC{>%W{Gk7)dxVv+UbBfYQlRrd zW9C}?O)SRWO1IaF1Esy@r|RbG!{!lRG^yQ-2GjM|mzUW39aJ_(mITE}t;Sl_-f5)K zKHXIHZev8Nzk6riKB+8KG+EzU+`M7i|9yY=tyMXz)+JTo#v9&XK-b7O<03}CkFRn= zQoHAg+5OT;ttq~Zm1`NvY6Cw!AVnidCiYLGGk-?01ApYBn`Ovm3p&tYr!dvnJr}!{9A)gXm>{_Zdt$+vu{+W zR?FHyT5U}|tPWAi^Gm9A7DMi2HLmCJ0DoOoPxRuZ2iX(YOixy!I zX6u(+==n*InvmCRp}whW4OY0?U`5j#yahkh8P!9sGpea#V^uU~=ddtgR`bP84YFAa zY(=D8@0;Z|biA3`D~A4bb#JO}*{Y|=qE!!T7neOXvMe)2=FxGQ8Hc@3aPn4m?iRGZ zpo7uraSU_#mt4;?Oy{^~yWn)L4WJiABes?M1Eundxns5VxiPpOpF%y~g#ot$TWWQ= zvSUfIXWnQ?w%J{kl&#kAw1yA4WEt2uR6oNgNXV@&x-5q!pZ0|XHdV@|zi@FUD0jFk ztgfxvE31uGyKNCbdZ)e8U2Swb-S$R?=pF)!;2ot#KdpsUqq*o98od*HlVre`58wS@qb*Hv8C;-e$QKJ zlo5w{r?uy*q8y_r2aAGa(peNkHgF_vj@EofZ@!r9l-w*n*Dp@KU!1x6#WDKDY33^H z@ETj$-g5H2<=mjR9HY0Kd~Z2rz2!8EdP^&r*E`o+PJR|SbIl^hm_<(0=q*PMZ9#82 z`MKrXU~W0a+;Ysh<;$yrlH3kqfd{sH7h|NWxQMxtd5q% zSJfTY0Uc}0qno-|9wGFr*qY2{j0OxV%>&Jo9%D#^jRuh-=&1t(-A zeJ{+)EBvg^)qP#e06cc(DPyt?S;ONf{4K3SXMVgmh$=z)PxrE>T}xu$Cnu{}*CJd^ zf+NguY?Wagef7id-y@O0Dw1P~yUYE2)*lgOF$%f)k(mv7oK`hGcw0>|6a`ku+u7Z$ z5VPXK^Zx${@KPT0`ooO4-SW8o8Ts~i4S^ThLVL#*W?ysc`LT=qoznF!)_$itKoomZ9qF&Gw zR*sr?!A;=>HTWuin$&n;o*F+qq#KXL8qbYZ|13M~EIcz0!`yZylMseiB!s@N7gid| z+4BbzdL_XsWs8!eRDRgaV3{C%V`l%bvm1|IP~0EGm4o#*+h(Yjy2?;u88lz zz#!hFs2QWeIs~&&rx=?O?@rcR*%-{Ypo+Jwg42M{{VgVNhUCl?W;V1ZBdpN7ps&%D z50fm^=O@rAB4BP9C?=-*El~aHVgRnL<{~cz3172fB1?9TZ>#0Et*v#ycMQ{D z(HjMb$#DD+cjl%p9w=K2fTuYR(4qSrUdx{H40E|IE3nP~WiBuxs@&O_Xljo8nbSd* zp8r4C?U-mrE{lvPbwD=1!`~n6-|KlHJ1)q{AKdU_ma`D$_(cSqf-oq#2Ur4Y$s$a` zX4^-|q$^>X3P+#g>+qVsC+60n^NC(n<=G)p*tveOB*R73PzMC7tvmz@iqOK8>{Ne( zmMP5+<7rND!q#}oMXlq+SuOlU8*I?&g_f&s=F&8~s0n(d9|B7fmKMdn%a>GUs4mXk>_Q=0)Eo?m5+j_OT{qD(=-90D-lJrMD8stIiYuu%k#UL_x z6y(`?^YYE!Czk2c_Va`9VdL@c+knZ`R2KI5cM{EMHVX_n`X zZd2EcqWVw+zd(r_x0zXTH{d`MG$nx(CWKt%4@MI!Yl0Lwqwr|g-)ec*MP51z1Vnkr zc{Zl#eXH46U0!asx}9c6MqF@I?Z%W{k2QW+atAD3ohMtYF#RS9wTz!r3+~C9r&CWb z=6Vj>$WU+}mbnm+PiB%oruqXk)wEZbAzum`p5i*?$P>>A0d2u=Qc9b3f-TrJ)`Kii z%jd~l9_H~>4v*4%M(UnS-NV#9mAXf%dq(QMOx?%SeU-XTsrw?eV3mAeAGv22Y7Z3O z)>HHfQuK@z{el$zw%(~HQNUISgKow24~ekuh>i#MwcvX!Ctijazh^p?ld*jso0}|1 zw>OJ!Z+^P?hsEG@cX_Lfm7#+2%ZU?RaB1nm3S^72h=t7aojh}$FJPJbDpiSV`ftlA zTNCqBdXxqD-mFfoMklNI02Ek-vmQ#7+5<&rT$bk4w>9nSXSnkl!Y2svjw5`KApg!@ zdUs69V-lD(f)h;^ab%pM32_t{(U8s;NZD`vlA{Tc=qdSh@4K~&fpVdcy0ws;TV zO%}>mh|IeP4Ok{1eKSX^Fb5v6S|X|1sMSRFo~jHx52#M;YrbXzhgtNztlX-oTP|m- zEN8Zsi&B}<5cv~&wCv%!=)$_9g+*%$WJ_%1mBq>ola+s?KLXYC(w$Q!nV~o4Fo-M| z?eZO1Eb3Asnu5?XS?JQf$Y<)2dGQxGDplod2AmCHqM*Btm2a#Qe^G%p{|71)jpGQr z`bs^c%uYNh+P7st%svUUn0DpdmmB&FfvguEk8rbva$)JW8&1dRuC30Zrp$D!Zmnj`yZJejd8U0SkI|pk?wa!$c$X5cHYu-qk(NIz zn*S*oXp6?d_o-+;gF0moQX&IhL+IPF{MNJNgTACH?|Z7J z$k&6q|108fE8+|V=RepFm9tP1VCL60WK9I1`mFA1%_-s(q7i-r53|>4kP4e^VV_-KbI1CZR)Z>j=FFMxS-F}FW$%x22s+F z#=o-Ly2Ph~3S{S5gxqL!m6F9r`?jrN^fyeu}aVa^59Uplnxuzu@UbO0rqQ?>2SAlI+|} zI@CdA-xskzbLp5lo_|giM`jr{<(ND@;yHnzK%Sd@w@6u!H}1;r!&)lh!UL*qY4~%s z+HBF<^5c~!$Q-WAmo}?wX+{>EdtH=!*b9A4{GIK8pUw!p*+-R4I0DBK9^bt`Fzf*YJPgRBcBR$LA1SCUFBmwJefjnuCr zH?zE0rQ%CW6^*@qkWTevVo?-0-W1}hoJHG4p*AE9>z=$t>Kc)(3yM$~V>Y%htcJb@ zZ!&?svfgGee+cmEHtiJt#nhGYMvPsl=T@B&AK3{axM}EiHrJv-Bu5#V+ESrL!3CP5 zs}=7oVFmE-^{WtsMODC^IadWAbu{2#=tgis@Z6x`U-cRwRK#%$bt`xY|)&?ZCCk=eh9PIuzq05+?HlDnDz4K}7@neWe;{M*# zZ3x@ngP@mhpKU?lAW2!^o7ZHc@NWN;9u0Z6P%$l^O9VgOKVZRV#{3^6=A@|1t}$EI zIYWf>L*|Q_O8m_>j0IhC4Y6J(H_7(0VFf0Q7xW~a?}!=V#cNwZ-q?unHf}Eb?3;PT z@WN?r?-fjT9Q$x6#+VXU`Y4y2z5dOmBs@-48+kqNq1o!b=qQvq46Cr!zz zqvaWqP%aBQN&h>-I`Ar%>QKoPnG%YyZ*^6wmo$|s2XZQzHhs`xzSlqD4_JLTib8+1 zUOA-t9ziD_66XIAbmO6{!qMGA6$^E8>V5I2zvKcHGDSG0PomKvAJrcPv!_8-#I@^UI#re&6CD8yeIm4T3KzpdJvwfq%^T_zFwRr-peX^hcLnrS52 z+%%~2vsII1v&uaLiWJ$0$u+|~!Ir%;lhTI*L|w-ubW>XkwTt0kzrcmo2bTFbiUS{| zXt?x_%pL7+Ym!^juk~n|kAoWKcb+S7?rEpsJH*`gn@oD9AgKoyD^;RL$xIpS1r!k$ zmoWwm7fmR1%SFq9Y7 zqN1{icuB2-lAzIWEq6p8;&;>#p^A}0JZ$p(C1|PZpzxqxsnsZ$DS5C^)TT1}FFwu{ z($WfPi9%YpQOGDdA2YU;o}eJgG3E@+LVn%mO+umZib1=f@!xwe6oZ^JNr$S$sFH9H6(e z>fN?qxb2??=#}Uv?ff@HrMjlf^=k1I2YNtGte5a_k}lbDsb74>-Qv`j)AAMXYhxy| z9=(qUbdD@3=J;`U;Rn2nXetDkL2YgT9wt7<5sh z_P?i!?{G!Lpuw8mz?3hAqm>#;jJ$}h`K)%0>;RUVBsaNQV4Pk zwLlWtVZPcdlpV5;u7y&I+_8!S~Wt&$xg35My zR?-GFYpiwcMoW{7y(W99_k1(D<0cCCYn<2BLewec&U`NL&TV|qt|5MjO-8}6>X6#d zBIUDojebykBjza@vBeXy@M95vY=-wlc+ax3CB8ZHNV>Lpth`c-*IsB@bYZWBUb z3nIz7P)}!({0FA7w4ao=v{a+ed-n>uz^J2j8#4LXK5+8hZjAFzo<%h7&-~HYj}sM| zFr4^-3W+_KNvF4HeTn-kBg$|O`O%`CJsFPx!Z%LH&ZsPaea&gMI*kr&(WueLZi@U+ zw1iFfk@Umeh}ckU*0@txe(LgID90FHP0&XLGbcJwJ?S7^KY-XRP0PcnYBw}k>IE6= zZU#i(D4^)^W8>0%8IOOKtdTb%C)qR7H8XO(=55>!f9TXxX8_yZjLm;*Fkte?HphDWn9}8|S-f3^(nKy2Im-dVuTGXfr>A6Et zD_8F3R7+MJNY3k32vOUrTsQ)cg{8y$Mbi*OPGt&`)AD3fty29-JP7dpsfR)V6^?jO z7gt_BE*y)==w<-UUN~IxMilE;^j87VqEw2ktnKv5+D_-F?NqDnbe`H~i5Ay(nyu|A zIRhZO*&6Ga1=i;TCBRB&AybPvTk6!}3L17D06C)9PtlXys3HpHlf#z5Hpm{As@YX}Al3R}RJTwZ2ibfP$1-0z=E!Y_X14LjD+9OGPSVi|#V3=m_0#$Fh~{Pzs*N7|eC zIt#+=O_(~jVdPL|z`!{iuA=8^e2X2yqBP(qH>9FG`@LD?x!F&X2oDorj#^m4mEifW zVq&w1=7>X92a+HJrKmAwBbr8tO2G1N#%?BLJwl~MH&}>xz*5Am9iS0rQc9Q!voU+% z#tS^xQY5V+ps&fkfxVUnsL8MWjxEYM%h({8X>0%lOiPC#Yv~YMq5x*-5EzCI@imMU z%6R5E>=!KCcbgl2p#g)RHDK@!1BQPO+kDN}C6m(~MrZlJsdt_a90zItL@6?{z*nEh z+_V&hq@B-j@Zk;RS#Gpe+sSffq|uHSr!XzNu*UBrX~p!btKch1GLjHe4}Yg5um|1>O8Il*Fd-v!!FxGqm=%bOOvJs^~pNVLfuyT;x9FuYxcO~YeQ-Ryx zGjlU6!bKf^#YAI~tZudgQQBtCNiiB!9;_RD2wH76U|P_6VGOK30nDltY9|yxY-{71 zt&+7wW%GWuX-QuBhWn$8C2gfyj*YRA_-Z6g7}x!bg>a{NY4daI`nlW7kQ+L=lvRW{ zT?z*2b2!GZY)Z33oFPP8&17GN{4}hk6eyO_SX^UN)^c?q9zQE$;r!%V!8+aXlAMjMSJGq7Q^Kba52;3NlPaAJTMB$%WK#DIrF@*If4Ndbt##2qX;83xanX+mi@2Pn3|iqa%ytfoc`8sAPz@@v)i!}!7@2!B{V2{O?=fcVpUvZHylF5V zkA6+@47(bhduIiq_(TjHT6D-McT_WA*zrA^E{LeJz|EY=b2WQ;*1>7GgDFE1GYP^s zLfr=+FR+q`Gf7nW@uekUdJZzA*Z>ov_k-h*zj|CjQGH*~`T`NFTl``@KP(P9rqIao zdff6w7j_Y7QR&4NBQy6}E@@b5taRaYlWi;|p^{{E4Q|6_Porx$x|%-y9<7_oW24YJ zrTY8^12Z^8gqL60PY>0vVC%tiFCUD^An0hZ92)B;y5IxmszhM>;%>yPVKwU`gkHnC zGXB}(&gO}V%+EF({&SHvf>{)2_Z^vqd(Yt;Aqz%PoowkGZeejFqKvA5TQ$JNW|yl% zu?c2ARyF5x_GQ}iw6ahRyaP&!$P}}!gXF%k56hwQQdIYD!!V_8S>)TqA7Q17k#7SN z`PM+h6{0UsTvlKq!Bu0!mmvywEIqP4p$^EHoH+<(n$heN z0JV9TS^IW?dF?8zoI>ag{$3>BTZ7LHZU~A1{9f#@@R7?p43%2SY7f_G zS4qf4^)`C3?|r$%x?O?kn-#SBMS|9=B%8Miw9BEiRn)+}&*dlDi<65l3ms+}`8Lvl!!x3m?TfQ#ZR<)?#*NI-!V5AQMfSjb3oS-~)lP9bUpTzds} zZ5|iGlu8;^{ce-tRR7s$vwj|r1Min)wHquA=~F^2NsNZv`g%t!CD5a-q1L^FY|yVZNFzIACVj#XW#0Jl>Mt$Nks z-xK)00ae(@ZPs-dd`@J+f^UjE-!MPkHXpRyUCy)$SN2Y;;+mJ0Qfh;mC1%PNy1I+< z?lld}f7rDA?|Kljdpgc%78Ipd0P%S!baSA}I7V+c zAET#1Gtu3d$IrYkK519~n#^NXZ-N7K_~afeV_U$%IGPZ(wj%Tev$=DW; zJ5POBIi^6a^f{73WF$V3Wlm(7Bdp9wMvU^6v9A!WX3dEGA~WI= zb=ukf(yn8I?4x?uTyoqARu>Bw-H~EhvPV$+trlRs=#>EDWyiohuep&F%7K%t95}gB z4jcm~mD3bcy|6XI-`utvzzoO%68)#?ylRb|5x1Swh#kk#XZ9F#g-UE;%vO1nQB=m@ zM&#grDe^%{KByEvzEY|5xi%3MKxYmFCR}Mr1>Q@!CR87Ffi$R^+t=#-<&<#CowDJm zd4tarxRwqyMckU0g=mJx1cMH2UOF^&DmgZSlO^~Z{Z5QRrstDh}aooScpD@#J zJf+JnZd22o-1_3JbrObC`wz0*?$E2jBnK%Dl;xTY!s;kLP5F~CIR zb;?}l87XIY&dVk=edh69_pIDkUWsB7RXH{8WCoNY${aN)M{LN3UgB6hByf&)7N#>~ z7I#zCsaXJJ&1r$?U(Ob36Hlv%%GoN(xvk~g)^f7pJ;lAPMl%IgHO&EqdrHBE`se9| zN?w=AS-K6idGv*UaUE35gf>t~nEP@3)j(LWJ|yKoiMCzQA`>W8i|iX}q$G33$Eu4O z+tQ&09Gr{tSw_iAu7cMSVRbiCOGcSs%XlTqkf!cLmN8Iu3Qw@TWa$x z8_ZtCmgIQcC~OZ5E{8%BSZ6 zykN_?z?FE8WHsX#w=Lwq;r^7Wdfs=$t!~?l#7d!~$R^j0*RO|Lv+svn*$d*;{!m1f z?w5I9RSlc_;?t&FPdt1^%gCa+1jI+h-!5^O-RuwbojD z*;!p~LU|nojly%0(_1D*kwsJ@fl@mw-L;mrk!cl_)mmF!YXXJUwQg&zQ$nJ-((O8( z)s7&6jGJKT`rKj1Om6NMGyDA2FO(%$wR>{9jTXDt7j-jQzI0dCF=K~?5zPb4=rN6?0({Ow#nB23eSZj&AAZNE(?ajWaMvkt%x z%lKJL=LhWvSBJfi7Mrf$tu$cMl#shQEyvc1vr~2Ugr~FO?*$ zDVE>%U6su$QmNHlI|Z|g)1o);H|ZhAG=wd|9y^eoVN4bgTp_BJn83KMIooB0%29r~ zr}m6?3Fn}p1$Q%+&DbdXHH~e5lK$-3%^W8GsM;$PoAmuqx-_Mx@dH95h9N4)aZGMc zsFHZBii+DBElVrm6qxVwq`qf%{+9RF_F zM$2yh&>QKhTUi|{ip=X!HP&pnN23N7wze!Y#^tf!kQMW4F<4*^%35+o9WP z>Ko+Q@ra>tW{z~S+OkLX(C*K2!NLJg2KI@4YLD$R`0BeOh!NmHX#lcI>LZ zKm2o?7N|sc$>BW_hTs`=yp;*WbqhkHzR&r^uCL6FVPc9j?bki zAu{0sAqL+0)2YC2q;5tr^NQA>J_8LkRe~R51O@a1I}0khV?XH((4jpaiyT3zW4Pzqo8?2rI6nr|dAan$3qULRfuv-Cw*&Jiq}&2+O2 z*dsLb3Q6w*^BTmm@eCza1>}Hq;%GFI;$NCrmHVXfDc{KI|maFUk)EvLPFu-`VnYkuwt>;mR>=U6g%A>??#Fa~VD9(4(E*&-C zszPkH0XLZKbIz9QID>ryXK-jZ4uj+jU9g`=7wi|H3-%j+==DbadwL$+BF>qy@T0~k zVjiO7q~SVIMj!&u|ZwP_BVrLj_b?o zS{cP^n2D!^39f)gl3RJXUWG#cGAXq)N)0eG%GDVl@(P^@KCx!@g2M&bw6m9MV8|r8 zGm%!dBUU&uIv8dXqa@s`h*RX>x6$sXs4OJgLN5 z?<-H4bmpHe%u?d2v!E9vVB{|;)6bgUmy6f?^5JN9)wc?c1&Kz!?2 z%rj%}IGDC!jX;~L~#6vYzrx7cPddBT}EX)h{GLS)6{Z|<=C^a9l& zPty`)45{yMdjj)0?XnAYHnCBtwfA1mG()WXItmxZzV`)ZNrI2X9>b6TuAqOXt)-Uf zapE&3N1$LFAo&j!3gL>V@ zTd`+B1)~`5!`{Y-+uS`GY*-^8IIdZZVNcx^=ut_gdI+gbUGWR9&{{Q4@v=iNKi`JE z^)g8{zDz+z3pJi$IWT~Y6M>d-aw+CG#Etwjf3z+O5Y=9J%c+~LZ zL)^sm8pnS6*28|lyQ$ZBwe|7S!S2U{cYC{^_MiW`YZ<}@Z<0n29t5TSL&yrUP<~H1 zM{Y_KgvBn9x*wBE-O~33QPY55rR|@72t+x|Be=F#XvBZ`WDvF|!a%=L7sAdNz~EXA zyRvxGtk=m=3?#tXx8&k$T+vxHE`~BgFUZ;%9&O6EnXPvRZ>sCn`5wrwH>Cd^451KK zLQzWE9rsmoR0GbwMF`|7hz$q9FsDzG)v2y5oSy7shSyiwf5u)h}v@v z7_wW|HEbv^*MULBRc*9|O^~kH$?`8%WVUO}g<^3lU*p{Hd%m5fSoBItgRbAytah=8%sAiF87L3H+w?|zGiatGU7xJrw=rj Uw>hJNeBZ|Z1GUx*_cU7r06;e)6951J literal 0 HcmV?d00001 diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..b884351 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,110 @@ + +var gulp = require('gulp'), + rjs = require('gulp-requirejs'), + concat = require('gulp-concat'), + uglify = require('gulp-uglify'), + gzip = require('gulp-gzip'), + rimraf = require('gulp-rimraf'), + gutil = require('gulp-util'), + argv = require('yargs').argv; + + +gulp.task('default', function () { + return gulp.src('app/tmp', {read: false}) + .pipe(clean()); +}); + + + +gulp.task('build', ['buildCombine']); + + +gulp.task('test', function() { + // TODO: broken test with window.clearTimeout + var qunit = require('node-qunit-phantomjs'); + qunit('./test/index.html'); +}); + + + +gulp.task('jshint', function() { + + var jshint = require('gulp-jshint'); + + return gulp.src(['./seriously.js', './effects/**.js']) + .pipe(jshint()) + .pipe(jshint.reporter('default')) + +}); + + +gulp.task('clean', function() { + gulp.src(['./build/**.js','./build/**.js.gz'], { read: false }) + .pipe(rimraf()); +}); + + +gulp.task('buildCombine', function() { + + var effects = getListOfEffects(); + var files = (effects.include.length ? effects.include : ['./effects/*.js']) + .concat(effects.exclude); + + var isCustom = effects.include.length || effects.exclude.length; + + gulp.src(['./seriously.js'].concat(files)) + + // concat all files and minify + .pipe(concat('seriously.min' + (isCustom ? '.custom' : '') + '.js')) + .pipe(uglify()) + .pipe(gulp.dest('./build/')) + + // gzip + .pipe(gzip()) + .pipe(gulp.dest('./build/')); + + }); + + + + +function getListOfEffects() { + + var fs = require('fs'); + + var onFileChecked = function(err, stat) { + + if(err == null) { + gutil.log(gutil.colors.green(this)); + } + else { + gutil.log('Missing:', gutil.colors.red(this)); + } + } + + var effects, + include = [], + exclude = []; + + if(argv.inc) { + include = argv.inc.split(' ').map(function(itm) { + var filepath = './effects/seriously.' + itm + '.js'; + fs.stat(filepath, onFileChecked.bind(filepath)); + return filepath; + }); + } + + if(argv.exc) { + exclude = argv.exc.split(' ').map(function(itm) { + var filepath = './effects/seriously.' + itm + '.js'; + return filepath; + }); + } + + + return { + include : include, + exclude : exclude + }; + +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..25e8ce2 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "Seriously.js", + "version": "0.1.0", + "main" : "serously.js", + "author": "Brian Chirls ", + "description": "Seriously.js is a real-time, node-based video compositor for the web. Inspired by professional software such as After Effects and Nuke, Seriously.js renders high-quality video effects, but allows them to be dynamic and interactive.", + "engines" :{ + "node" : "^0.12.2", + "npm" : "^2.6.0" + }, + + "devDependencies": { + "gulp" : "3.9.0", + "gulp-util" : "^3.0.6", + "gulp-rimraf" : "^0.1.1", + "gulp-requirejs" : "0.1.3", + "gulp-concat" : "^2.6.0", + "gulp-uglify" : "^1.4.0", + "gulp-gzip" : "^1.2.0", + "event-stream" : "^3.3.1", + "gulp-if" : "1.2.5", + "yargs" : "^3.4.0", + "gulp-jshint" : "^1.11.2", + "node-qunit-phantomjs" : "x" + }, + + "dependencies": { + + }, + + "repository": { + "type": "git", + "url": "https://github.com/brianchirls/Seriously.js" + }, + + "bugs": { + "url": "https://github.com/brianchirls/Seriously.js/issues" + }, + + "scripts": { + + } +} + +