(function(window){function Matrix(t){var e=this;e._t=e.transform,e.a=e.d=1,e.b=e.c=e.e=e.f=0,e.context=t,e.cos=e.sin=0,t&&t.setTransform(1,0,0,1,0,0)}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.verticalAlign="top",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="hidden",styleUnselectableDiv(t)}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var a,i="";for(a=t;a>0;--a)i+=e[Math.round(Math.random()*(e.length-1))];return i}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function rgbToHex(t,e,a){return"#"+componentToHex(t)+componentToHex(e)+componentToHex(a)}function fillToRgba(t,e){if(!cachedColors[t]){var a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(a[1],16)+","+parseInt(a[2],16)+","+parseInt(a[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function createElement(t,e,a){if(!e){var i=Object.create(t.prototype,a),r={};return i&&"[object Function]"===r.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,i){var r={writable:!1,configurable:!1,enumerable:!1,value:a};if(i)for(var n in i)r[n]=i[n];var s={};t&&"[object Function]"===s.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,r)}function defineAccessor(t,e,a){var i,r={enumerable:!1,configurable:!1,get:function(){return i},set:function(t){i=t}};if(a)for(var n in a)r[n]=a[n];var s={};t&&"[object Function]"===s.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,r)}function SVGRenderer(t){this.animationItem=t,this.layers=null}function CanvasRenderer(t){this.animationItem=t}function EffectsManager(){}function StrokeEffectManager(){}function MaskElement(){}function ICompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function IImageElement(t,e){this.animationItem=e,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e)}function IShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function ShapeItemElement(t){this.data=t,this.shapeG=document.createElementNS(svgNS,"g"),this.pathLength=0,this.cachedData=[],"pathShape"===this.data.type?this.shape=document.createElementNS(svgNS,"path"):"rectShape"===this.data.type?this.shape=document.createElementNS(svgNS,"rect"):"ellipseShape"===this.data.type?(this.shape=document.createElementNS(svgNS,"ellipse"),this.data.trim&&this.adjustTrim()):this.shape=document.createElementNS(svgNS,"path"),this.data.trim?this.shape.setAttribute("stroke-linecap","butt"):(this.shape.setAttribute("stroke-linejoin","round"),this.shape.setAttribute("stroke-linecap","round")),this.data.renderedData||(this.data.renderedData={}),this.shape.setAttribute("name",this.data.name),styleUnselectableDiv(this.shapeG),styleUnselectableDiv(this.shape),this.shapeG.appendChild(this.shape)}function ISolidElement(t,e){this.parent.constructor.call(this,t,e)}function ITextElement(t,e){this.parent.constructor.call(this,t,e)}function CVBaseElement(t,e){this.renderer=e,this.data=t,this.currentAnimData=null,this.init()}function CVCompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function CVImageElement(t,e){this.renderer=e,this.animationItem=e.animationItem,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e),this.animationItem.pendingElements+=1}function CVShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function CVShapeItemElement(t,e){this.data=t,this.renderer=e,this.frameNum=-1,this.renderedPaths={},this.trims=[],this.trimPos=0}function CVSolidElement(t,e){this.parent.constructor.call(this,t,e)}function CVTextElement(t,e){this.parent.constructor.call(this,t,e)}function CVMaskElement(){}function PlayerManager(){}function BasicPlayer(){}var svgNS="http://www.w3.org/2000/svg";Matrix.prototype={concat:function(t){return this.clone()._t(t.a,t.b,t.c,t.d,t.e,t.f)},flipX:function(){return this._t(-1,0,0,1,0,0)},flipY:function(){return this._t(1,0,0,-1,0,0)},reflectVector:function(t,e){var a=this.applyToPoint(0,1),i=2*(a.x*t+a.y*e);return t-=i*a.x,e-=i*a.y,{x:t,y:e}},reset:function(){return this.setTransform(1,0,0,1,0,0)},rotate:function(t){return 0==t?this:(this.cos=Math.cos(t),this.sin=Math.sin(t),this._t(this.cos,this.sin,-this.sin,this.cos,0,0))},rotateFromVector:function(t,e){return this.rotate(Math.atan2(e,t))},rotateDeg:function(t){return this.rotate(t*Math.PI/180)},scaleU:function(t){return this._t(t,0,0,t,0,0)},scale:function(t,e){return 1==t&&1==e?this:this._t(t,0,0,e,0,0)},scaleX:function(t){return this._t(t,0,0,1,0,0)},scaleY:function(t){return this._t(1,0,0,t,0,0)},shear:function(t,e){return this._t(1,e,t,1,0,0)},shearX:function(t){return this._t(1,0,t,1,0,0)},shearY:function(t){return this._t(1,t,0,1,0,0)},skew:function(t,e){return this.shear(Math.tan(t),Math.tan(e))},skewX:function(t){return this.shearX(Math.tan(t))},skewY:function(t){return this.shearY(Math.tan(t))},setTransform:function(t,e,a,i,r,n){return this.a=t,this.b=e,this.c=a,this.d=i,this.e=r,this.f=n,this._x()},translate:function(t,e){return this._t(1,0,0,1,t,e)},translateX:function(t){return this._t(1,0,0,1,t,0)},translateY:function(t){return this._t(1,0,0,1,0,t)},transform:function(t,e,a,i,r,n){var s=this.a,o=this.b,h=this.c,l=this.d,m=this.e,p=this.f;return this.a=s*t+h*e,this.b=o*t+l*e,this.c=s*a+h*i,this.d=o*a+l*i,this.e=s*r+h*n+m,this.f=o*r+l*n+p,this._x()},divide:function(t){if(!t.isInvertible())throw"Input matrix is not invertible";var e=t.inverse();return this._t(e.a,e.b,e.c,e.d,e.e,e.f)},divideScalar:function(t){var e=this;return e.a/=t,e.b/=t,e.c/=t,e.d/=t,e.e/=t,e.f/=t,e._x()},inverse:function(){if(this.isIdentity())return new Matrix;if(this.isInvertible()){var t=this,e=t.a,a=t.b,i=t.c,r=t.d,n=t.e,s=t.f,o=new Matrix,h=e*r-a*i;return o.a=r/h,o.b=-a/h,o.c=-i/h,o.d=e/h,o.e=(i*s-r*n)/h,o.f=-(e*s-a*n)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var i=this,r=a?new Matrix(a):new Matrix;return r.a=i.a+(t.a-i.a)*e,r.b=i.b+(t.b-i.b)*e,r.c=i.c+(t.c-i.c)*e,r.d=i.d+(t.d-i.d)*e,r.e=i.e+(t.e-i.e)*e,r.f=i.f+(t.f-i.f)*e,r._x()},interpolateAnim:function(t,e,a){var i=this,r=a?new Matrix(a):new Matrix,n=i.decompose(),s=t.decompose(),o=n.rotation+(s.rotation-n.rotation)*e,h=n.translate.x+(s.translate.x-n.translate.x)*e,l=n.translate.y+(s.translate.y-n.translate.y)*e,m=n.scale.x+(s.scale.x-n.scale.x)*e,p=n.scale.y+(s.scale.y-n.scale.y)*e;return r.translate(h,l),r.rotate(o),r.scale(m,p),r._x()},decompose:function(t){var e=this,a=e.a,i=e.b,r=e.c,n=e.d,s=Math.acos,o=Math.atan,h=Math.sqrt,l=Math.PI,m={x:e.e,y:e.f},p=0,c={x:1,y:1},d={x:0,y:0},u=a*n-i*r;if(t)a?(d={x:o(r/a),y:o(i/a)},c={x:a,y:u/a}):i?(p=.5*l,c={x:i,y:u/i},d.x=o(n/i)):(c={x:r,y:n},d.x=.25*l);else if(a||i){var f=h(a*a+i*i);p=i>0?s(a/f):-s(a/f),c={x:f,y:u/f},d.x=o((a*r+i*n)/(f*f))}else if(r||n){var y=h(r*r+n*n);p=.5*l-(n>0?s(-r/y):-s(r/y)),c={x:u/y,y:y},d.y=o((a*r+i*n)/(y*y))}else c={x:0,y:0};return{scale:c,translate:m,rotation:p,skew:d}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){var a=this;return{x:t*a.a+e*a.c+a.e,y:t*a.b+e*a.d+a.f}},applyToArray:function(t){var e,a,i=0,r=[];if("number"==typeof t[0])for(a=t.length;a>i;)e=this.applyToPoint(t[i++],t[i++]),r.push(e.x,e.y);else for(;e=t[i];i++)r.push(this.applyToPoint(e.x,e.y));return r},applyToTypedArray:function(t,e){for(var a,i=0,r=t.length,n=e?new Float64Array(r):new Float32Array(r);r>i;)a=this.applyToPoint(t[i],t[i+1]),n[i++]=a.x,n[i++]=a.y;return n},applyToContext:function(t){var e=this;return t.setTransform(e.a,e.b,e.c,e.d,e.e,e.f),e},isIdentity:function(){var t=this;return t._q(t.a,1)&&t._q(t.b,0)&&t._q(t.c,0)&&t._q(t.d,1)&&t._q(t.e,0)&&t._q(t.f,0)},isInvertible:function(){return!this._q(this.determinant(),0)},isValid:function(){return!this._q(this.a*this.d,0)},clone:function(t){var e=this,a=new Matrix;return a.a=e.a,a.b=e.b,a.c=e.c,a.d=e.d,a.e=e.e,a.f=e.f,t||(a.context=e.context),a},isEqual:function(t){var e=this,a=e._q;return a(e.a,t.a)&&a(e.b,t.b)&&a(e.c,t.c)&&a(e.d,t.d)&&a(e.e,t.e)&&a(e.f,t.f)},toArray:function(){return[this.a,this.b,this.c,this.d,this.e,this.f]},toCSS:function(){return"matrix("+this.a+","+this.b+","+this.c+","+this.d+","+this.e+","+this.f+")"},toJSON:function(){var t=this;return'{"a":'+t.a+',"b":'+t.b+',"c":'+t.c+',"d":'+t.d+',"e":'+t.e+',"f":'+t.f+"}"},toString:function(){return""+this.toArray()},_q:function(t,e){return Math.abs(t-e)<1e-14},_x:function(){return this.context&&this.context.setTransform(this.a,this.b,this.c,this.d,this.e,this.f),this}};var MatrixManager=function(){var t=new Matrix,e=function(t,e,a,i,r,n,s,o,h){var l,m,p,c,d,u,f;return l=$M([[1,0,0,0],[0,Math.cos(t),Math.sin(-t),0],[0,Math.sin(t),Math.cos(t),0],[0,0,0,1]]),m=$M([[Math.cos(e),0,Math.sin(e),0],[0,1,0,0],[Math.sin(-e),0,Math.cos(e),0],[0,0,0,1]]),p=$M([[Math.cos(a),Math.sin(-a),0,0],[Math.sin(a),Math.cos(a),0,0],[0,0,1,0],[0,0,0,1]]),d=$M([[i,0,0,0],[0,r,0,0],[0,0,n,0],[0,0,0,1]]),u=l.x(m).x(p).x(d),u=u.transpose(),f=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[s,o,h,1]]),u=u.x(f),c="matrix3d(",c+=u.e(1,1).toFixed(5)+","+u.e(1,2).toFixed(5)+","+u.e(1,3).toFixed(5)+","+u.e(1,4).toFixed(5)+",",c+=u.e(2,1).toFixed(5)+","+u.e(2,2).toFixed(5)+","+u.e(2,3).toFixed(5)+","+u.e(2,4).toFixed(5)+",",c+=u.e(3,1).toFixed(5)+","+u.e(3,2).toFixed(5)+","+u.e(3,3).toFixed(5)+","+u.e(3,4).toFixed(5)+",",c+=u.e(4,1).toFixed(5)+","+u.e(4,2).toFixed(5)+","+u.e(4,3).toFixed(5)+","+u.e(4,4).toFixed(5),c+=")"},a=function(e,a,i,r,n){return t.reset().translate(r,n).rotate(e).scale(a,i).toCSS()},i=function(e,a,i,r,n){return t.reset().translate(r,n).rotate(e).scale(a,i).toArray()},r=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},n=function(t,i){return i?e(-t.tr.r[0],t.tr.r[1],t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.s[2],t.tr.p[0],t.tr.p[1],t.tr.p[2]):a(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])},s=function(t,i){return i?e(-t.r[0],t.r[1],t.r[2],t.s[0],t.s[1],t.s[2],t.p[0],t.p[1],t.p[2]):a(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])},o=function(t,e){return e?null:i(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:r,getMatrix:n,getMatrix2:s,getMatrixArray:o}};!function(){for(var t=0,e=["ms","moz","webkit","o"],a=0;a<e.length&&!window.requestAnimationFrame;++a)window.requestAnimationFrame=window[e[a]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[a]+"CancelAnimationFrame"]||window[e[a]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e){var a=(new Date).getTime(),i=Math.max(0,16-(a-t)),r=window.setTimeout(function(){e(a+i)},i);return t=a+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,supportsPath2D="function"==typeof Path2D,cachedColors={},body;!function(){function t(){this.commandArrays=[]}void 0==CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,i,r,n,s,o){this.save(),this.translate(t,e),this.rotate(r),this.scale(a,i),this.arc(0,0,1,n,s,o),this.restore()}),supportsPath2D||(t.prototype.moveTo=function(t,e){this.commandArrays.push({type:"move",coord:[t,e]})},t.prototype.lineTo=function(t,e){this.commandArrays.push({type:"line",coord:[t,e]})},t.prototype.bezierCurveTo=function(t,e,a,i,r,n){this.commandArrays.push({type:"bezierCurve",coord:[t,e,a,i,r,n]})},t.prototype.drawToContext=function(t){var e,a,i=this.commandArrays.length;for(t.beginPath(),a=0;i>a;a+=1)switch(e=this.commandArrays[a],e.type){case"move":t.moveTo(e.coord[0],e.coord[1]);break;case"line":t.lineTo(e.coord[0],e.coord[1]);break;case"bezierCurve":t.bezierCurveTo(e.coord[0],e.coord[1],e.coord[2],e.coord[3],e.coord[4],e.coord[5])}},Path2D=t)}();var dataManager=function(){function t(t,e,a){var i,n=r(t,e,a),s=[];for(i=0;e>i;i+=1)s.push(Math.floor(n[i]*V));return s}function e(a){var r,n;a.forEach(function(a){r=a.outPoint-a.startTime,n=a.startTime,a.layerName=i(a.layerName),a.parent&&(a.parent=i(a.parent)),a.renderedFrame={},animArray=[],lastFrame=-1,a.tm&&(a.tm=t(a.tm,r,n)),"PreCompLayer"==a.type&&e(a.layers)})}function a(t,a){V=a,e(t)}function i(t){return t=t.replace(/ /g,"_"),t=t.replace(/-/g,"_"),t=t.replace(/\./g,"_"),t=t.replace(/\//g,"_")}function r(t,e,a){var i,r,n=[];if(!(t instanceof Array)||null==t[0].t)return n.push(t),n;var s,o;n=[];var h,l,m,p=[];r=t.length;var c,d=1e3,u=[],f=[];t.forEach(function(t){if(t.t-=a,t.to){var e,i,r,n,s,o,h,l,m,p,c=0,y=null,g={points:[],length:0};for(e=0;d>e;e+=1)p=[],l=e/(d-1),m=0,u=[],f=[],t.to.forEach(function(e,a){null==u[a]&&(u[a]=t.s[a]+t.to[a],f[a]=t.e[a]+t.ti[a]),i=t.s[a]+(u[a]-t.s[a])*l,r=u[a]+(f[a]-u[a])*l,n=f[a]+(t.e[a]-f[a])*l,s=i+(r-i)*l,o=r+(n-r)*l,h=s+(o-s)*l,p.push(h),null!==y&&(m+=Math.pow(p[a]-y[a],2))}),m=Math.sqrt(m),c+=m,g.points.push({partialLength:c,point:p}),y=p,t.bezierData=g;g.segmentLength=c}});var y=0,g=0;for(i=0;e>i;i+=1){h=y;for(var v=!1;r-1>h;){if(s=t[h],o=t[h+1],i<s.t&&0==h){for(m=s.s.length,p=[],l=0;m>l;l+=1)p.push(s.s[l]);n.push(p),v=!0,y!=h&&(y=h,g=0);break}if(i>=s.t&&i<o.t){if(p=[],s.to){c=bez.getEasingCurve([s.o.x,s.o.y,s.i.x,s.i.y])("",i-s.t,0,1,o.t-s.t);var E,b,w,C=s.bezierData,S=C.segmentLength*c;for(l=g;l<C.points.length;){if(0==i||0==S||0==c){p=C.points[l].point,g=l;break}if(l==C.points.length-1)p=C.points[l].point;else if(S>C.points[l].partialLength&&S<C.points[l+1].partialLength){for(b=C.points[l].point.length,w=(S-C.points[l].partialLength)/(C.points[l+1].partialLength-C.points[l].partialLength),E=0;b>E;E+=1)p.push(C.points[l].point[E]+(C.points[l+1].point[E]-C.points[l].point[E])*w);g=l;break}l+=1}}else{var x,A,M,I;s.s.forEach(function(t,e){if(1!==s.h&&(s.o.x instanceof Array?(x=s.o.x[e],A=s.o.y[e],M=s.i.x[e],I=s.i.y[e]):(x=s.o.x,A=s.o.y,M=s.i.x,I=s.i.y),c=bez.getEasingCurve([x,A,M,I])("",i-s.t,0,1,o.t-s.t)),t.i){var a={i:[],o:[],v:[]};t.i.forEach(function(i,r){var n=[],o=[],h=[];i.forEach(function(a,i){1===s.h?(n.push(a),o.push(t.o[r][i]),h.push(t.v[r][i])):(n.push(a+(s.e[e].i[r][i]-a)*c),o.push(t.o[r][i]+(s.e[e].o[r][i]-t.o[r][i])*c),h.push(t.v[r][i]+(s.e[e].v[r][i]-t.v[r][i])*c))}),a.i.push(n),a.o.push(o),a.v.push(h)}),p.push(a)}else p.push(1===s.h?t:t+(s.e[e]-t)*c)})}n.push(p),v=!0,y!=h&&(y=h,g=0);break}h+=1}0==v&&(s=t[t.length-2],p=[],s.e.forEach(function(t){p.push(t)}),n.push(p))}for(h=n.length;e>h;)n.push(p),h+=1;return n}function n(t,e,a){if(!(t instanceof Array)||null==t[0].t)return t;for(var i=0,r=t.length-1;r>i&&(l=t[i],m=t[i+1],!(m.t-a>e));)i+=1;l.to&&!l.bezierData&&bez.buildBezierData(l);var n,s,o,h=0;if(p=[],l.to){if(c=l.bezierData,e>=m.t-a)return c.points[c.points.length-1].point;if(e<l.t-a)return c.points[0].point;o=bez.getEasingCurve([l.o.x,l.o.y,l.i.x,l.i.y])("",e-(l.t-a),0,1,m.t-a-(l.t-a));for(var d,u=c.segmentLength*o,f=0;h<c.points.length;){if(f+=c.points[h].partialLength,0==e||0==u||0==o){p=c.points[h].point;break}if(h==c.points.length-1)p=c.points[h].point;else if(u>f&&u<f+c.points[h+1].partialLength){for(s=c.points[h].point.length,d=(u-f)/c.points[h+1].partialLength,n=0;s>n;n+=1)p.push(c.points[h].point[n]+(c.points[h+1].point[n]-c.points[h].point[n])*d);break}h+=1}}else{var y,g,v,E;for(r=l.s.length,i=0;r>i;i+=1)if(1!==l.h&&(l.o.x instanceof Array?(y=l.o.x[i],g=l.o.y[i],v=l.i.x[i],E=l.i.y[i]):(y=l.o.x,g=l.o.y,v=l.i.x,E=l.i.y),o=bez.getEasingCurve([y,g,v,E])("",e-(l.t-a),0,1,m.t-a-(l.t-a)),e>=m.t-a?o=1:e<l.t-a&&(o=0)),l.s[i].i){var b={i:[],o:[],v:[]},w=l.s[i].i.length;for(h=0;w>h;h+=1){var C=[],S=[],x=[];for(s=l.s[i].i[h].length,n=0;s>n;n+=1)1===l.h?(C.push(l.s[i].i[h][n]),S.push(l.s[i].o[h][n]),x.push(l.s[i].v[h][n])):(C.push(l.s[i].i[h][n]+(l.e[i].i[h][n]-l.s[i].i[h][n])*o),S.push(l.s[i].o[h][n]+(l.e[i].o[h][n]-l.s[i].o[h][n])*o),x.push(l.s[i].v[h][n]+(l.e[i].v[h][n]-l.s[i].v[h][n])*o));b.i.push(C),b.o.push(S),b.v.push(x)}p.push(b)}else p.push(1===l.h?l.s[i]:l.s[i]+(l.e[i]-l.s[i])*o)}return p}function s(t,e){t instanceof Array||(t=[t]);var a,i,r,n=t.length;for(R="",a=0;n>a;a+=1){for(y=t[a],d=y.v,u=y.o,f=y.i,r=d.length,R+="M"+d[0][0]+","+d[0][1],i=1;r>i;i++)R+=" C"+(u[i-1][0]+d[i-1][0])+","+(u[i-1][1]+d[i-1][1])+" "+(f[i][0]+d[i][0])+","+(f[i][1]+d[i][1])+" "+d[i][0]+","+d[i][1];e!==!1&&(R+=" C"+(u[i-1][0]+d[i-1][0])+","+(u[i-1][1]+d[i-1][1])+" "+(f[0][0]+d[0][0])+","+(f[0][1]+d[0][1])+" "+d[0][0]+","+d[0][1])}return R}function o(t,e,a){var i,r,h,l,m,p=t.length;for(l=0;p>l;l+=1)if(m=t[l],i=e-m.startTime,!(e<m.inPoint||e>m.outPoint||m.an[i])){if(g={},v={},v.a=n(m.ks.a,i,m.startTime),E=n(m.ks.o,i,m.startTime),v.o=E instanceof Array?E[0]/100:E/100,b=n(m.ks.p,i,m.startTime),w=n(m.ks.r,i,m.startTime),C=n(m.ks.s,i,m.startTime),g.s=C instanceof Array?C.length>1?[C[0]/100,C[1]/100,C[2]/100]:[C[0]/100,C[0]/100,C[0]/100]:[C/100,C/100,C/100],g.r=w instanceof Array?w.length>1?[w[0]*Math.PI/180,w[1]*Math.PI/180,w[2]*Math.PI/180]:[w[0]*Math.PI/180,w[0]*Math.PI/180,w[0]*Math.PI/180]:[0,0,w*Math.PI/180],g.p=b,m.an[i]={forwardFrame:i,tr:v,matrixValue:z.getMatrix2(g),matrixArray:z.getMatrixArray(g)},m.hasMask)for(S=m.masksProperties,h=S.length,r=0;h>r;r+=1)S[r].pathStrings||(S[r].pathStrings=[],S[r].pathVertices=[],S[r].opacity=[]),x=n(S[r].pt,i,m.startTime),S[r].pathVertices[i]=x instanceof Array?x:[x],"svg"==a&&(S[r].pathStrings[i]=s(x,S[r].cl)),S[r].opacity[i]=n(S[r].o,i,m.startTime),S[r].opacity[i]=S[r].opacity[i]instanceof Array?S[r].opacity[i][0]/100:S[r].opacity[i]/100;if("PreCompLayer"==m.type)A=m.tm?m.tm[i]<0?0:m.tm[i]:i,o(m.layers,A,a);else if("ShapeLayer"==m.type)for(h=m.shapes.length,r=0;h>r;r+=1){if(M=m.shapes[r],M._created||(M.an.tr=[],M.an.renderedFrame={},M.ks?M.an.path=[]:M.el?M.an.ell=[]:M.rc&&(M.an.rect=[]),M.fl&&(M.an.fill=[]),M.st&&(M.an.stroke=[])),M.trim&&!M._created&&(M.trim.an=[]),M.fl&&(k=n(M.fl.c,i,m.startTime),I=n(M.fl.o,i,m.startTime),M.an.fill[i]={color:rgbToHex(Math.round(k[0]),Math.round(k[1]),Math.round(k[2])),opacity:I instanceof Array?I[0]/100:I/100,forwardFrame:i}),M.ks?(F=n(M.ks,i,m.startTime),M.an.path[i]={pathNodes:F,closed:M.closed,forwardFrame:i},"svg"==a&&(M.an.path[i].pathString=s(F,M.closed))):M.el?(B=n(M.el.p,i,m.startTime),L=n(M.el.s,i,m.startTime),M.an.ell[i]={p:B,size:L,forwardFrame:i}):M.rc&&(B=n(M.rc.p,i,m.startTime),L=n(M.rc.s,i,m.startTime),N=n(M.rc.r,i,m.startTime),M.an.rect[i]={position:B,size:L,roundness:N,forwardFrame:i}),M.st&&(T=n(M.st.c,i,m.startTime),P=n(M.st.o,i,m.startTime),D=n(M.st.w,i,m.startTime),M.an.stroke[i]={color:rgbToHex(Math.round(T[0]),Math.round(T[1]),Math.round(T[2])),opacity:P instanceof Array?P[0]/100:P/100,width:D instanceof Array?D[0]:D,forwardFrame:i}),_={},_.a=n(M.tr.a,i,m.startTime),_.o=n(M.tr.o,i,m.startTime),_.o=_.o instanceof Array?_.o[0]/100:_.o/100,_.s=n(M.tr.s,i,m.startTime),_.s=_.s instanceof Array?_.s.length>1?[_.s[0]/100,_.s[1]/100,_.s[2]/100]:[_.s[0]/100,_.s[0]/100,_.s[0]/100]:[_.s/100,_.s/100,_.s/100],_.r=n(M.tr.r,i,m.startTime),_.r=_.r instanceof Array?_.r.length>1?[_.r[0]*Math.PI/180,_.r[1]*Math.PI/180,_.r[2]*Math.PI/180]:[_.r[0]*Math.PI/180,_.r[0]*Math.PI/180,_.r[0]*Math.PI/180]:[0,0,_.r*Math.PI/180],_.p=n(M.tr.p,i,m.startTime),_.mt=z.getMatrix2(_),_.mtArr=z.getMatrixArray(_),_.forwardFrame=i,M.an.tr[i]=_,M.trim){var c=n(M.trim.s,i,m.startTime),d=n(M.trim.e,i,m.startTime),u=n(M.trim.o,i,m.startTime);M.trim.an[i]={s:c,e:d,o:u,forwardFrame:i}}M._created||(M._created=!0)}}}function h(t,e,a){o(t,e,a)}var l,m,p,c,d,u,f,y,g,v,E,b,w,C,S,x,A,M,I,k,F,T,P,D,B,L,N,V=0,z=new MatrixManager,R="",_={},O={};return O.completeData=a,O.renderFrame=h,O}(),bez=function(){function t(t,e,a,i,r,n){return Math.abs((a-t)*(n-e)-(r-t)*(i-e))<1e-7}function e(t,e){if(e=t,t="bez_"+e.join("_").replace(/\./g,"p"),r[t])return r[t];var a=function(t,e){var a=[null,null],i=[null,null],r=[null,null],n=function(n,s){return r[s]=3*t[s],i[s]=3*(e[s]-t[s])-r[s],a[s]=1-r[s]-i[s],n*(r[s]+n*(i[s]+n*a[s]))};return function(t){for(var e,s=t,o=0;++o<14&&(e=n(s,0)-t,!(Math.abs(e)<.001));)s-=e/(r[0]+s*(2*i[0]+3*a[0]*s));return n(s,1)}};return r[t]=function(t,i,r,n,s){return n*a([e[0],e[1]],[e[2],e[3]])(i/s)+r},r[t]}function a(e,a,i,r){var s=(e.join("_")+"_"+a.join("_")+"_"+i.join("_")+"_"+r.join("_")).replace(/\./g,"p");if(n[s])return n[s];var o,h,l,m,p,c,d,u,f,y,g,v,E,b,w=500,C=0,S=null,x={points:[],segmentLength:0};for(t(e[0],e[1],a[0],a[1],e[0]+i[0],e[1]+i[1])&&t(e[0],e[1],a[0],a[1],a[0]+r[0],a[1]+r[1])&&(w=2),l=0;w>l;l+=1){for(b=[],v=l/(w-1),E=0,o=[],h=[],p=i.length,m=0;p>m;m+=1)null==o[m]&&(o[m]=e[m]+i[m],h[m]=a[m]+r[m]),c=e[m]+(o[m]-e[m])*v,d=o[m]+(h[m]-o[m])*v,u=h[m]+(a[m]-h[m])*v,f=c+(d-c)*v,y=d+(u-d)*v,g=f+(y-f)*v,b.push(g),null!==S&&(E+=Math.pow(b[m]-S[m],2));E=Math.sqrt(E),C+=E,x.points.push({partialLength:E,point:b}),S=b}return x.segmentLength=C,n[s]=x,x}function i(t){t.bezierData=a(t.s,t.e,t.to,t.ti)}var r={},n={},s={getEasingCurve:e,drawBezierCurve:a,buildBezierData:i};return s}();SVGRenderer.prototype.buildItems=function(t){var e,a=0,i=t.length;for(e=0;i>e;e++)"StillLayer"==t[e].type?(a++,this.createImage(t[e])):"PreCompLayer"==t[e].type?this.createComp(t[e]):"SolidLayer"==t[e].type?this.createSolid(t[e]):"ShapeLayer"==t[e].type?this.createShape(t[e]):"TextLayer"==t[e].type?this.createText(t[e]):console.log("NO TYPE: ",t[e])},SVGRenderer.prototype.createShape=function(t){t.element=new IShapeElement(t,this.animationItem)},SVGRenderer.prototype.createText=function(t){t.element=new ITextElement(t,this.animationItem)},SVGRenderer.prototype.createImage=function(t){t.element=new IImageElement(t,this.animationItem)},SVGRenderer.prototype.createComp=function(t){t.element=new ICompElement(t,this.animationItem),this.buildItems(t.layers,t.element.getType())},SVGRenderer.prototype.createSolid=function(t){t.element=new ISolidElement(t,this.animationItem)},SVGRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElementNS(svgNS,"svg"),this.animationItem.container.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.animationItem.container.setAttribute("width",t.animation.compWidth),this.animationItem.container.setAttribute("height",t.animation.compHeight),this.animationItem.container.setAttribute("viewBox","0 0 "+t.animation.compWidth+" "+t.animation.compHeight),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container);var e=document.createElementNS(svgNS,"defs");this.animationItem.container.appendChild(e);var a=document.createElementNS(svgNS,"clipPath"),i=document.createElementNS(svgNS,"rect");i.setAttribute("width",t.animation.compWidth),i.setAttribute("height",t.animation.compHeight),i.setAttribute("x",0),i.setAttribute("y",0),a.setAttribute("id","animationMask"),a.appendChild(i);var r=document.createElementNS(svgNS,"g");r.setAttribute("clip-path","url(#animationMask)"),this.animationItem.container.appendChild(r),e.appendChild(a),this.animationItem.container=r,this.layers=t.animation.layers},SVGRenderer.prototype.buildStage=function(t,e){var a,i,r=e.length;for(a=r-1;a>=0;a--){if(i=e[a],i.parent){var n=this.buildItemHierarchy(i.element.getDomElement(),i.layerName,i.parent,e,t);n.setAttribute("data-layer-name",i.layerName),t.appendChild(n),i.element.setMainElement(n)}else i.element.getDomElement().setAttribute("data-layer-name",i.layerName),t.appendChild(i.element.getDomElement()),i.element.setMainElement(i.element.getDomElement());"PreCompLayer"==i.type&&this.buildStage(i.element.getComposingElement(),i.layers,i.element.getType())}},SVGRenderer.prototype.buildItemHierarchy=function(t,e,a,i,r){for(var n=0,s=i.length;s>n;){if(i[n].layerName==a){i[n].relateds||(i[n].relateds=[]);var o,h;return o=document.createElementNS(svgNS,"g"),h=document.createElementNS(svgNS,"g"),i[n].relateds.push({item:o,itemCont:h}),o.appendChild(t),h.appendChild(o),void 0!=i[n].parent?this.buildItemHierarchy(h,e,i[n].parent,i,r):h}n+=1}return null},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){var e,a=this.layers.length;for(e=0;a>e;e++)this.layers[e].element.renderFrame(t-this.layers[e].startTime)},CanvasRenderer.prototype.buildItems=function(t){var e,a=0,i=t.length;for(e=0;i>e;e++)"StillLayer"==t[e].type?(a++,this.createImage(t[e])):"PreCompLayer"==t[e].type?this.createComp(t[e]):"SolidLayer"==t[e].type?this.createSolid(t[e]):"ShapeLayer"==t[e].type?this.createShape(t[e]):"TextLayer"==t[e].type?this.createText(t[e]):console.log("NO TYPE: ",t[e])},CanvasRenderer.prototype.createShape=function(t){t.element=new CVShapeElement(t,this)},CanvasRenderer.prototype.createText=function(t){t.element=new CVTextElement(t,this)},CanvasRenderer.prototype.createImage=function(t){t.element=new CVImageElement(t,this)},CanvasRenderer.prototype.createComp=function(t){t.element=new CVCompElement(t,this),this.buildItems(t.layers,t.element.getType())},CanvasRenderer.prototype.createSolid=function(t){t.element=new CVSolidElement(t,this)},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.layers=t.animation.layers,this.canvasContext=this.animationItem.container.getContext("2d"),this.transformCanvas={},this.transformCanvas.w=t.animation.compWidth,this.transformCanvas.h=t.animation.compHeight,this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight;this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e);var a=t/e,i=this.transformCanvas.w/this.transformCanvas.h;i>a?(this.transformCanvas.sx=t/this.transformCanvas.w,this.transformCanvas.sy=t/this.transformCanvas.w,this.transformCanvas.tx=0,this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2):(this.transformCanvas.sx=e/this.transformCanvas.h,this.transformCanvas.sy=e/this.transformCanvas.h,this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2,this.transformCanvas.ty=0)},CanvasRenderer.prototype.buildStage=function(t,e){var a,i,r=e.length;for(a=r-1;a>=0;a--)i=e[a],i.parent&&(i.parentHierarchy=[],this.buildItemHierarchy(i,e,i.parent)),"PreCompLayer"==i.type&&this.buildStage(null,i.layers)},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a){for(var i=0,r=e.length;r>i;){if(e[i].layerName==a){t.parentHierarchy.push(e[i]),void 0==e[i].parent||this.buildItemHierarchy(t,e,e[i].parent);break}i+=1}},CanvasRenderer.prototype.prepareFrame=function(t){var e,a=this.layers.length;for(e=0;a>e;e++)this.layers[e].element.prepareFrame(t-this.layers[e].startTime)},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.layers[t].element.initDraw(),this.layers[t].element.draw(),this.layers[t].element.endDraw()},CanvasRenderer.prototype.renderFrame=function(t){this.animationItem.container.width=this.animationItem.container.width,this.canvasContext.transform(this.transformCanvas.sx,0,0,this.transformCanvas.sy,this.transformCanvas.tx,this.transformCanvas.ty),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.clip(),this.prepareFrame(t),this.draw()},EffectsManager.prototype.init=function(){this.effectElements=[];var t,e=this.effects.length;for(t=0;e>t;t++)switch(this.effects[t].type){case"Stroke":this.addStrokeEffect(this.effects[t])}},EffectsManager.prototype.addStrokeEffect=function(t){var e={data:{value:t},element:{value:this.element}};this.effectElements.push(createElement(StrokeEffectManager,null,e))},EffectsManager.prototype.renderFrame=function(){},defineDescriptor(EffectsManager,"data",null),defineDescriptor(EffectsManager,"element",null),defineDescriptor(EffectsManager,"maskManager",null),StrokeEffectManager.prototype.init=function(){this.element.maskManager.registerEffect(this),this.layerSize=this.element.getLayerSize(),this.svgElement=document.createElementNS(svgNS,"svg"),this.svgElement.setAttribute("width",this.layerSize.w),this.svgElement.setAttribute("height",this.layerSize.h),this.pathGroup=document.createElementNS(svgNS,"g"),this.path=document.createElementNS(svgNS,"path"),this.path.setAttribute("stroke-linecap","round"),this.path.setAttribute("fill","none"),this.svgElement.appendChild(this.path),this.setStaticAttributes();var t=this.element.maskManager.getMaskelement();t.appendChild(this.pathGroup),this.pathGroup.appendChild(this.path)},StrokeEffectManager.prototype.renderMask=function(t,e){var a=e[this.data.path-1].pathString;this.path.setAttribute("d",a);var i=this.path.getTotalLength(),r=void 0===this.data.animated.Start[t].forwardFrame?this.data.animated.Start[t]:this.data.animated.Start[this.data.animated.Start[t].forwardFrame],n=void 0===this.data.animated.End[t].forwardFrame?this.data.animated.End[t]:this.data.animated.End[this.data.animated.End[t].forwardFrame],s="0 ";s+=r*i/100+" ",s+=(n-r)*i/100+" ",s+=(100-n)*i/100+" ",this.path.style["stroke-dasharray"]=s},StrokeEffectManager.prototype.setStaticAttributes=function(){var t=this.data["static"];t["Brush Size"]&&this.path.setAttribute("stroke-width",2*t["Brush Size"]),t.Color&&this.path.setAttribute("stroke",t.Color)},StrokeEffectManager.prototype.renderFrame=function(){},MaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length;var t=this.element.maskingGroup,e=this.element.maskedElement,a=document.createElementNS(svgNS,"defs");t.appendChild(a);var i,r=this.masksProperties.length;if(this.layerSize=this.element.getLayerSize(),this.usePaths){this.maskElement=document.createElementNS(svgNS,"clipPath");var n,s=this.data.masksProperties;for(i=0;r>i;i++)n=document.createElementNS(svgNS,"path"),s[i].cl?n.setAttribute("fill","#ffffff"):(n.setAttribute("fill","none"),n.setAttribute("stroke","#ffffff"),n.setAttribute("stroke-width","1"),n.setAttribute("stroke-miterlimit","10")),n.setAttribute("clip-rule","nonezero"),this.maskElement.appendChild(n),s[i].elem=n,s[i].lastPath="";var o=randomString(10);this.maskElement.setAttribute("id",o),e.setAttribute("clip-path","url(#"+o+")")}else{this.maskElement=document.createElementNS(svgNS,"mask"),this.canvas=document.createElement("canvas"),this.imageElement=document.createElementNS(svgNS,"image"),this.imageElement.setAttribute("width",this.layerSize.w),this.imageElement.setAttribute("height",this.layerSize.h),this.imageElement.setAttribute("x","0"),this.imageElement.setAttribute("y","0"),this.canvasContext=this.canvas.getContext("2d"),this.canvas.width=this.layerSize.w,this.canvas.height=this.layerSize.h,this.maskElement.appendChild(this.imageElement);var o=randomString(10);this.maskElement.setAttribute("id",o),e.setAttribute("mask","url(#"+o+")")}a.appendChild(this.maskElement)},MaskElement.prototype.createInvertedMask=function(t,e){this.helperCanvas.width=this.layerSize.w,this.helperCanvas.height=this.layerSize.h;var a=this.invertedContext;a.globalCompositeOperation="source-over";var i=t.o[e];if("a"==t.mode)a.fillStyle="rgba(255, 255, 255, "+t.o[e]+")",this.canvasContext.globalCompositeOperation="source-over";
else if("s"==t.mode)a.fillStyle="rgba(0, 0, 0, "+i+")",this.canvasContext.globalCompositeOperation="source-over";else if("f"==t.mode)a.fillStyle="rgba(255, 255, 255, "+i+")",this.canvasContext.globalCompositeOperation="xor";else{if("i"!=t.mode)return;a.fillStyle="rgba(255, 255, 255, "+i+")",this.canvasContext.globalCompositeOperation="destination-in"}a.fillRect(0,0,this.helperCanvas.width,this.helperCanvas.height),a.fillStyle="rgba(255, 255, 255, 1)",a.globalCompositeOperation="destination-out",a.beginPath(),this.drawShape(a,t.pathVertices[e][0]),this.canvasContext.drawImage(this.helperCanvas,0,0)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length;if(this.usePaths===!0){if("fullSvg"!==this.element.animationItem.animType)for(e=0;a>e;e++)this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].pathStrings[t])}else{this.canvas.width=this.canvas.width;var i=this.canvasContext;for(e=0;a>e;e++){var r=this.data.masksProperties[e].opacity[t];if(this.masksProperties[e].inv)this.createInvertedMask(this.masksProperties[e],t);else{if("a"==this.masksProperties[e].mode)i.globalCompositeOperation="source-over",i.fillStyle="rgba(255, 255, 255, "+r+")";else if("s"==this.masksProperties[e].mode)i.globalCompositeOperation="source-over",i.fillStyle="rgba(0, 0, 0, "+r+")";else if("f"==this.masksProperties[e].mode)i.globalCompositeOperation="xor",i.fillStyle="rgba(255, 255, 255, "+r+")";else{if("i"!=this.masksProperties[e].mode)continue;i.globalCompositeOperation="destination-in",i.fillStyle="rgba(255, 255, 255, "+r+")"}this.drawShape(i,this.data.masksProperties[e].pathVertices[t][0])}}var n=this.canvas.toDataURL("image/png");this.imageElement.setAttributeNS("http://www.w3.org/1999/xlink","href",n)}},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,i=this.registeredEffects.length;for(a=0;i>a;a++)this.registeredEffects[a].renderMask(t,e)},MaskElement.prototype.registerEffect=function(t){this.registeredEffects.push(t)},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+="h"+this.layerSize.w,t+="v"+this.layerSize.h,t+="h"+-this.layerSize.w,t+="v"+-this.layerSize.h},MaskElement.prototype.drawPath=function(t,e){t.lastPath!==e&&(t.inv?t.elem.setAttribute("d",this.createLayerSolidPath()+e):t.elem.setAttribute("d",e),t.lastPath=e)},MaskElement.prototype.drawShape=function(t,e){t.beginPath();var a,i=e.v.length;for(a=0;i>a;a++)0==a?t.moveTo(e.v[a][0],e.v[a][1]):t.bezierCurveTo(e.o[a-1][0]+e.v[a-1][0],e.o[a-1][1]+e.v[a-1][1],e.i[a][0]+e.v[a][0],e.i[a][1]+e.v[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0]+e.v[a-1][0],e.o[a-1][1]+e.v[a-1][1],e.i[0][0]+e.v[0][0],e.i[0][1]+e.v[0][1],e.v[0][0],e.v[0][1]),t.closePath(),t.fill()},defineDescriptor(MaskElement,"helperCanvas",document.createElement("canvas")),defineDescriptor(MaskElement,"helperContext",MaskElement.prototype.helperCanvas.getContext("2d")),defineDescriptor(MaskElement,"data",null,{writable:!0}),defineDescriptor(MaskElement,"element",null),defineDescriptor(MaskElement,"usePaths",!0,{writable:!0}),defineDescriptor(MaskElement,"paths",[],{writable:!0});var BaseElement=function(t,e){this.animationItem=e,this.data=t,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},BaseElement.prototype.createElements=function(){this.layerElement=document.createElementNS(svgNS,"g"),this.anchorElement=document.createElementNS(svgNS,"g"),this.anchorElement.setAttribute("id",this.data.layerName),this.layerElement.appendChild(this.anchorElement),this.maskingGroup=this.anchorElement,this.maskedElement=this.svgElem},BaseElement.prototype.renderFrame=function(t){if(!(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>t))return this.isVisible!==!1&&(this.isVisible=!1,this.mainElement.setAttribute("opacity",0)),!1;this.isVisible!==!0&&(this.isVisible=!0,this.mainElement.setAttribute("opacity",1));var e=this.data.an[this.data.an[t].forwardFrame];if(this.data.eff&&this.effectsManager.renderFrame(t,e.mk),this.data.an[t].forwardFrame===this.data.renderedFrame.num)return!0;this.data.hasMask&&this.maskManager.renderFrame(t),this.data.renderedFrame.num=e.forwardFrame,this.data.renderedFrame.o!==e.tr.o&&(this.data.renderedFrame.o=e.tr.o,this.anchorElement.setAttribute("opacity",e.tr.o));var a=!1;(!this.data.renderedFrame.a||this.data.renderedFrame.a[0]!==e.tr.a[0]&&this.data.renderedFrame.a[1]!==e.tr.a[1])&&(this.data.renderedFrame.a=[e.tr.a[0],e.tr.a[1]],this.anchorElement.setAttribute("transform","translate("+-e.tr.a[0]+" "+-e.tr.a[1]+")"),a=!0);var i=!1;if(this.data.renderedFrame.tr!==e.matrixValue&&(this.layerElement.setAttribute("transform",e.matrixValue),this.data.renderedFrame.tr=e.matrixValue,i=!0),this.data.relateds&&(i||a)){var r,n,s,o=this.data.relateds,h=o.length;for(r=0;h>r;r++)n=o[r].item,s=o[r].itemCont,a&&n.setAttribute("transform","translate("+-e.tr.a[0]+" "+-e.tr.a[1]+")"),i&&s.setAttribute("transform",e.matrixValue)}return!0},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.setMainElement=function(t){this.mainElement=t},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(MaskElement,null,e)},BaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(BaseElement,ICompElement),ICompElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this)},ICompElement.prototype.getComposingElement=function(){return this.anchorElement},ICompElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);if(e!==!1){var a,i=this.layers.length,r=this.data.tm?this.data.tm[t]<0?0:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.layers[a].element.renderFrame(r-this.layers[a].startTime)}},createElement(BaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this,e=function(){t.image.setAttributeNS("http://www.w3.org/1999/xlink","href",t.path+t.assets[t.data.assetId].path),t.maskedElement=t.image,t.animationItem.elementLoaded()},a=new Image;a.addEventListener("load",e,!1),a.src=this.path+this.assets[this.data.assetId].path,this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.data.width+"px"),this.image.setAttribute("height",this.data.height+"px"),this.svgElem.appendChild(this.image),this.anchorElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,styleUnselectableDiv(this.image)},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g"),styleUnselectableDiv(this.svgElem),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem);var t,e,a=this.data.shapes.length;for(t=a-1;t>=0;t--)this.data.trim&&(this.data.shapes[t].trim=this.data.trim),e=new ShapeItemElement(this.data.shapes[t]),this.svgElem.appendChild(e.getElement()),this.shapes.push(e)},IShapeElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);e!==!1&&this.renderShapes(t)},IShapeElement.prototype.renderShapes=function(t){var e,a,i,r=this.data.shapes.length;for(e=r-1;e>=0;e--)a=this.data.shapes[e],i=this.shapes[r-1-e],i.renderShape(t)},ShapeItemElement.prototype.adjustTrim=function(){var t,e=this.data.trim,a=e.length;for(t=0;a>t;t+=1)e[t].o&&(e[t].o-=90)},ShapeItemElement.prototype.getElement=function(){return this.shapeG},ShapeItemElement.prototype.renderShape=function(t){"pathShape"==this.data.type?this.pathLength=this.renderPath(t):"rectShape"==this.data.type?this.renderRect(t):"ellipseShape"==this.data.type&&(this.pathLength=this.renderEllipse(t)),this.data.trim&&this.renderTrim(t),this.renderFill(t),this.renderStroke(t),this.renderTransform(t)},ShapeItemElement.prototype.renderPath=function(t){var e=this.data.an,a=e.path[e.path[t].forwardFrame];return a.pathString!=e.renderedFrame.path?(e.renderedFrame.path=a.pathString,this.shape.setAttribute("d",a.pathString),this.data.trim?(null==this.cachedData.pathLengths&&(this.cachedData.pathLengths={}),null==this.cachedData.pathLengths[a.pathString]&&(this.cachedData.pathLengths[a.pathString]=this.shape.getTotalLength()),this.cachedData.pathLengths[a.pathString]):void 0):this.data.trim?this.cachedData.pathLengths[e.path[e.path[t].forwardFrame].pathString]:void 0},ShapeItemElement.prototype.renderEllipse=function(t){var e=this.data.an;if(e.ell[t].forwardFrame==e.renderedFrame.ell)return this.data.trim?this.cachedData.pathLengths["ellipse_"+e.ell[t].forwardFrame]:0;var a=e.ell[e.ell[t].forwardFrame];if(e.renderedFrame.ell=a.forwardFrame,this.shape.setAttribute("rx",a.size[0]/2),this.shape.setAttribute("ry",a.size[1]/2),this.shape.setAttribute("cx",a.p[0]),this.shape.setAttribute("cy",a.p[1]),this.data.trim){if(null==this.cachedData.pathLengths&&(this.cachedData.pathLengths={}),null==this.cachedData.pathLengths["ellipse_"+t])if(a.size[0]==a.size[1])this.cachedData.pathLengths["ellipse_"+t]=Math.PI*a.size[0];else{var i=Math.max(a.size[0],a.size[1])/2,r=Math.max(a.size[0],a.size[1])/2,n=(i-r)/(i+r),s=(i+r)*Math.PI*(1+.25*n+1/64*Math.pow(n,2)+1/256*Math.pow(n,3));this.cachedData.pathLengths["ellipse_"+t]=s}return this.cachedData.pathLengths["ellipse_"+t]}},ShapeItemElement.prototype.renderRect=function(t){var e=this.data.an;if(e.rect[t].forwardFrame!=e.renderedFrame.rect){var a=e.rect[e.rect[t].forwardFrame];e.renderedFrame.rect=a.forwardFrame,this.shape.setAttribute("width",a.size[0]),this.shape.setAttribute("height",a.size[1]),this.shape.setAttribute("rx",a.roundness),this.shape.setAttribute("ry",a.roundness),this.shape.setAttribute("x",a.position[0]-a.size[0]/2),this.shape.setAttribute("y",a.position[1]-a.size[1]/2)}},ShapeItemElement.prototype.renderFill=function(t){var e=this.data.an;if(e.fill){var a=e.fill[e.fill[t].forwardFrame];if(e.renderedFrame.fill&&a.color==e.renderedFrame.fill.color&&a.opacity==e.renderedFrame.fill.opacity)return;e.renderedFrame.fill={color:a.color,opacity:a.opacity},this.shape.setAttribute("fill",a.color),this.data.fillEnabled!==!1?this.shape.setAttribute("fill-opacity",a.opacity):this.shape.setAttribute("fill-opacity",0)}else this.shape.setAttribute("fill-opacity",0)},ShapeItemElement.prototype.renderStroke=function(t){var e=this.data.an;if(e.stroke){if(e.stroke[t].forwardFrame==e.renderedFrame.stroke)return;var a=e.stroke[e.stroke[t].forwardFrame];e.renderedFrame.stroke=a.forwardFrame,this.shape.setAttribute("stroke",a.color),this.shape.setAttribute("stroke-width",a.width),this.data.strokeEnabled!==!1?this.shape.setAttribute("stroke-opacity",a.opacity):this.shape.setAttribute("stroke-opacity",0)}},ShapeItemElement.prototype.renderTransform=function(t){var e=this.data.an;if(e.tr){if(e.tr[t].forwardFrame==e.renderedFrame.tr)return;var a=e.tr[e.tr[t].forwardFrame];e.renderedFrame.tr=a.forwardFrame;var i=a.mt;this.shapeG.setAttribute("opacity",a.o),this.shapeG.setAttribute("transform",i),this.shape.setAttribute("transform","translate("+-a.a[0]+", "+-a.a[1]+")")}},ShapeItemElement.prototype.renderTrim=function(t){if(this.data.trim.an[t].forwardFrame!=this.data.renderedData.trim){var e=this.data.trim.an[this.data.trim.an[t].forwardFrame];if(this.data.renderedData.trim=e.forwardFrame,0==this.pathLength)this.shape.setAttribute("stroke-opacity",0);else{var a=this.pathLength*(e.e-e.s)/100,i=this.pathLength-a,r=this.pathLength*e.s/100+this.pathLength*e.o/360,n=a+" , "+i;if(this.shape.setAttribute("stroke-dasharray",n),this.shape.setAttribute("stroke-dashoffset",-r),e.e==e.s)this.shape.setAttribute("stroke-opacity",0);else if(this.data.an.stroke){var s=this.data.an.stroke[this.data.an.stroke[t].forwardFrame];this.data.strokeEnabled!==!1?this.shape.setAttribute("stroke-opacity",s.opacity/100):this.shape.setAttribute("stroke-opacity",0)}}}},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.width),t.setAttribute("height",this.data.height),t.setAttribute("fill",this.data.color),this.svgElem.appendChild(t),styleUnselectableDiv(this.svgElem),styleUnselectableDiv(t),this.maskingGroup=this.svgElem,this.maskedElement=t},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",this.svgElem.style["-webkit-transform"]="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,this.maskedElement=t},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){return this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>t?(this.currentAnimData=this.data.an[this.data.an[t].forwardFrame],void(this.data.hasMask&&this.maskManager.prepareFrame(t))):(this.currentAnimData=null,!1)},CVBaseElement.prototype.initDraw=function(){this.renderer.canvasContext.save()},CVBaseElement.prototype.draw=function(){if(!this.currentAnimData)return!1;var t=this.renderer.canvasContext;if(this.data.parentHierarchy){var e,a,i=this.data.parentHierarchy.length;for(e=i-1;e>=0;e-=1){a=this.data.parentHierarchy[e].element.getCurrentAnimData();var r=a.matrixArray;t.transform(r[0],r[1],r[2],r[3],r[4],r[5]),t.translate(-a.tr.a[0],-a.tr.a[1])}}t.globalAlpha=t.globalAlpha*this.currentAnimData.tr.o;var r=this.currentAnimData.matrixArray;t.transform(r[0],r[1],r[2],r[3],r[4],r[5]),t.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]),this.data.hasMask&&this.maskManager.draw()},CVBaseElement.prototype.endDraw=function(){this.renderer.canvasContext.restore()},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(CVMaskElement,null,e)},CVBaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},CVBaseElement.prototype.getType=function(){return this.type},CVBaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,i=this.layers.length,r=this.data.tm?this.data.tm[t]<0?0:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.layers[a].element.prepareFrame(r-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(){this.parent.draw.call(this);var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.layers[t].element.initDraw(),this.layers[t].element.draw(),this.layers[t].element.endDraw()},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(t){var e=this.parent.draw.call(this,t);if(e!==!1){var a=this.renderer.canvasContext;a.drawImage(this.img,0,0)}},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this);var t,e,a=this.data.shapes.length;for(t=a-1;t>=0;t--)this.data.trim&&(this.data.shapes[t].trim=this.data.trim),e=new CVShapeItemElement(this.data.shapes[t],this.renderer),this.shapes.push(e)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,i,r,n=this.data.shapes.length;for(a=n-1;a>=0;a--)i=this.data.shapes[a],r=this.shapes[n-1-a],r.prepareFrame(t)}},CVShapeElement.prototype.draw=function(){var t=this.parent.draw.call(this);t!==!1&&this.drawShapes()},CVShapeElement.prototype.drawShapes=function(){var t,e,a,i=this.data.shapes.length;for(t=i-1;t>=0;t--)e=this.data.shapes[t],a=this.shapes[i-1-t],a.renderShape()},CVShapeItemElement.prototype.adjustTrim=function(){var t,e=this.data.trim,a=e.length;for(t=0;a>t;t+=1)e[t].o&&(e[t].o-=90)},CVShapeItemElement.prototype.renderShape=function(){if(""!==this.data.type){var t=this.frameNum,e=this.renderer.canvasContext,a=this.renderTransform(t);"pathShape"==this.data.type?this.data.trim?this.renderTrimPath(t):this.renderPath(t):"rectShape"==this.data.type?this.renderRect(t):"ellipseShape"==this.data.type&&(this.pathLength=this.renderEllipse(t)),this.renderFill(t),this.renderStroke(t),this.renderer.canvasContext.lineCap="round",this.renderer.canvasContext.lineJoin="round",this.renderedPaths[t]?supportsPath2D?(this.renderer.canvasContext.fill(this.renderedPaths[t]),this.renderer.canvasContext.stroke(this.renderedPaths[t])):(this.renderedPaths[t].drawToContext(this.renderer.canvasContext),this.renderer.canvasContext.fill(),this.renderer.canvasContext.stroke()):(this.renderer.canvasContext.fill(),this.renderer.canvasContext.stroke()),a&&e.restore()}},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t},CVShapeItemElement.prototype.renderTransform=function(t){var e=this.data.an;if(e.tr){var a=this.renderer.canvasContext,i=e.tr[e.tr[t].forwardFrame];e.renderedFrame.tr=i.forwardFrame;var r=i.mtArr;return 1==r[0]&&0==r[1]&&0==r[2]&&1==r[3]&&0==r[4]&&0==r[5]&&i.o>=1?!1:(a.save(),a.transform(r[0],r[1],r[2],r[3],r[4],r[5]),a.translate(-i.a[0],-i.a[1]),i.o<1&&(a.globalAlpha=i.o),!0)}},CVShapeItemElement.prototype.addToTrim=function(t,e,a){this.trims[t]||this.trims.push({}),this.trims[t].s=e,this.trims[t].e=a,this.trims[t].ended=!1},CVShapeItemElement.prototype.renderTrimPath=function(t){var e=this.data.trim.an[this.data.trim.an[t].forwardFrame];if(e.e!=e.s&&!this.renderedPaths[t]){var a,i=new Path2D,r=this.data.an,n=r.path[r.path[t].forwardFrame],s=n.pathNodes,o=[],h=0,l=s.v.length;for(a=0;l-1>a;a+=1)o.push(bez.drawBezierCurve(s.v[a],s.v[a+1],s.o[a],s.i[a+1])),h+=o[a].segmentLength;n.closed&&(o.push(bez.drawBezierCurve(s.v[l-1],s.v[0],s.o[l-1],s.i[0])),h+=o[a].segmentLength),l=o.length;var m=h*(e.e-e.s)/100,p=(e.s/100+e.o%360/360)%1*h,c=0;if(p+m-h>1e-5){var d=p+m-h;this.addToTrim(0,p,p+m-d),this.addToTrim(1,0,p+m-h),c+=2}else this.addToTrim(0,p,p+m),c+=1;var u,f,y,g,v,E=0,b=!1,w=this.trims.length;for(a=0;l>a&&!b;a+=1){for(f=o[a].points.length,g=!0,v=0;w>v;v+=1)E+o[a].segmentLength>this.trims[v].s&&(g=!1);if(g)E+=o[a].segmentLength;else{for(u=0;f-1>u&&!b;u+=1)for(w=this.trims.length,E+=o[a].points[u].partialLength,v=0;w>v;v+=1)if(!this.trims[v].ended)if(this.trims[v].s>=E&&this.trims[v].s<E+o[a].points[u+1].partialLength&&(y=(this.trims[v].s-E)/o[a].points[u+1].partialLength,i.moveTo(o[a].points[u].point[0]+(o[a].points[u+1].point[0]-o[a].points[u].point[0])*y,o[a].points[u].point[1]+(o[a].points[u+1].point[1]-o[a].points[u].point[1])*y)),this.trims[v].e>E&&this.trims[v].e<=E+o[a].points[u+1].partialLength){if(y=(this.trims[v].e-E)/o[a].points[u+1].partialLength,i.lineTo(o[a].points[u].point[0]+(o[a].points[u+1].point[0]-o[a].points[u].point[0])*y,o[a].points[u].point[1]+(o[a].points[u+1].point[1]-o[a].points[u].point[1])*y),c-=1,this.trims[v].ended=!1,0==c){b=!0;break}}else E>this.trims[v].s&&E<this.trims[v].e&&i.lineTo(o[a].points[u].point[0],o[a].points[u].point[1]);this.renderedPaths[t]=i}}}},CVShapeItemElement.prototype.renderPath=function(t){var e=this.data.an,a=e.path[e.path[t].forwardFrame];if(!this.renderedPaths[t]){var i=new Path2D;e.renderedFrame.path=a.pathString;var r=this.renderer.canvasContext,n=a.pathNodes;n instanceof Array&&(n=n[0]);var s,o=n.i.length;for(r.beginPath(),i.moveTo(n.v[0][0],n.v[0][1]),s=1;o>s;s+=1)i.bezierCurveTo(n.o[s-1][0]+n.v[s-1][0],n.o[s-1][1]+n.v[s-1][1],n.i[s][0]+n.v[s][0],n.i[s][1]+n.v[s][1],n.v[s][0],n.v[s][1]);a.closed&&i.bezierCurveTo(n.o[s-1][0]+n.v[s-1][0],n.o[s-1][1]+n.v[s-1][1],n.i[0][0]+n.v[0][0],n.i[0][1]+n.v[0][1],n.v[0][0],n.v[0][1]),this.renderedPaths[t]=i}},CVShapeItemElement.prototype.renderEllipse=function(t){var e=this.data.an,a=e.ell[e.ell[t].forwardFrame];e.renderedFrame.ell=a.forwardFrame;var i=this.renderer.canvasContext;i.beginPath(),i.ellipse(a.p[0],a.p[1],a.size[0]/2,a.size[1]/2,0,0,2*Math.PI,!0),i.closePath()},CVShapeItemElement.prototype.renderRect=function(t){var e=this.data.an,a=e.rect[e.rect[t].forwardFrame],i=a.roundness,r=this.renderer.canvasContext;if(r.beginPath(),0==i)r.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var n=a.position[0]-a.size[0]/2,s=a.position[1]-a.size[1]/2,o=a.size[0],h=a.size[1];r.moveTo(n+i,s),r.lineTo(n+o-i,s),r.quadraticCurveTo(n+o,s,n+o,s+i),r.lineTo(n+o,s+h-i),r.quadraticCurveTo(n+o,s+h,n+o-i,s+h),r.lineTo(n+i,s+h),r.quadraticCurveTo(n,s+h,n,s+h-i),r.lineTo(n,s+i),r.quadraticCurveTo(n,s,n+i,s)}},CVShapeItemElement.prototype.renderFill=function(t){var e=this.data.an;if(e.fill){var a=e.fill[e.fill[t].forwardFrame];if(e.renderedFrame.fill={color:a.color,opacity:a.opacity},this.data.fillEnabled!==!1)return void(this.renderer.canvasContext.fillStyle=a.opacity<1?fillToRgba(a.color,a.opacity):a.color)}this.renderer.canvasContext.fillStyle="rgba(0,0,0,0)"},CVShapeItemElement.prototype.renderStroke=function(t){var e=this.data.an;if(e.stroke){var a=e.stroke[e.stroke[t].forwardFrame];if(e.renderedFrame.stroke=a.forwardFrame,this.renderer.canvasContext.lineWidth=a.width,this.data.strokeEnabled!==!1)return void(this.renderer.canvasContext.strokeStyle=a.opacity<1?fillToRgba(a.color,a.opacity):a.color)}this.renderer.canvasContext.strokeStyle="rgba(0,0,0,0)"},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(){this.parent.draw.call(this);var t=this.renderer.canvasContext;t.fillStyle=this.data.color,t.fillRect(0,0,this.data.width,this.data.height)},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",this.svgElem.style["-webkit-transform"]="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,this.maskedElement=t},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.renderer.canvasContext,this.layerSize=this.element.getLayerSize()},CVMaskElement.prototype.prepareFrame=function(t){this.frameNum=t},CVMaskElement.prototype.draw=function(){var t,e=this.data.masksProperties.length;for(t=0;e>t;t++)this.masksProperties[t].inv?this.createInvertedMask(this.masksProperties[t],this.frameNum):this.drawShape(this.ctx,this.data.masksProperties[t].pathVertices[this.frameNum][0])},CVMaskElement.prototype.drawShape=function(t,e){t.beginPath();var a,i=e.v.length;for(t.moveTo(e.v[0][0],e.v[0][1]),a=1;i>a;a++)t.bezierCurveTo(e.o[a-1][0]+e.v[a-1][0],e.o[a-1][1]+e.v[a-1][1],e.i[a][0]+e.v[a][0],e.i[a][1]+e.v[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0]+e.v[a-1][0],e.o[a-1][1]+e.v[a-1][1],e.i[0][0]+e.v[0][0],e.i[0][1]+e.v[0][1],e.v[0][0],e.v[0][1]),t.closePath(),t.clip()};var animationManager=function(){function t(t){if(t){for(var e=0,a=u.length;a>e;){if(u[e].elem==t)return;e+=1}var i=new AnimationItem;return i.setData(t),u.push({elem:t,animation:i}),i}}function e(t,e){var a,i=u.length;for(a=0;i>a;a+=1)u[a].animation.setSpeed(t,e)}function a(t,e){var a,i=u.length;for(a=0;i>a;a+=1)u[a].animation.setDirection(t,e)}function i(t){f=Date.now();var e,a=u.length;for(e=0;a>e;e+=1)u[e].animation.play(t);s()}function r(t,e){v=!1,f=Date.now();var a,i=u.length;for(a=0;i>a;a+=1)u[a].animation.moveFrame(t,e)}function n(){d=!1,s()}function s(){if(!d){d=!0,y=Date.now(),g=y-f;var t,e=u.length;for(t=0;e>t;t+=1)u[t].animation.advanceTime(g);f=y,requestAnimationFrame(n)}}function o(t){var e,a=u.length;for(e=0;a>e;e+=1)u[e].animation.pause(t)}function h(t){var e,a=u.length;for(e=0;a>e;e+=1)u[e].animation.stop(t)}function l(t){var e,a=u.length;for(e=0;a>e;e+=1)u[e].animation.togglePause(t)}function m(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function p(){var t,e=u.length;for(t=0;e>t;t+=1)u[t].animation.resize()}var c={},d=!1,u=[],f=0,y=0,g=0,v=!0;return c.registerAnimation=t,c.setSpeed=e,c.setDirection=a,c.play=i,c.moveFrame=r,c.resume=s,c.pause=o,c.stop=h,c.togglePause=l,c.searchAnimations=m,c.resize=p,c}(),AnimationItem=function(){this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.renderedFrames={},this.effectsManager=null,this.isPaused=!0,this.isScrolling=!1,this.loop=!0,this.renderer=null};AnimationItem.prototype.setData=function(t){this.wrapper=t;var e=this;switch(this.path=this.wrapper.attributes.getNamedItem("data-animation-path")?this.wrapper.attributes.getNamedItem("data-animation-path").value:"",this.playerType=this.wrapper.attributes.getNamedItem("data-bm-player")?this.wrapper.attributes.getNamedItem("data-bm-player").value:"0",this.animType=this.wrapper.attributes.getNamedItem("data-anim-type")?this.wrapper.attributes.getNamedItem("data-anim-type").value:"div",this.animType){case"canvas":this.renderer=new CanvasRenderer(this);break;case"svg":this.renderer=new SVGRenderer(this)}if(this.repeat=this.wrapper.attributes.getNamedItem("data-anim-repeat")?this.wrapper.attributes.getNamedItem("data-anim-repeat").value:this.repeat,this.loop=this.wrapper.attributes.getNamedItem("data-anim-loop")?"false"!==this.wrapper.attributes.getNamedItem("data-anim-loop").value:this.loop,this.name=this.wrapper.attributes.getNamedItem("data-name")?this.wrapper.attributes.getNamedItem("data-name").value:"",""!=this.path){"/"!=this.path.substr(-1,1)&&(this.path+="/");var a=new XMLHttpRequest;a.open("GET",this.path+"data.json",!0),a.send(),a.onreadystatechange=function(){4==a.readyState&&e.configAnimation(JSON.parse(a.responseText))}}},AnimationItem.prototype.configAnimation=function(t){this.renderer.configAnimation(t),this.effectsManager=new EffectsManager,this.animationData=t,this.layers=this.animationData.animation.layers,this.assets=this.animationData.assets,this.totalFrames=this.animationData.animation.totalFrames,this.frameRate=this.animationData.animation.frameRate,this.frameMult=this.animationData.animation.frameRate/1e3,dataManager.completeData(this.layers,this.frameRate),this.renderer.buildItems(this.animationData.animation.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0==this.pendingElements&&(this.isLoaded=!0,this.renderer.buildStage(this.container,this.layers),this.buildControls(),this.gotoFrame(),this.dispatchEvent("bmLoaded"))},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.buildControls=function(){"0"!==this.playerType&&(this.player=playerManager.createPlayer(this.playerType),this.player.buildControls(this,this.wrapper))},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?Math.round(100*this.currentRawFrame)/100:Math.floor(this.currentRawFrame),this.renderFrame(),this.player&&this.player.setProgress(this.currentFrame/this.totalFrames)},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(this.renderedFrames[this.currentFrame]||(this.renderedFrames[this.currentFrame]=!0,dataManager.renderFrame(this.layers,this.currentFrame,this.animType)),this.renderer.renderFrame(this.currentFrame))},AnimationItem.prototype.dispatchEvent=function(t){var e;document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(t,!1,!1,{})):e=new CustomEvent("bmPlay"),this.wrapper.dispatchEvent(e)},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this.dispatchEvent("bmPlay"))},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.dispatchEvent("bmPause"))},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!1?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.dispatchEvent("bmStop"))},AnimationItem.prototype.goToAndStop=function(t){this.isPaused=!0,this.currentFrame=this.currentRawFrame=t,this.gotoFrame()},AnimationItem.prototype.advanceTime=function(t){this.isPaused!==!0&&this.isScrolling!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier)},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames?(this.currentRawFrame=this.currentRawFrame%this.totalFrames,this.loop===!1&&this.goToAndStop(this.totalFrames-1)):this.currentRawFrame<0&&(this.currentRawFrame=this.totalFrames+this.currentRawFrame),this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path
},AnimationItem.prototype.getAssets=function(){return this.assets},PlayerManager.prototype.createPlayer=function(t){switch(t){case"1":return createElement(BasicPlayer)}};var playerManager=createElement(PlayerManager);BasicPlayer.prototype.setAnimationItem=function(){},BasicPlayer.prototype.playStarted=function(){this.playButton.style.display="none",this.pauseButton.style.display="block",this.pauseAnimation.goToAndStop(0),this.pauseAnimation.play()},BasicPlayer.prototype.pauseStarted=function(){this.playButton.style.display="block",this.pauseButton.style.display="none",this.playAnimation.goToAndStop(0),this.playAnimation.play()},BasicPlayer.prototype.buildControls=function(t,e){var a=this;this.animationItem=t,e.addEventListener("bmPlay",function(){a.playStarted()}),e.addEventListener("bmPause",function(){a.pauseStarted()}),this.controls=document.createElement("div"),this.controls.style.width="100%",this.controls.style.height="70px",this.controls.style.position="absolute",this.controls.style.left=0,this.controls.style.bottom=0,this.controls.style.backgroundColor="rgba(0,0,0,.3)",e.appendChild(this.controls),styleUnselectableDiv(this.controls),this.scrollBar=document.createElement("div"),this.scrollBar.style.width="100%",this.scrollBar.style.height="14px",this.scrollBar.style.backgroundColor="rgba(25,25,25,1)",styleUnselectableDiv(this.scrollBar),this.controls.appendChild(this.scrollBar),this.scrollBarThumb=document.createElement("div"),this.scrollBarThumb.style.width="18px",this.scrollBarThumb.style.height="18px",this.scrollBarThumb.style.position="absolute",this.scrollBarThumb.style.transform=this.scrollBarThumb.style.webkitTransform="translate(-7px,0px)",this.scrollBarThumb.style.top="-3px",this.scrollBarThumb.style.left="0px",this.scrollBarThumb.style.borderRadius="11px",this.scrollBarThumb.style.border="solid 2px #000000",this.scrollBarThumb.style.backgroundColor="rgba(255,255,255,1)",this.scrollBarThumb.style.cursor="pointer",this.controls.appendChild(this.scrollBarThumb),styleUnselectableDiv(this.scrollBarThumb),this.scrollBar.addEventListener("mousedown",function(t){var e=t.layerX,i=a.scrollBar.clientWidth;a.scrollAnimation(e/i)}),this.scrollBarThumb.addEventListener("mousedown",function(){a.scrollAnimation()}),this.playButton=document.createElement("div"),this.playButton.style.width="40px",this.playButton.style.height="30px",this.playButton.style.marginTop="12px",this.playButton.style.marginLeft="10px",this.playButton.style.backgroundColor="rgba(25,25,25,1)",this.playButton.style.cursor="pointer",this.playButton.setAttribute("data-animation-path","exports/pause"),this.playButton.setAttribute("data-bm-player","0"),this.playButton.setAttribute("data-anim-type","svg"),this.playButton.setAttribute("data-anim-name","play"),this.playButton.setAttribute("data-anim-repeat","0"),this.playButton.style.display="none",this.playAnimation=animationManager.registerAnimation(this.playButton),this.playAnimation.loop=!1,this.controls.appendChild(this.playButton),styleUnselectableDiv(this.playButton),this.playButton.addEventListener("click",function(){a.animationItem.play()}),this.pauseButton=document.createElement("div"),this.pauseButton.style.width="40px",this.pauseButton.style.height="30px",this.pauseButton.style.marginTop="12px",this.pauseButton.style.marginLeft="10px",this.pauseButton.style.backgroundColor="rgba(25,25,25,1)",this.pauseButton.style.cursor="pointer",this.pauseButton.setAttribute("data-animation-path","exports/play"),this.pauseButton.setAttribute("data-bm-player","0"),this.pauseButton.setAttribute("data-anim-type","svg"),this.pauseButton.setAttribute("data-anim-name","pause"),this.pauseButton.setAttribute("data-anim-repeat","0"),this.pauseAnimation=animationManager.registerAnimation(this.pauseButton),this.pauseAnimation.wrapper.addEventListener("bmLoaded",function(){a.pauseAnimation.goToAndStop(a.pauseAnimation.totalFrames-1)}),this.pauseAnimation.loop=!1,this.controls.appendChild(this.pauseButton),styleUnselectableDiv(this.pauseButton),this.pauseButton.addEventListener("click",function(){a.animationItem.pause()})},BasicPlayer.prototype.setProgress=function(t){this.progress=t,this.scrollBarThumb.style.left=100*this.progress+"%"},BasicPlayer.prototype.scrollAnimation=function(t){this.animationItem.isScrolling=!0,this.boundingRect=this.scrollBar.getBoundingClientRect(),this.scrollBarWidth=this.scrollBar.clientWidth;var e=this,a=function(t){var a=t.pageX-e.boundingRect.left;0>a?a=0:a>=e.scrollBarWidth&&(a=e.scrollBarWidth-1),e.animationItem.updateAnimation(a/e.scrollBarWidth)},i=function(){window.removeEventListener("mousemove",a),window.removeEventListener("mouseup",i),e.animationItem.isScrolling=!1};window.addEventListener("mousemove",a),window.addEventListener("mouseup",i),void 0!==t&&e.animationItem.updateAnimation(t)},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function i(t){animationManager.togglePause(t)}function r(t,e){animationManager.setSpeed(t,e)}function n(t,e){animationManager.setDirection(t,e)}function s(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function l(t){animationManager.registerAnimation(t)}function m(){animationManager.resize()}function p(t){subframeEnabled=t}var c={};c.play=e,c.pause=a,c.togglePause=i,c.setSpeed=r,c.setDirection=n,c.stop=s,c.moveFrame=o,c.searchAnimations=h,c.registerAnimation=l,c.setSubframeRendering=p,c.resize=m,t.bodymovin=c;var d=setInterval(function(){"complete"===document.readyState&&(clearInterval(d),h(),e())},100);!function(){function e(t,e){e=e||{bubbles:!1,cancelable:!1,detail:void 0};var a=document.createEvent("CustomEvent");return a.initCustomEvent(t,e.bubbles,e.cancelable,e.detail),a}e.prototype=t.Event.prototype,t.CustomEvent=e}()}(window);}(window));