(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.props=[1,0,0,1,0,0],e.cssParts=["matrix(","",")"],e.a1=e.b1=e.c1=e.d1=e.e1=e.f1=0,e.context=t,e.cos=e.sin=0,t&&t.setTransform(1,0,0,1,0,0)}function BM_CanvasRenderingContext2D(t){this.renderer=t}function matrixManagerFunction(){var t=new Matrix,e=function(t,e,a,i,r,s,n,o,h){var l,p,m,d,c,f,u;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]]),p=$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]]),m=$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]]),c=$M([[i,0,0,0],[0,r,0,0],[0,0,s,0],[0,0,0,1]]),f=l.x(p).x(m).x(c),f=f.transpose(),u=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[n,o,h,1]]),f=f.x(u),d="matrix3d(",d+=f.e(1,1).toFixed(5)+","+f.e(1,2).toFixed(5)+","+f.e(1,3).toFixed(5)+","+f.e(1,4).toFixed(5)+",",d+=f.e(2,1).toFixed(5)+","+f.e(2,2).toFixed(5)+","+f.e(2,3).toFixed(5)+","+f.e(2,4).toFixed(5)+",",d+=f.e(3,1).toFixed(5)+","+f.e(3,2).toFixed(5)+","+f.e(3,3).toFixed(5)+","+f.e(3,4).toFixed(5)+",",d+=f.e(4,1).toFixed(5)+","+f.e(4,2).toFixed(5)+","+f.e(4,3).toFixed(5)+","+f.e(4,4).toFixed(5),d+=")"},a=function(e,a,i,r,s){return t.reset().translate(r,s).rotate(e).scale(a,i).toCSS()},i=function(e,a,i,r,s){return t.reset().translate(r,s).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])},s=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])},n=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:s,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:i,getMatrix2FromParams:a}}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 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 s in i)r[s]=i[s];var n={};t&&"[object Function]"===n.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 s in a)r[s]=a[s];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,r)}function bezFunction(){function t(t,e,a,i,r,s){return l.abs((a-t)*(s-e)-(r-t)*(i-e))<1e-5}function e(t){return h[t].fnc}function a(t,e,a,i,r){if(r||(r=("bez_"+t+"_"+e+"_"+a+"_"+i).replace(/\./g,"p")),h[r])return h[r];var s,n,o,l,p,m;return h[r]=function(r,h,d,c,f){var u=h/f;r=u;for(var y,g=0;++g<14&&(o=3*t,n=3*(a-t)-o,s=1-o-n,y=r*(o+r*(n+r*s))-u,!(Math.abs(y)<.001));)r-=y/(o+r*(2*n+3*s*r));m=3*e,p=3*(i-e)-m,l=1-m-p;var v=r*(m+r*(p+r*l));return c*v+d},h[r]}function i(t){this.segmentLength=0,this.points=new Array(t)}function r(e){var a,r,s,n,o,h,l,p=e.s,m=e.e,d=e.to,c=e.ti,f=500,u=0,y=null;(p[0]!=m[0]||p[1]!=m[1])&&t(p[0],p[1],m[0],m[1],p[0]+d[0],p[1]+d[1])&&t(p[0],p[1],m[0],m[1],m[0]+c[0],m[1]+c[1])&&(f=2);var g=new i(f);for(s=d.length,a=0;f>a;a+=1){for(l=[],o=a/(f-1),h=0,r=0;s>r;r+=1)n=Math.pow(1-o,3)*p[r]+3*Math.pow(1-o,2)*o*(p[r]+d[r])+3*(1-o)*Math.pow(o,2)*(m[r]+c[r])+Math.pow(o,3)*m[r],l.push(n),null!==y&&(h+=Math.pow(l[r]-y[r],2));h=Math.sqrt(h),u+=h,g.points[a]={partialLength:h,cumulatedLength:u,point:l},y=l}g.segmentLength=u,e.bezierData=g}function s(t,e){var a=e.segments,i=a.length,r=Math.floor((i-1)*t),s=t*e.addedLength,n=0;if(s==a[r].l)return a[r].p;for(var o=a[r].l>s?-1:1,h=!0;h;)a[r].l<=s&&a[r+1].l>s?(n=(s-a[r].l)/(a[r+1].l-a[r].l),h=!1):r+=o,(0>r||r>=i-1)&&(h=!1);return a[r].p+(a[r+1].p-a[r].p)*n}function n(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function o(t,e,a,i,r,o,h){var l=new n;r=0>r?0:r;var p=s(r,h);o=o>1?1:o;var m,d=s(o,h),c=t.length,f=1-p,u=1-d;for(m=0;c>m;m+=1)l.pt1[m]=f*f*f*t[m]+(p*f*f+f*p*f+f*f*p)*a[m]+(p*p*f+f*p*p+p*f*p)*i[m]+p*p*p*e[m],l.pt3[m]=f*f*u*t[m]+(p*f*u+f*p*u+f*f*d)*a[m]+(p*p*u+f*p*d+p*f*d)*i[m]+p*p*d*e[m],l.pt4[m]=f*u*u*t[m]+(p*u*u+f*d*u+f*u*d)*a[m]+(p*d*u+f*d*d+p*u*d)*i[m]+p*d*d*e[m],l.pt2[m]=u*u*u*t[m]+(d*u*u+u*d*u+u*u*d)*a[m]+(d*d*u+u*d*d+d*u*d)*i[m]+d*d*d*e[m];return l}var h=[],l=Math,p=function(){var e={};return function(a,i,r,s){var n=(a.join("_")+"_"+i.join("_")+"_"+r.join("_")+"_"+s.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,m,d,c=100,f=0,u=[],y=[],g={addedLength:0,segments:[]};for((a[0]!=i[0]||a[1]!=i[1])&&t(a[0],a[1],i[0],i[1],r[0],r[1])&&t(a[0],a[1],i[0],i[1],s[0],s[1])&&(c=2),l=r.length,o=0;c>o;o+=1){for(m=o/(c-1),d=0,h=0;l>h;h+=1)p=Math.pow(1-m,3)*a[h]+3*Math.pow(1-m,2)*m*r[h]+3*(1-m)*Math.pow(m,2)*s[h]+Math.pow(m,3)*i[h],u[h]=p,null!==y[h]&&(d+=Math.pow(u[h]-y[h],2)),y[h]=u[h];d&&(d=Math.sqrt(d),f+=d),g.segments.push({l:f,p:m})}return g.addedLength=f,e[n]=g,g}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:p,getNewSegment:o,buildBezierData:r}}function dataFunctionManager(){function t(t,e,a){var i,r=h(t,e,a),s=[];for(i=0;e>i;i+=1)s.push(Math.floor(r[i]*x));return s}function e(t,e){var a,i,r,s=t.length;for(a=0;s>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(r=t[a].s.length,i=0;r>i;i+=1)t[a].s[i]*=e,void 0!==t[a].e&&(t[a].e[i]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function a(n,h){h||(h=n);var l,p,m,d,c,f,u,y,g,v,x=n.length;for(f=0;x>f;f+=1){if(m=n[f],l=m.outPoint-m.startTime,p=m.startTime,m.layerName=o(m.layerName),m.parent&&(m.parent=o(m.parent)),m.tt&&(n[f-1].td=m.tt),m.renderedFrame={},m.renderedData={},d=[],c=-1,m.tm&&(m.trmp=m.tm,m.tm=t(m.tm,l,p)),m.ks.o instanceof Array?e(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?e(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?e(m.ks.r,E):m.ks.r*=E,m.hasMask){var b=m.masksProperties;for(y=b.length,u=0;y>u;u+=1)if(b[u].pt.i)s(b[u].pt);else for(v=b[u].pt.length,g=0;v>g;g+=1)b[u].pt[g].s&&s(b[u].pt[g].s[0]),b[u].pt[g].e&&s(b[u].pt[g].e[0])}"PreCompLayer"==m.type?m.refId&&!m.layers?m.layers=i(m.refId,h):a(m.layers,h):"ShapeLayer"==m.type&&r(m.shapes)}}function i(t,e,a){a||(a=e);var r,s=e.length;for(r=0;s>r;r+=1){if(e[r].compId==t)return e[r].layers||(e[r].layers=i(e[r].refId,a)),e[r].layers;if("PreCompLayer"==e[r].type){var n=i(t,e[r].layers,a);if(n)return n}}return null}function r(t,a){var i,n,o,h,l=t.length,p=a?a:!1;for(i=l-1;i>=0;i-=1)if(t[i].renderedData=[],"tm"==t[i].ty&&(p=!0),"fl"==t[i].ty||"st"==t[i].ty)t[i].o instanceof Array?e(t[i].o,.01):t[i].o*=.01;else if("sh"==t[i].ty)if(t[i].trimmed=p,t[i].ks.i)s(t[i].ks);else for(o=t[i].ks.length,n=0;o>n;n+=1)t[i].ks[n].s&&(s(t[i].ks[n].s[0]),s(t[i].ks[n].e[0]));else"gr"==t[i].ty?r(t[i].it,p):"tr"==t[i].ty?(h=t[i],h.renderedData=[],h.o instanceof Array?e(h.o,.01):h.o/=100,h.s instanceof Array?e(h.s,.01):h.s/=100,h.r instanceof Array?e(h.r,E):h.r*=E):"rc"==t[i].ty&&(t[i].trimmed=p,t[i].trimmed=!0)}function s(t){var e,a=t.i.length;for(e=0;a>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function n(t){C[t._id]={data:t,renderedFrames:[]},x=t.animation.frameRate,a(t.animation.layers)}function o(t){return t=t.replace(/ /g,"_"),t=t.replace(/-/g,"_"),t=t.replace(/\./g,"_"),t=t.replace(/\//g,"_")}function h(t,e,a){var i,r,s=[];if(!(t instanceof Array)||null===t[0].t)return s.push(t),s;var n,o;s=[];var h,l,p,m=[];r=t.length;var d,c,f;for(i=0;r>i;i+=1)n=t[i],n.t-=a;var u=0,y=0;for(i=0;e>i;i+=1){h=u;for(var g=!1;r-1>h;){if(n=t[h],o=t[h+1],i<n.t&&0===h){for(p=n.s.length,m=[],l=0;p>l;l+=1)m.push(n.s[l]);s.push(m),g=!0,u!=h&&(u=h,y=0);break}if(i>=n.t&&i<o.t){if(m=[],n.to){d=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y)("",i-n.t,0,1,o.t-n.t),c=n.bezierData;var v,x,b=c.segmentLength*d;for(l=y;l<c.points.length;){if(0===i||0===b||0===d){m=c.points[l].point,y=l;break}if(l==c.points.length-1)m=c.points[l].point;else if(b>c.points[l].partialLength&&b<c.points[l+1].partialLength){for(v=c.points[l].point.length,x=(b-c.points[l].partialLength)/(c.points[l+1].partialLength-c.points[l].partialLength),f=0;v>f;f+=1)m.push(c.points[l].point[f]+(c.points[l+1].point[f]-c.points[l].point[f])*x);y=l;break}l+=1}}else{var C,E,D,w;n.s.forEach(function(t,e){if(1!==n.h&&(n.o.x instanceof Array?(C=n.o.x[e],E=n.o.y[e],D=n.i.x[e],w=n.i.y[e]):(C=n.o.x,E=n.o.y,D=n.i.x,w=n.i.y),d=bez.getEasingCurve(C,E,D,w)("",i-n.t,0,1,o.t-n.t)),t.i){var a={i:[],o:[],v:[]};t.i.forEach(function(i,r){var s=[],o=[],h=[];i.forEach(function(a,i){1===n.h?(s.push(a),o.push(t.o[r][i]),h.push(t.v[r][i])):(s.push(a+(n.e[e].i[r][i]-a)*d),o.push(t.o[r][i]+(n.e[e].o[r][i]-t.o[r][i])*d),h.push(t.v[r][i]+(n.e[e].v[r][i]-t.v[r][i])*d))}),a.i.push(s),a.o.push(o),a.v.push(h)}),m.push(a)}else m.push(1===n.h?t:t+(n.e[e]-t)*d)})}s.push(m),g=!0,u!=h&&(u=h,y=0);break}h+=1}g===!1&&(n=t[t.length-2],m=[],n.e.forEach(function(t){m.push(t)}),s.push(m))}for(h=s.length;e>h;)s.push(m),h+=1;return s}function l(t,e,a,i){var r,s,n,o,h,l;if(!t.length)return"p"==i.type?(S.px=t,S.py=t):"s"==i.type?(S.sx=t,S.sy=t):("r"==i.type||"px"==i.type||"py"==i.type)&&(S[i.type]=t),i.toArray?[t]:t;if(void 0===t[0].t)return"p"==i.type?(S.px=t[0],S.py=t[1]):"s"==i.type?(S.sx=t[0],S.sy=t[1]):("r"==i.type||"px"==i.type||"py"==i.type)&&(S[i.type]=t[0]),t;h=0,l=t.length-1;for(var p=1,m=!0;!(!m||(r=t[h],s=t[h+1],h==l-1&&e>=s.t-a)||s.t-a>e&&1==p);){if(s.t-a<e&&-1==p){h+=1,r=t[h],s=t[h+1];break}l-1>h&&1==p||h>0&&-1==p?h+=p:m=!1}r.to&&!r.bezierData&&bez.buildBezierData(r);var d,c,f,u,y,g=0;if("default"==i.type&&(n=[]),r.to){if(o=r.bezierData,e>=s.t-a)return"p"==i.type?(S.px=o.points[o.points.length-1].point[0],S.py=o.points[o.points.length-1].point[1]):"s"==i.type?(S.sx=o.points[o.points.length-1].point[0],S.sy=o.points[o.points.length-1].point[1]):("r"==i.type||"px"==i.type||"py"==i.type)&&(S[i.type]=o.points[o.points.length-1].point[0]),o.points[o.points.length-1].point;if(e<r.t-a)return"p"==i.type?(S.px=o.points[0].point[0],S.py=o.points[0].point[1]):"s"==i.type?(S.sx=o.points[0].point[0],S.sy=o.points[0].point[1]):("r"==i.type||"px"==i.type||"py"==i.type)&&(S[i.type]=o.points[0].point[0]),o.points[0].point;r.__fnct?y=r.__fnct:(y=bez.getEasingCurve(r.o.x,r.o.y,r.i.x,r.i.y,r.n),r.__fnct=y),f=y("",e-(r.t-a),0,1,s.t-a-(r.t-a));var v,x=o.segmentLength*f,b=0;for(p=1,m=!0,u=o.points.length;m;){if(b+=o.points[g].partialLength*p,0===x||0===f){"p"==i.type?(S.px=o.points[g].point[0],S.py=o.points[g].point[1]):"s"==i.type?(S.sx=o.points[g].point[0],S.sy=o.points[g].point[1]):"r"==i.type||"px"==i.type||"py"==i.type?S[i.type]=o.points[g].point[0]:n=o.points[g].point;break}if(g==o.points.length-1){"p"==i.type?(S.px=o.points[g].point[0],S.py=o.points[g].point[1]):"s"==i.type?(S.sx=o.points[g].point[0],S.sy=o.points[g].point[1]):"r"==i.type||"px"==i.type||"py"==i.type?S[i.type]=o.points[g].point[0]:n=o.points[g].point;break}if(x>b&&x<b+o.points[g+1].partialLength){if(v=(x-b)/o.points[g+1].partialLength,"p"==i.type)S.px=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,S.py=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("s"==i.type)S.sx=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,S.sy=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("r"==i.type||"px"==i.type||"py"==i.type)S[i.type]=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v;else for(c=o.points[g].point.length,d=0;c>d;d+=1)n.push(o.points[g].point[d]+(o.points[g+1].point[d]-o.points[g].point[d])*v);break}u-1>g&&1==p||g>0&&-1==p?g+=p:m=!1}}else{var C,E,D,w,M=!1;for(l=r.s.length,h=0;l>h;h+=1)1!==r.h&&(r.o.x instanceof Array?(M=!0,C=r.o.x[h]?r.o.x[h]:r.o.x[0],E=r.o.y[h]?r.o.y[h]:r.o.y[0],D=r.i.x[h]?r.i.x[h]:r.i.x[0],w=r.i.y[h]?r.i.y[h]:r.i.y[0],r.__fnct||(r.__fnct=[])):(M=!1,C=r.o.x,E=r.o.y,D=r.i.x,w=r.i.y),M?r.__fnct[h]?y=r.__fnct[h]:(y=bez.getEasingCurve(C,E,D,w),r.__fnct[h]=y):r.__fnct?y=r.__fnct:(y=bez.getEasingCurve(C,E,D,w),r.__fnct=y),f=e>=s.t-a?1:e<r.t-a?0:y("",e-(r.t-a),0,1,s.t-a-(r.t-a))),1===r.h?"p"==i.type?0===h?S.px=r.s[h]:1==h&&(S.py=r.s[h]):"s"==i.type?0===h?S.sx=r.s[h]:1==h&&(S.sy=r.s[h]):"px"==i.type||"py"==i.type||"r"==i.type?S[i.type]=r.s[h]:n.push(r.s[h]):"p"==i.type?0===h?S.px=r.s[h]+(r.e[h]-r.s[h])*f:1==h&&(S.py=r.s[h]+(r.e[h]-r.s[h])*f):"s"==i.type?0===h?S.sx=r.s[h]+(r.e[h]-r.s[h])*f:1==h&&(S.sy=r.s[h]+(r.e[h]-r.s[h])*f):"px"==i.type||"py"==i.type||"r"==i.type?S[i.type]=r.s[h]+(r.e[h]-r.s[h])*f:n.push(r.s[h]+(r.e[h]-r.s[h])*f)}return n}function p(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,i=t.v,r=t.o,s=t.i,n=i.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(i[a],i[a+1],r[a],s[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(i[a],i[0],r[a],s[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function m(t,e,a,i,r,s){var n=s&&s.length>0,o={};o.closed=r?t.cl:t.closed;var h=r?t.pt:t.ks;if(h.v)return o.pathNodes=n?w(h,o.closed,s,!1):h,o;t={i:[],o:[],v:[]};var l,p,m,d,c,f,u,y=[];if(e<h[0].t-a){if(!h.__minValue){for(p=h[0].s[0].i.length,l=0;p>l;l+=1){for(c=[],f=[],u=[],d=h[0].s[0].i[l].length,m=0;d>m;m+=1)c.push(h[0].s[0].i[l][m]),f.push(h[0].s[0].o[l][m]),u.push(h[0].s[0].v[l][m]);t.i.push(c),t.o.push(f),t.v.push(u)}y.push(t),h.__minValue=y[0]}return o.pathNodes=n?w(h.__minValue,o.closed,s,!1):h.__minValue,o}if(e>h[h.length-1].t-a){if(!h.__maxValue){var g=h.length-2;for(p=h[g].s[0].i.length,l=0;p>l;l+=1){for(c=[],f=[],u=[],d=h[g].s[0].i[l].length,m=0;d>m;m+=1)c.push(h[g].e[0].i[l][m]),f.push(h[g].e[0].o[l][m]),u.push(h[g].e[0].v[l][m]);t.i.push(c),t.o.push(f),t.v.push(u)}y.push(t),h.__maxValue=y[0]}return o.pathNodes=n?w(h.__maxValue,o.closed,s,!1):h.__maxValue,o}for(var v,x,b=0,C=h.length-1,E=1,D=!0;D&&(v=h[b],x=h[b+1],!(x.t-a>e&&1==E));)C-1>b&&1==E||b>0&&-1==E?b+=E:D=!1;var S,M,F,I,A;if(1!==v.h){S=v.o.x,M=v.o.y,F=v.i.x,I=v.i.y;var P;v.__fnct?P=v.__fnct:(P=bez.getEasingCurve(S,M,F,I),v.__fnct=P),A=P("",e-(v.t-a),0,1,x.t-a-(v.t-a)),e>=x.t-a?A=1:e<v.t-a&&(A=0)}if(1===v.h&&v.__hValue)y.push(v.__hValue);else for(t={i:[],o:[],v:[]},p=v.s[0].i.length,l=0;p>l;l+=1){for(c=[],f=[],u=[],d=v.s[0].i[l].length,m=0;d>m;m+=1)1===v.h?(c.push(v.s[0].i[l][m]),f.push(v.s[0].o[l][m]),u.push(v.s[0].v[l][m])):(c.push(v.s[0].i[l][m]+(v.e[0].i[l][m]-v.s[0].i[l][m])*A),f.push(v.s[0].o[l][m]+(v.e[0].o[l][m]-v.s[0].o[l][m])*A),u.push(v.s[0].v[l][m]+(v.e[0].v[l][m]-v.s[0].v[l][m])*A));t.i.push(c),t.o.push(f),t.v.push(u),1===v.h&&(v.__hValue=t),y.push(t)}return o.pathNodes=n?w(y[0],o.closed,s,!1):y[0],o}function d(t,e,a){var i,r,s,n,o,h,p,c,u,y=t.length;for(c=0;y>c;c+=1)if(u=t[c],n=e-u.startTime,!u.an[n]){if(i={},D.arrayFlag=!1,D.type="default",i.a=l(u.ks.a,n,u.startTime,D),i.o=l(u.ks.o,n,u.startTime,D),D.arrayFlag=!1,u.ks.p.s?(D.type="px",l(u.ks.p.x,n,u.startTime,D),D.type="py",l(u.ks.p.y,n,u.startTime,D)):(D.type="p",l(u.ks.p,n,u.startTime,D)),D.arrayFlag=!0,D.type="r",l(u.ks.r,n,u.startTime,D),D.arrayFlag=!0,D.type="s",l(u.ks.s,n,u.startTime,D),p={},p.an={tr:i},D.arrayFlag=!1,D.type="default",p.an.matrixArray="canvas"==a?b.getMatrixArrayFromParams(S.r,S.sx,S.sy,S.px,S.py):b.getMatrixArrayFromParams(S.r,S.sx,S.sy,S.px,S.py),u.renderedData[n]=p,u.hasMask){r=u.masksProperties,h=r.length;var g;for(o=0;h>o;o+=1)if(r[o].paths||(r[o].paths=[],r[o].opacity=[]),"f"==r[o].mode&&o>0&&"svg"==a){var v=g.paths[n];v.pathNodes=v.pathNodes.constructor===Array?v.pathNodes:[v.pathNodes],v.pathNodes.push(m(r[o],n,u.startTime,a,!0).pathNodes)}else r[o].paths[n]=m(r[o],n,u.startTime,a,!0),r[o].opacity[n]=l(r[o].o,n,u.startTime,D),r[o].opacity[n]=r[o].opacity[n]instanceof Array?r[o].opacity[n][0]/100:r[o].opacity[n]/100,g=r[o]}e<u.inPoint||e>u.outPoint||("PreCompLayer"==u.type?(s=u.tm?u.tm[n]<0?0:n>=u.tm.length?u.tm[u.tm.length-1]:u.tm[n]:n,void 0===s&&(s=l(u.trmp,n,0,D)[0]*x,u.tm[n]=s),d(u.layers,s,a)):"ShapeLayer"==u.type&&f(u.shapes,n,u.startTime,a))}}function c(t,e,a){var i=new Array(8),r=new Array(8),s=new Array(8),n=a/2;return a*=1,i[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],s[0]=i[0],r[0]=[t[0]+e[0]/2,t[1]-e[1]/2+n],i[1]=[t[0]+e[0]/2,t[1]+e[1]/2-a],s[1]=[t[0]+e[0]/2,t[1]+e[1]/2-n],r[1]=i[1],i[2]=[t[0]+e[0]/2-a,t[1]+e[1]/2],s[2]=i[2],r[2]=[t[0]+e[0]/2-n,t[1]+e[1]/2],i[3]=[t[0]-e[0]/2+a,t[1]+e[1]/2],s[3]=[t[0]-e[0]/2+n,t[1]+e[1]/2],r[3]=i[3],i[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],s[4]=i[4],r[4]=[t[0]-e[0]/2,t[1]+e[1]/2-n],i[5]=[t[0]-e[0]/2,t[1]-e[1]/2+a],s[5]=[t[0]-e[0]/2,t[1]-e[1]/2+n],r[5]=i[5],i[6]=[t[0]-e[0]/2+a,t[1]-e[1]/2],s[6]=i[6],r[6]=[t[0]-e[0]/2+n,t[1]-e[1]/2],i[7]=[t[0]+e[0]/2-a,t[1]-e[1]/2],s[7]=[t[0]+e[0]/2-n,t[1]-e[1]/2],r[7]=i[7],{v:i,o:s,i:r,c:!0}}function f(t,e,a,i,r){var s,n,o,h,p,d,y,g,v,x,C=t.length;r||(r=[]);var E,M,F,I,A;for(s=C-1;s>=0;s-=1)if(n=t[s],"sh"==n.ty)n.renderedData[e]={path:m(n,e,a,i,!1,r)};else if("fl"==n.ty)o=l(n.c,e,a,D),h=l(n.o,e,a,D),n.renderedData[e]={opacity:h instanceof Array?h[0]:h},"canvas"==i?(u(o),n.renderedData[e].color=o):n.renderedData[e].color=rgbToHex(Math.round(o[0]),Math.round(o[1]),Math.round(o[2]));else if("rc"==n.ty)p=l(n.p,e,a,D),d=l(n.s,e,a,D),y=l(n.r,e,a,D),n.trimmed?(n.renderedData[e]={path:{closed:!0}},n.renderedData[e].path.pathNodes=w(c(p,d,y),!0,r,!1)):n.renderedData[e]={position:p,size:d,roundness:y};else if("el"==n.ty){if(p=l(n.p,e,a,D),d=l(n.s,e,a,D),n.renderedData[e]={p:p,size:d},"svg"==i){var P={v:new Array(4),i:new Array(4),o:new Array(4)};P.v[0]=[p[0],p[1]-d[1]/2],P.o[0]=[p[0]-d[0]/2*.55,p[1]-d[1]/2],P.i[0]=[p[0]+d[0]/2*.55,p[1]-d[1]/2],P.v[1]=[p[0]-d[0]/2,p[1]],P.o[1]=[p[0]-d[0]/2,p[1]+d[1]/2*.55],P.i[1]=[p[0]-d[0]/2,p[1]-d[1]/2*.55],P.v[2]=[p[0],p[1]+d[1]/2],P.o[2]=[p[0]+d[0]/2*.55,p[1]+d[1]/2],P.i[2]=[p[0]-d[0]/2*.55,p[1]+d[1]/2],P.v[3]=[p[0]+d[0]/2,p[1]],P.o[3]=[p[0]+d[0]/2,p[1]-d[1]/2*.55],P.i[3]=[p[0]+d[0]/2,p[1]+d[1]/2*.55],n.renderedData[e].path={pathNodes:P},n.closed=!0}}else if("st"==n.ty){if(g=l(n.c,e,a,D),v=l(n.o,e,a,D),x=l(n.w,e,a,D),n.renderedData[e]={opacity:v instanceof Array?v[0]:v,width:x instanceof Array?x[0]:x},n.d){var T=[];A=n.d.length;var _;for(I=0;A>I;I+=1)_=l(n.d[I].v,e,a,D),T.push({v:_ instanceof Array?_[0]:_,n:n.d[I].n});n.renderedData[e].dashes=T}"canvas"==i?(u(g),n.renderedData[e].color=g):n.renderedData[e].color=rgbToHex(Math.round(g[0]),Math.round(g[1]),Math.round(g[2]))}else if("tr"==n.ty)n.renderedData[e]={a:l(n.a,e,a,D),o:l(n.o,e,a,D)},D.arrayFlag=!0,D.type="s",l(n.s,e,a,D),D.arrayFlag=!0,D.type="r",l(n.r,e,a,D),D.arrayFlag=!1,D.type="p",l(n.p,e,a,D),D.arrayFlag=!1,D.type="default",n.renderedData[e].mtArr="canvas"==i?b.getMatrixArrayFromParams(S.r,S.sx,S.sy,S.px,S.py):b.getMatrixArrayFromParams(S.r,S.sx,S.sy,S.px,S.py);else if("tm"==n.ty){E=l(n.s,e,a,D),M=l(n.e,e,a,D),F=l(n.o,e,a,D);var k={s:E,e:M,o:F};r.push(k),n.renderedData[e]=k}else"gr"==n.ty&&f(n.it,e,a,i,r)}function u(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function y(t,e){for(var a=1;a>0;){if(e+=1,e>=t.data.animation.totalFrames){t.renderFinished=!0;break}t.renderedFrames[e]||(g(t.data._id,e),a-=1)}}function g(t,e){return 2==C[t].renderedFrames[e]?void(C[t].renderFinished||y(C[t],e)):(x=C[t].data.animation.frameRate,C[t].renderedFrames[e]=2,void d(C[t].data.animation.layers,e,C[t].data._animType))}function v(t){var e,a=C[t].data,i=a.animation.totalFrames,r=[];for(e=0;i>e;e+=1)r.push({num:e,data:g(t,e)})}var x=0,b=new MatrixManager,C={},E=Math.PI/180,D={arrayFlag:!1},w=function(){function t(t,s,n,p){i[o]=s,e[o+1]=n,a[o+1]=p,h?a[o]=t:(l+=" M"+t.join(","),h=!0,r[o]=t),l+=" C"+s.join(",")+" "+n.join(",")+" "+p.join(","),o+=1}var e,a,i,r,s,n,o,h=!1,l="";return function(m,d,c,f){p(m,d);var u,y=c.length,g=m;a=e=i=r=null;var v,x,b,C,E;for(u=y-1;u>=0;u-=1){var D=[],w=c[u].o%360/360;if(0!==w||0!==c[u].s||100!=c[u].e){l="",h=!1,e=[],i=[],a=[],r=[],s=[],n=0,0>w&&(w+=1);var S=c[u].s/100+w,M=c[u].e/100+w;if(S==M)return f?"":{};if(S>M){var F=S;S=M,M=F}1>=M?D.push({s:g.__totalLength*S,e:g.__totalLength*M}):S>=1?D.push({s:g.__totalLength*(S-1),e:g.__totalLength*(M-1)}):(D.push({s:g.__totalLength*S,e:g.__totalLength}),D.push({s:0,e:g.__totalLength*(M-1)})),v=[],x=[],b=[];var I;v=g.v,x=g.o,b=g.i,I=g.__lengths,E=v.length;var A,P,T=0,_=0,k=D.length;for(o=0,A=0;k>A;A+=1){for(T=0,C=1;E>C;C++)if(_=I[C-1].addedLength,T+_<D[A].s)T+=_;else{if(T>D[A].e)break;D[A].s<=T&&D[A].e>=T+_?t(v[C-1],x[C-1],b[C],v[C],I[C-1]):(P=bez.getNewSegment(v[C-1],v[C],x[C-1],b[C],(D[A].s-T)/_,(D[A].e-T)/_,I[C-1]),t(P.pt1,P.pt3,P.pt4,P.pt2)),T+=_}d!==!1?T<=D[A].e&&(_=I[C-1].addedLength,D[A].s<=T&&D[A].e>=T+_?t(v[C-1],x[C-1],b[0],v[0],I[C-1]):(P=bez.getNewSegment(v[C-1],v[0],x[C-1],b[0],(D[A].s-T)/_,(D[A].e-T)/_,I[C-1]),t(P.pt1,P.pt3,P.pt4,P.pt2))):h=!1}d=!1}}if(a?(v=a,x=i,b=e):(v=g.v,x=g.o,b=g.i,r=[]),E=v.length,f){for(l="",C=1;E>C;C++)r[C-1]?l+="M"+r[C-1].join(","):1==C&&(l+="M"+v[0].join(",")),l+=" C"+x[C-1].join(",")+" "+b[C].join(",")+" "+v[C].join(",");return d!==!1&&(l+=" C"+x[C-1].join(",")+" "+b[0].join(",")+" "+v[0].join(",")),l}return{i:b,o:x,v:v,s:r,c:d}}}(),S={r:0,sx:1,sy:1,px:1,py:1},M={};return M.completeData=n,M.renderFrame=g,M.renderAllFrames=v,M}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[]}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig=e?e:{clearCanvas:!0,context:null,scaleMode:"fit"},this.lastFrame=-1,this.globalData={frameNum:-1},this.contextData={saved:new Array(15),savedOp:new Array(15),cArrPos:0,cTr:new Matrix,cO:1};var a,i=15;for(a=0;i>a;a+=1)this.contextData.saved[a]=new Array(6);this.elements=[]}function MaskElement(t){this.data=null,this.element=null,this.globalData=t,this.paths=[]}function ICompElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i),this.layers=t.layers}function IImageElement(t,e,a,i){this.animationItem=e,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e,a,i)}function IShapeElement(t,e,a,i){this.shapes=[],this.parent.constructor.call(this,t,e,a,i)}function ShapeItemElement(t,e,a){this.stylesList=[],this.viewData=[],this.shape=e,this.data=t,this.globalData=a,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function ITextElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function CVBaseElement(t,e){this.data=t,this.globalData=e,this.canvasContext=e.canvasContext,this.currentAnimData=null,this.renderFrame=!1,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,opacity:1},this.init()}function CVCompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function CVImageElement(t,e){this.animationItem=e.renderer.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,a){this.data=t,this.globalData=a,this.canvasContext=a.canvasContext,this.frameNum=-1,this.dataLength=this.data.length,this.mainFlag=e,this.stylesList=[],this.ownStylesList=[],this.stylesPool=[],this.currentStylePoolPos=0,this.transform={opacity:1,mat:new Matrix},this.mat=new Matrix;var i,r=this.dataLength-1;this.renderedPaths=new Array(this.globalData.totalFrames);var s;for(i=r;i>=0;i-=1)"gr"==this.data[i].ty?this.data[i].item=new CVShapeItemElement(this.data[i].it,!1,this.globalData):("st"==this.data[i].ty||"fl"==this.data[i].ty)&&(s={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[i].ty?s.type="fill":(s.type="stroke",s.width=0),this.stylesPool.push(s))}function CVSolidElement(t,e){this.parent.constructor.call(this,t,e)}function CVTextElement(t,e){this.parent.constructor.call(this,t,e)}function CVMaskElement(){}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,s){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=i,this.props[4]=r,this.props[5]=s,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,s){return this.a1=this.props[0],this.b1=this.props[1],this.c1=this.props[2],this.d1=this.props[3],this.e1=this.props[4],this.f1=this.props[5],this.props[0]=this.a1*t+this.c1*e,this.props[1]=this.b1*t+this.d1*e,this.props[2]=this.a1*a+this.c1*i,this.props[3]=this.b1*a+this.d1*i,this.props[4]=this.a1*r+this.c1*s+this.e1,this.props[5]=this.b1*r+this.d1*s+this.f1,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,s=t.e,n=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*n-r*s)/h,o.f=-(e*n-a*s)/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,s=i.decompose(),n=t.decompose(),o=s.rotation+(n.rotation-s.rotation)*e,h=s.translate.x+(n.translate.x-s.translate.x)*e,l=s.translate.y+(n.translate.y-s.translate.y)*e,p=s.scale.x+(n.scale.x-s.scale.x)*e,m=s.scale.y+(n.scale.y-s.scale.y)*e;return r.translate(h,l),r.rotate(o),r.scale(p,m),r._x()},decompose:function(t){var e=this.props[0],a=this.props[1],i=this.props[2],r=this.props[3],s=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},p=0,m={x:1,y:1},d={x:0,y:0},c=e*r-a*i;if(t)e?(d={x:n(i/e),y:n(a/e)},m={x:e,y:c/e}):a?(p=.5*h,m={x:a,y:c/a},d.x=n(r/a)):(m={x:i,y:r},d.x=.25*h);else if(e||a){var f=o(e*e+a*a);p=a>0?s(e/f):-s(e/f),m={x:f,y:c/f},d.x=n((e*i+a*r)/(f*f))}else if(i||r){var u=o(i*i+r*r);p=.5*h-(r>0?s(-i/u):-s(i/u)),m={x:c/u,y:u},d.y=n((e*i+a*r)/(u*u))}else m={x:0,y:0};return{scale:m,translate:l,rotation:p,skew:d}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){return{x:t*this.props[0]+e*this.props[2]+this.props[4],y:t*this.props[1]+e*this.props[3]+this.props[5]}},applyToPointStringified:function(t,e){return t*this.props[0]+e*this.props[2]+this.props[4]+","+(t*this.props[1]+e*this.props[3]+this.props[5])},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(a=t.length,i=0;a>i;i++)r.push(this.applyToPoint(t[i].x,t[i].y));return r},applyToTypedArray:function(t,e){for(var a,i=0,r=t.length,s=e?new Float64Array(r):new Float32Array(r);r>i;)a=this.applyToPoint(t[i],t[i+1]),s[i++]=a.x,s[i++]=a.y;return s},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.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5]]},toCSS:function(){return this.cssParts[1]=this.props.join(","),this.cssParts.join("")},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}},void 0===CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,i,r,s,n,o){this.save(),this.translate(t,e),this.rotate(r),this.scale(a,i),this.arc(0,0,1,s,n,o),this.restore()});var BM_Path2D;!function(){function t(t){if(this.ops_=[],void 0!==t)if("string"==typeof t)try{this.ops_=parser.parse(t)}catch(e){}else{if(!t.hasOwnProperty("ops_"))throw"Error: "+typeof t+"is not a valid argument to Path";this.ops_=t.ops_.slice(0)}}function e(t){return function(){var e,a=arguments.length,i=[];for(e=0;a>e;e+=1)i.push(arguments[e]);this.ops_.push({type:t,args:i})}}for(var a=CanvasRenderingContext2D.prototype,i=BM_CanvasRenderingContext2D.prototype,r=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],s=0;s<r.length;s++){var n=r[s];t.prototype[n]=e(n)}t.prototype.addPath=function(t,e){var a=!1;!e||1==e[0]&&0===e[1]&&0===e[2]&&1==e[3]&&0===e[4]&&0===e[5]||(a=!0,this.ops_.push({type:"save",args:[]}),this.ops_.push({type:"transform",args:[e[0],e[1],e[2],e[3],e[4],e[5]]})),this.ops_=this.ops_.concat(t.ops_),a&&this.ops_.push({type:"restore",args:[]})};var o=a.fill,h=a.stroke,l=a.clip;i.fill=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,i=e.ops_.length;i>a;a++){var r=e.ops_[a];"transform"==r.type?this.renderer.ctxTransform(r.args):"save"==r.type?this.renderer.save():"restore"==r.type?this.renderer.restore():this.renderer.canvasContext[r.type].apply(this.renderer.canvasContext,r.args)}i=arguments.length;var s=[];for(a=1;i>a;a+=1)s.push(arguments[a]);o.apply(this.renderer.canvasContext,s)}else o.apply(this.renderer.canvasContext,arguments)},i.stroke=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,i=e.ops_.length;i>a;a++){var r=e.ops_[a];this.renderer.canvasContext[r.type].apply(this.renderer.canvasContext,r.args)
}h.call(this.renderer.canvasContext)}else h.call(this.renderer.canvasContext)},i.clip=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,i=e.ops_.length;i>a;a++){var r=e.ops_[a];this.renderer.canvasContext[r.type].apply(this.renderer.canvasContext,r.args)}i=arguments.length;var s=[];for(a=1;i>a;a+=1)s.push(arguments[a]);l.apply(this.renderer.canvasContext,s)}else l.apply(this.renderer.canvasContext,arguments)},BM_Path2D=t}();var MatrixManager=matrixManagerFunction;!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,cachedColors={},rgbToHex=function(){var t,e,a=[];for(t=0;256>t;t+=1)e=t.toString(16),a[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+a[t]+a[e]+a[i]}}(),fillColorToString=function(){var t=[];return function(e,a){return t[e[0]]||(t[e[0]]=[]),t[e[0]][e[1]]||(t[e[0]][e[1]]=[]),t[e[0]][e[1]][e[2]]||(void 0!==a&&(e[3]=a),t[e[0]][e[1]][e[2]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.buildItems=function(t,e,a){var i,r=0,s=t.length;for(a||(a=this.elements),e||(e=this.animationItem.container),i=s-1;i>=0;i--){if("StillLayer"==t[i].type)r++,a[i]=this.createImage(t[i],e);else if("PreCompLayer"==t[i].type){a[i]=this.createComp(t[i],e);var n=[];this.buildItems(t[i].layers,a[i].getDomElement(),n),a[i].setElements(n)}else a[i]="SolidLayer"==t[i].type?this.createSolid(t[i],e):"ShapeLayer"==t[i].type?this.createShape(t[i],e):"TextLayer"==t[i].type?this.createText(t[i],e):this.createBase(t[i],e);t[i].td&&a[i+1].setMatte(a[i].layerId)}},SVGRenderer.prototype.createBase=function(t,e){return new BaseElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e){return new IShapeElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createText=function(t,e){return new ITextElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createImage=function(t,e){return new IImageElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createComp=function(t,e){return new ICompElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createSolid=function(t,e){return new ISolidElement(t,this.animationItem,e,this.globalData)},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.globalData.defs=e,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,a){var i,r,s=e.length;for(a||(a=this.elements),i=s-1;i>=0;i--)r=e[i],r.parent&&this.buildItemParenting(r,a[i],e,r.parent,a),a[i].setMainElement(),"PreCompLayer"==r.type&&this.buildStage(a[i].getComposingElement(),r.layers,a[i].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,i,r){t.parents||(t.parents=[]);for(var s=0,n=a.length;n>s;){if(a[s].layerName==i){e.getHierarchy().push(r[s]),a[s].parent&&this.buildItemParenting(t,e,a,a[s].parent,r);break}s+=1}},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t){this.lastFrame=t,this.globalData.frameNum=t;var e,a=this.layers.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].startTime);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].startTime)}},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,i=0,r=t.length;for(a=0;r>a;a++)if("StillLayer"==t[a].type)i++,e.push(this.createImage(t[a]));else if("PreCompLayer"==t[a].type){e.push(this.createComp(t[a]));var s=[];this.buildItems(t[a].layers,s),e[e.length-1].setElements(s)}else e.push("SolidLayer"==t[a].type?this.createSolid(t[a]):"ShapeLayer"==t[a].type?this.createShape(t[a]):"TextLayer"==t[a].type?this.createText(t[a]):this.createBase(t[a]))},CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this.globalData)},CanvasRenderer.prototype.ctxTransform=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.transform(t[0],t[1],t[2],t[3],t[4],t[5]);this.contextData.cTr.transform(t[0],t[1],t[2],t[3],t[4],t[5]);var e=this.contextData.cTr.props;this.canvasContext.setTransform(e[0],e[1],e[2],e[3],e[4],e[5])},CanvasRenderer.prototype.ctxOpacity=function(t){return this.renderConfig.clearCanvas?(this.contextData.cO*=t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=t)},CanvasRenderer.prototype.reset=function(){return this.renderConfig.clearCanvas?(this.contextData.cArrPos=0,this.contextData.cTr.reset(),void(this.contextData.cO=1)):void this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;null===this.contextData.saved[this.contextData.cArrPos]&&(this.contextData.saved[this.contextData.cArrPos]=new Array(6));var a,i=6,r=this.contextData.saved[this.contextData.cArrPos];for(a=0;i>a;a+=1)r[a]=e[a];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRenderer.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&this.canvasContext.restore(),this.contextData.cArrPos-=1;var e,a=this.contextData.saved[this.contextData.cArrPos],i=6,r=this.contextData.cTr.props;for(e=0;i>e;e+=1)r[e]=a[e];this.canvasContext.setTransform(a[0],a[1],a[2],a[3],a[4],a[5]),a=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=a,this.canvasContext.globalAlpha=a},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(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.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.globalData.canvasContext=this.canvasContext,this.globalData.bmCtx=new BM_CanvasRenderingContext2D(this),this.globalData.renderer=this,this.globalData.totalFrames=Math.floor(t.animation.totalFrames),this.globalData.compWidth=t.animation.compWidth,this.globalData.compHeight=t.animation.compHeight,this.layers=t.animation.layers,this.transformCanvas={},this.transformCanvas.w=t.animation.compWidth,this.transformCanvas.h=t.animation.compHeight,this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;if(this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e)):(t=this.canvasContext.canvas.width,e=this.canvasContext.canvas.height),"fit"==this.renderConfig.scaleMode){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)}else this.transformCanvas.sx=1,this.transformCanvas.sy=1,this.transformCanvas.tx=0,this.transformCanvas.ty=0;this.transformCanvas.props=[this.transformCanvas.sx,0,0,this.transformCanvas.sy,this.transformCanvas.tx,this.transformCanvas.ty],this.clipper=new BM_Path2D,this.clipper.rect(0,0,this.transformCanvas.w,this.transformCanvas.h)},CanvasRenderer.prototype.buildStage=function(t,e,a){a||(a=this.elements);var i,r,s=e.length;for(i=s-1;i>=0;i--)r=e[i],r.parent&&this.buildItemHierarchy(r,a[i],e,r.parent,a),"PreCompLayer"==r.type&&this.buildStage(null,r.layers,a[i].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,i,r){for(var s=0,n=a.length;n>s;){if(a[s].layerName==i){e.getHierarchy().push(r[s]),void 0===a[s].parent||this.buildItemHierarchy(t,e,a,a[s].parent,r);break}s+=1}},CanvasRenderer.prototype.prepareFrame=function(t){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].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.elements[t].draw()},CanvasRenderer.prototype.renderFrame=function(t){(this.lastFrame!=t||this.renderConfig.clearCanvas!==!0)&&(this.lastFrame=t,this.globalData.frameNum=t-this.animationItem.firstFrame,this.renderConfig.clearCanvas===!0?(this.reset(),this.canvasContext.canvas.width=this.canvasContext.canvas.width):this.save(),this.ctxTransform(this.transformCanvas.props),this.globalData.bmCtx.clip(this.clipper),this.prepareFrame(t),this.draw(),this.renderConfig.clearCanvas!==!0&&this.restore())},MaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length;var t=this.element.maskedElement,e=this.globalData.defs,a=0,i=this.masksProperties.length;this.layerSize=this.element.getLayerSize(),this.maskElement=document.createElementNS(svgNS,"clipPath");var r,s=this.data.masksProperties;for(a=0;i>a;a++)s[a].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),"f"==s[a].mode&&a>0||(r=document.createElementNS(svgNS,"path"),s[a].cl?r.setAttribute("fill","#ffffff"):(r.setAttribute("fill","none"),r.setAttribute("stroke","#ffffff"),r.setAttribute("stroke-width","1"),r.setAttribute("stroke-miterlimit","10")),r.setAttribute("clip-rule","nonzero"),this.maskElement.appendChild(r),s[a].elem=r,s[a].lastPath="");var n=randomString(10);this.maskElement.setAttribute("id",n),t.setAttribute("clip-path","url(#"+n+")"),e.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length;for(e=0;a>e;e++)"f"==this.data.masksProperties[e].mode&&e>0||this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes)},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){var a,i,r="";if(e.constructor===Array){var s,n,o=e.length,h="";for(s=0;o>s;s+=1){if(h="",n=e[s],!n.__renderedString){for(i=n.v.length,a=1;i>a;a+=1)1==a&&(h+=" M"+n.v[0][0]+","+n.v[0][1]),h+=" C"+n.o[a-1][0]+","+n.o[a-1][1]+" "+n.i[a][0]+","+n.i[a][1]+" "+n.v[a][0]+","+n.v[a][1];t.cl&&(h+=" C"+n.o[a-1][0]+","+n.o[a-1][1]+" "+n.i[0][0]+","+n.i[0][1]+" "+n.v[0][0]+","+n.v[0][1]),n.__renderedString=h}r+=n.__renderedString}}else if(e.__renderedString)r=e.__renderedString;else{for(i=e.v.length,a=1;i>a;a+=1)1==a&&(r+=" M"+e.v[0][0]+","+e.v[0][1]),r+=" C"+e.o[a-1][0]+","+e.o[a-1][1]+" "+e.i[a][0]+","+e.i[a][1]+" "+e.v[a][0]+","+e.v[a][1];t.cl&&(r+=" C"+e.o[a-1][0]+","+e.o[a-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),e.__renderedString=r}t.lastPath!==r&&(t.inv?t.elem.setAttribute("d",this.solidPath+r):t.elem.setAttribute("d",r),t.lastPath=r)};var BaseElement=function(t,e,a,i){this.animationItem=e,this.globalData=i,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.matteElement=null,this.renderedFrames=[],this.lastData={},this.parentContainer=a,this.layerId=randomString(10),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.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.parentContainer.appendChild(this.matteElement)):this.parentContainer.appendChild(this.layerElement),this.maskedElement=this.layerElement):this.data.td?(this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),3==this.data.td?this.layerElement.setAttribute("mask-type","luminance"):this.layerElement.setAttribute("mask-type","alpha"),this.globalData.defs.appendChild(this.layerElement)):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.parentContainer.appendChild(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an;var e=this.currentAnimData.matrixArray;this.ownMatrix.reset().transform(e[0],e[1],e[2],e[3],e[4],e[5]).translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1])},BaseElement.prototype.renderFrame=function(t,e){if("NullLayer"!=this.data.type){if(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff&&this.effectsManager.renderFrame(t,this.currentAnimData.mk),t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o;var a,i=this.finalTransform.mat;if(e&&(a=e.mat.props,i.reset().transform(a[0],a[1],a[2],a[3],a[4],a[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var r,s=this.hierarchy.length;for(e||i.reset(),r=s-1;r>=0;r-=1)a=this.hierarchy[r].ownMatrix.props,i.transform(a[0],a[1],a[2],a[3],a[4],a[5]);a=this.ownMatrix.props,i.transform(a[0],a[1],a[2],a[3],a[4],a[5])}else this.isVisible&&(e?(a=this.ownMatrix.props,i.transform(a[0],a[1],a[2],a[3],a[4],a[5])):this.finalTransform.mat=this.ownMatrix);if(this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+i.props.join(",")+")",o:this.finalTransform.opacity});var n=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=n.tr&&(this.lastData.tr=n.tr,this.layerElement.setAttribute("transform",n.tr)),this.lastData.o!==n.o&&(this.lastData.o=n.o,this.layerElement.setAttribute("opacity",n.o))}return this.isVisible}},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.setMainElement=function(){this.mainElement=this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this},globalData:{value:this.globalData}};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}},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setMatte=function(t){this.matteElement.setAttribute("mask","url(#"+t+")")},BaseElement.prototype.hide=function(){},createElement(BaseElement,ICompElement),ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();this.hidden=!1;var i,r=this.layers.length,s=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(i=0;r>i;i+=1)this.elements[i].prepareFrame(s-this.layers[i].startTime);for(i=0;r>i;i+=1)this.data.hasMask?this.elements[i].renderFrame(s-this.layers[i].startTime):this.elements[i].renderFrame(s-this.layers[i].startTime,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},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.addEventListener("error",e,!1),a.src=this.path+this.assets[this.data.assetId].path,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.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.image.setAttribute("opacity","0"),this.hidden=!0)},IImageElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden=!1,!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.image.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.image.setAttribute("opacity",i.o))}},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.globalData)},IShapeElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);return a===!1?void this.hide():void this.renderShapes(t)},IShapeElement.prototype.hide=function(){this.hidden||(this.mainShape.hideShape(),this.hidden=!0)},IShapeElement.prototype.renderShapes=function(t){this.hidden=!1,this.data.hasMask?this.mainShape.renderShape(t,{opacity:1,mat:new Matrix}):this.mainShape.renderShape(t,this.finalTransform)},ShapeItemElement.prototype.searchShapes=function(t,e){var a,i,r,s=t.length-1,n=[];for(a=s;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){e[a]={renderedFrames:[],lastData:{c:"",o:-1,w:""}};var o=document.createElementNS(svgNS,"path");this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:""}),e[a].style=this.stylesList[this.stylesList.length-1],n.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1}};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],styles:[],lastData:{d:"",o:"",tr:""}},r=this.stylesList.length,i=0;r>i;i+=1)this.stylesList[i].closed||(e[a].styles.push(this.stylesList[i]),"st"==this.stylesList[i].type&&(this.stylesList[i].pathElement.setAttribute("fill-opacity",0),this.stylesList[i].pathElement.setAttribute("stroke-linejoin","round"),this.stylesList[i].pathElement.setAttribute("stroke-linecap","round")));for(s=n.length,a=0;s>a;a+=1)n[a].closed=!0},ShapeItemElement.prototype.getElement=function(){return this.shape},ShapeItemElement.prototype.hideShape=function(){var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)this.stylesList[t].pathElement.setAttribute("d","")},ShapeItemElement.prototype.renderShape=function(t,e,a,i){var r,s;if(!a)for(a=this.data,s=this.stylesList.length,r=0;s>r;r+=1)this.stylesList[r].d="";i||(i=this.viewData),this.frameNum=t,s=a.length-1;var n,o;for(n=e,r=s;r>=0;r-=1)if("tr"==a[r].ty){var h=a[r].renderedData[t].mtArr;if(n=i[r].transform,o=n.mat,o.reset(),e){var l=e.mat.props;n.opacity=e.opacity,n.opacity*=a[r].renderedData[t].o,o.transform(l[0],l[1],l[2],l[3],l[4],l[5])}else n.opacity=a[r].renderedData[t].o;o.transform(h[0],h[1],h[2],h[3],h[4],h[5]).translate(-a[r].renderedData[t].a[0],-a[r].renderedData[t].a[1])}else"sh"==a[r].ty?this.renderPath(a[r],i[r],t,n):"el"==a[r].ty?this.renderPath(a[r],i[r],t,n):"rc"==a[r].ty?a[r].trimmed?this.renderPath(a[r],i[r],t,n):this.renderRect(a[r],i[r],t,n):"fl"==a[r].ty?this.renderFill(a[r],i[r],t,n):"st"==a[r].ty?this.renderStroke(a[r],i[r],t,n):"gr"==a[r].ty?this.renderShape(t,n,a[r].it,i[r].it):"tm"==a[r].ty;for(s=this.stylesList.length,r=0;s>r;r+=1)this.stylesList[r].pathElement.setAttribute("d",this.stylesList[r].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,i){var r,s;if(!e.renderedFrames[this.globalData.frameNum]){var n=t.renderedData[a].path.pathNodes;if(!n.v)return;r=n.v.length;var o=n.s?n.s:[],h="";for(s=1;r>s;s+=1)o[s-1]?h+=" M"+i.mat.applyToPointStringified(o[s-1][0],o[s-1][1]):1==s&&(h+=" M"+i.mat.applyToPointStringified(n.v[0][0],n.v[0][1])),h+=" C"+i.mat.applyToPointStringified(n.o[s-1][0],n.o[s-1][1])+" "+i.mat.applyToPointStringified(n.i[s][0],n.i[s][1])+" "+i.mat.applyToPointStringified(n.v[s][0],n.v[s][1]);!t.closed||t.trimmed&&!n.c||(h+=" C"+i.mat.applyToPointStringified(n.o[s-1][0],n.o[s-1][1])+" "+i.mat.applyToPointStringified(n.i[0][0],n.i[0][1])+" "+i.mat.applyToPointStringified(n.v[0][0],n.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(r=e.styles.length,s=0;r>s;s+=1)e.styles[s].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,i){var r=t.renderedData[a],s=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:r.color,o:r.opacity*i.opacity});var n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o;e.lastData.c!=o&&s.pathElement.setAttribute("fill",o),e.lastData.o!=h&&s.pathElement.setAttribute("fill-opacity",h),e.lastData.c=o,e.lastData.o=h},ShapeItemElement.prototype.renderStroke=function(t,e,a,i){var r=t.renderedData[a],s=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:r.color,o:r.opacity*i.opacity,w:r.width},r.dashes&&(e.renderedFrames[this.globalData.frameNum].d=r.dashes));var n,o,h=e.renderedFrames[this.globalData.frameNum],l=h.c,p=h.o,m=h.w,d=h.d;if(d){var c,f=d.length;for(n="",o="",c=0;f>c;c+=1)"o"!=d[c].n?n+=" "+d[c].v:o+=d[c].v}e.lastData.c!=l&&s.pathElement.setAttribute("stroke",l),e.lastData.o!=p&&s.pathElement.setAttribute("stroke-opacity",p),e.lastData.w!=m&&s.pathElement.setAttribute("stroke-width",m),d&&(e.lastData.da!=n&&s.pathElement.setAttribute("stroke-dasharray",n),e.lastData["do"]!=o&&s.pathElement.setAttribute("stroke-dashoffset",o)),e.lastData.c=l,e.lastData.o=p,e.lastData.w=m,d&&(e.lastData.da=n,e.lastData["do"]=o)},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);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.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.rectElement.setAttribute("opacity","0"),this.hidden=!0)},ISolidElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden&&(this.lastData.o=-1,this.hidden=!1),!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.rectElement.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.rectElement.setAttribute("opacity",i.o))}},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=this.svgElem.style.webkitTransform="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.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){this.currentAnimData=this.data.renderedData[t].an;var e=this.currentAnimData.matrixArray;return this.ownMatrix.reset().transform(e[0],e[1],e[2],e[3],e[4],e[5]).translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]),this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.renderFrame=!0,this.finalTransform.opacity=1,void(this.data.hasMask&&this.maskManager.prepareFrame(t))):(this.renderFrame=!1,this.finalTransform.opacity=0,!1)},CVBaseElement.prototype.draw=function(t){if("NullLayer"!=this.data.type){if(!this.renderFrame)return!1;var e,a=(this.canvasContext,this.finalTransform.mat);if(this.finalTransform.opacity*=this.currentAnimData.tr.o,t&&(e=t.mat.props,a.reset().transform(e[0],e[1],e[2],e[3],e[4],e[5]),this.finalTransform.opacity*=t.opacity),this.hierarchy){var i,r=this.hierarchy.length;for(t||a.reset(),i=r-1;i>=0;i-=1)e=this.hierarchy[i].ownMatrix.props,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]);e=this.ownMatrix.props,a.transform(e[0],e[1],e[2],e[3],e[4],e[5])}else this.renderFrame&&(t?(e=this.ownMatrix.props,a.transform(e[0],e[1],e[2],e[3],e[4],e[5])):this.finalTransform.mat=this.ownMatrix);this.data.hasMask&&(this.globalData.renderer.save(!0),this.maskManager.draw(this.finalTransform))}},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this},globalData:{value:this.globalData}};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.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},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.elements.length,r=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.elements[a].prepareFrame(r-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(t){if(this.parent.draw.call(this,t)!==!1){var e,a=this.layers.length;for(e=a-1;e>=0;e-=1)this.elements[e].draw(this.finalTransform);this.data.hasMask&&this.globalData.renderer.restore(!0)}},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()},a=function(){t.failed=!0,t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.addEventListener("error",a,!1),this.img.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(t){if(!this.failed&&this.parent.draw.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var a=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(a),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.drawImage(this.img,0,0),this.globalData.renderer.restore(this.data.hasMask)}},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new CVShapeItemElement(this.data.shapes,!0,this.globalData)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);e!==!1&&this.mainShape.prepareFrame(t)},CVShapeElement.prototype.draw=function(t){this.parent.draw.call(this,t)!==!1&&(this.drawShapes(this.finalTransform),this.data.hasMask&&this.globalData.renderer.restore(!0))
},CVShapeElement.prototype.drawShapes=function(t){this.mainShape.renderShape(t)},CVShapeItemElement.prototype.drawPaths=function(t){var e,a;t?(a=[],e=this.stylesList):e=this.renderedPaths[this.globalData.frameNum];var i,r=e.length,s=this.canvasContext;for(this.globalData.renderer.save(),s.lineCap="round",s.lineJoin="round",i=0;r>i;i+=1)"stroke"==e[i].type?(1!=e[i].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[i].opacity)),s.strokeStyle=e[i].value,s.lineWidth=e[i].width,e[i].dasharray?(s.setLineDash(e[i].dasharray),s.lineDashOffset=e[i].dashoffset):(s.setLineDash([]),s.lineDashOffset=0),this.globalData.bmCtx.stroke(e[i].path),1!=e[i].opacity&&this.globalData.renderer.restore(),t&&(a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,width:e[i].width,path:e[i].path}),e[i].dasharray&&(a[a.length-1].dasharray=e[i].dasharray,a[a.length-1].dashoffset=e[i].dashoffset))):"fill"==e[i].type&&(1!=e[i].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[i].opacity)),s.fillStyle=e[i].value,this.globalData.bmCtx.fill(e[i].path),1!=e[i].opacity&&this.globalData.renderer.restore(),t&&a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,path:e[i].path}));this.globalData.renderer.restore(),t&&(this.renderedPaths[this.globalData.frameNum]=a)},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t;var e,a=this.dataLength-1;for(e=a;e>=0;e-=1)"gr"==this.data[e].ty&&this.data[e].item.prepareFrame(t)},CVShapeItemElement.prototype.renderShape=function(t,e){if(this.renderedPaths[this.globalData.frameNum])return void this.drawPaths(!1);this.transform.opacity=1;var a,i;for(this.ownStylesList.length=0,this.currentStylePoolPos=0,e?this.stylesList=e:this.stylesList.length=0,t?(this.transform.mat.props[0]=t.mat.props[0],this.transform.mat.props[1]=t.mat.props[1],this.transform.mat.props[2]=t.mat.props[2],this.transform.mat.props[3]=t.mat.props[3],this.transform.mat.props[4]=t.mat.props[4],this.transform.mat.props[5]=t.mat.props[5],this.transform.opacity*=t.opacity):(this.transform.mat.props[0]=this.transform.mat.props[3]=1,this.transform.mat.props[1]=this.transform.mat.props[2]=this.transform.mat.props[4]=this.transform.mat.props[5]=0),i=this.dataLength-1,a=i;a>=0;a-=1)"gr"==this.data[a].ty?this.data[a].item.renderShape(this.transform,this.stylesList):"tr"==this.data[a].ty?this.renderTransform(this.data[a]):"sh"==this.data[a].ty?this.renderPath(this.data[a]):"el"==this.data[a].ty?this.renderEllipse(this.data[a]):"rc"==this.data[a].ty?this.data[a].trimmed?this.renderPath(this.data[a]):this.renderRect(this.data[a]):"fl"==this.data[a].ty?this.renderFill(this.data[a]):"st"==this.data[a].ty&&this.renderStroke(this.data[a]);if(this.mainFlag)this.drawPaths(!0);else for(i=this.ownStylesList.length,a=0;i>a;a+=1)this.ownStylesList[a].closed=!0},CVShapeItemElement.prototype.renderTransform=function(t){var e=t.renderedData[this.frameNum],a=e.mtArr;this.transform.mat.transform(a[0],a[1],a[2],a[3],a[4],a[5]).translate(-e.a[0],-e.a[1]),this.transform.opacity*=e.o},CVShapeItemElement.prototype.renderPath=function(t){if(t.trimmed){var e=this.canvasContext;e.lineCap="round",e.lineJoin="round"}var a=t.renderedData[this.frameNum].path,i=new BM_Path2D,r=a.pathNodes;if(r instanceof Array&&(r=r[0]),r.v){var s,n=r.v.length,o=r.s?r.s:[];for(s=1;n>s;s+=1)o[s-1]?i.moveTo(o[s-1][0],o[s-1][1]):1==s&&i.moveTo(r.v[0][0],r.v[0][1]),i.bezierCurveTo(r.o[s-1][0],r.o[s-1][1],r.i[s][0],r.i[s][1],r.v[s][0],r.v[s][1]);!a.closed||t.trimmed&&!r.c||i.bezierCurveTo(r.o[s-1][0],r.o[s-1][1],r.i[0][0],r.i[0][1],r.v[0][0],r.v[0][1]),this.addPathToStyles(i)}},CVShapeItemElement.prototype.renderEllipse=function(t){var e=new BM_Path2D,a=t.renderedData[this.frameNum];e.moveTo(a.p[0]+a.size[0]/2,a.p[1]),e.ellipse(a.p[0],a.p[1],a.size[0]/2,a.size[1]/2,0,0,2*Math.PI,!1),this.addPathToStyles(e)},CVShapeItemElement.prototype.renderRect=function(t){var e=new BM_Path2D,a=t.renderedData[this.frameNum],i=a.roundness;if(0===i)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var r=a.position[0]-a.size[0]/2,s=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];i instanceof Array&&(i=i[0]),i>n/2&&(i=n/2),i>o/2&&(i=o/2),e.moveTo(r+i,s),e.lineTo(r+n-i,s),e.quadraticCurveTo(r+n,s,r+n,s+i),e.lineTo(r+n,s+o-i),e.quadraticCurveTo(r+n,s+o,r+n-i,s+o),e.lineTo(r+i,s+o),e.quadraticCurveTo(r,s+o,r,s+o-i),e.lineTo(r,s+i),e.quadraticCurveTo(r,s,r+i,s)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,i=!0,r=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>r&&this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(r=this.stylesList[e].width)):i&&"fill"==this.stylesList[e].type&&(this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(i=!1)))},CVShapeItemElement.prototype.renderFill=function(t){var e=t.renderedData[this.frameNum];return t.fillEnabled!==!1?(this.stylesPool[this.currentStylePoolPos].path=new BM_Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].opacity=this.transform.opacity,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)):(this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1))},CVShapeItemElement.prototype.renderStroke=function(t){var e=t.renderedData[this.frameNum];if(this.data.strokeEnabled!==!1){if(this.stylesPool[this.currentStylePoolPos].path=new BM_Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].width=e.width,this.stylesPool[this.currentStylePoolPos].opacity=this.transform.opacity,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),e.dashes){var a,i=e.dashes,r=i.length,s=[],n="";for(a=0;r>a;a+=1)"o"!=i[a].n?s.push(i[a].v):n=i[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=s,this.stylesPool[this.currentStylePoolPos].dashoffset=n}return this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)}this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),this.currentStylePoolPos+=1},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(t){if(this.parent.draw.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var a=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(a),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.fillStyle=this.data.color,e.fillRect(0,0,this.data.width,this.data.height),this.globalData.renderer.restore(this.data.hasMask)}},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=this.svgElem.style.webkitTransform="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.maskedElement=t},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.canvasContext,this.layerSize=this.element.getLayerSize(),this.renderedFrames=new Array(this.globalData.totalFrames+1)},CVMaskElement.prototype.prepareFrame=function(t){this.frameNum=t},CVMaskElement.prototype.draw=function(t){var e;if(this.renderedFrames[this.globalData.frameNum])e=this.renderedFrames[this.globalData.frameNum];else{var a,i=new BM_Path2D,r=this.data.masksProperties.length;for(e=new BM_Path2D,a=0;r>a;a++)this.masksProperties[a].inv&&this.createInvertedMask(i,this.data.masksProperties[a].paths[this.frameNum].pathNodes),this.drawShape(i,this.data.masksProperties[a].paths[this.frameNum].pathNodes);e.addPath(i,t.mat.props),this.renderedFrames[this.globalData.frameNum]=e}this.globalData.bmCtx.clip(e)},CVMaskElement.prototype.drawShape=function(t,e){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.o[a-1][1],e.i[a][0],e.i[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[0][0],e.i[0][1],e.v[0][0],e.v[0][1])},CVMaskElement.prototype.createInvertedMask=function(t){t.moveTo(0,0),t.lineTo(this.globalData.compWidth,0),t.lineTo(this.globalData.compWidth,this.globalData.compHeight),t.lineTo(0,this.globalData.compHeight),t.lineTo(0,0)};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;v>e;){if(u[e].elem==t&&null!==u[e].elem)return u[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),u.push({elem:t,animation:a}),v+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),u.push({elem:null,animation:e}),v+=1,e}function a(t,e){var a;for(a=0;v>a;a+=1)u[a].animation.setSpeed(t,e)}function i(t,e){var a;for(a=0;v>a;a+=1)u[a].animation.setDirection(t,e)}function r(t){var e;for(e=0;v>e;e+=1)u[e].animation.play(t)}function s(t,e){g=!1,y=Date.now();var a;for(a=0;v>a;a+=1)u[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-y;for(t=0;v>t;t+=1)u[t].animation.advanceTime(a);y=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;v>e;e+=1)u[e].animation.pause(t)}function h(t,e,a){var i;for(i=0;v>i;i+=1)u[i].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;v>e;e+=1)u[e].animation.stop(t)}function p(t){var e;for(e=0;v>e;e+=1)u[e].animation.togglePause(t)}function m(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function d(){var t;for(t=0;v>t;t+=1)u[t].animation.resize()}function c(){y=Date.now(),requestAnimationFrame(n)}var f={},u=[],y=0,g=!0,v=0;return setTimeout(c,0),f.registerAnimation=t,f.loadAnimation=e,f.setSpeed=a,f.setDirection=i,f.play=r,f.moveFrame=s,f.pause=o,f.stop=l,f.togglePause=p,f.searchAnimations=m,f.resize=d,f.start=c,f.goToAndStop=h,f}(),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.playCount=0,this.prerenderFramesFlag=!0,this.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.isScrolling=!1,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.renderedFrameCount=0,this.scaleMode="fit",this.math=Math};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),t.wrapper&&(this.wrapper=t.wrapper);var a=t.animType?t.animType:"canvas";switch(a){case"canvas":this.renderer=new CanvasRenderer(this,t.renderer);break;case"svg":this.renderer=new SVGRenderer(this,t.renderer)}if(this.animType=a,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var i=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(a){}}}},AnimationItem.prototype.setData=function(t){var e={wrapper:t},a=t.attributes;e.path=a.getNamedItem("data-animation-path")?a.getNamedItem("data-animation-path").value:a.getNamedItem("data-bm-path")?a.getNamedItem("data-bm-path").value:a.getNamedItem("bm-path")?a.getNamedItem("bm-path").value:"",e.animType=a.getNamedItem("data-anim-type")?a.getNamedItem("data-anim-type").value:a.getNamedItem("data-bm-type")?a.getNamedItem("data-bm-type").value:a.getNamedItem("bm-type")?a.getNamedItem("bm-type").value:"canvas";var i=a.getNamedItem("data-anim-loop")?a.getNamedItem("data-anim-loop").value:a.getNamedItem("data-bm-loop")?a.getNamedItem("data-bm-loop").value:a.getNamedItem("bm-loop")?a.getNamedItem("bm-loop").value:"";""===i||(e.loop="false"===i?!1:"true"===i?!0:parseInt(i)),e.name=a.getNamedItem("data-name")?a.getNamedItem("data-name").value:a.getNamedItem("data-bm-name")?a.getNamedItem("data-bm-name").value:a.getNamedItem("bm-name")?a.getNamedItem("bm-name").value:"";var r=a.getNamedItem("data-anim-prerender")?a.getNamedItem("data-anim-prerender").value:a.getNamedItem("data-bm-prerender")?a.getNamedItem("data-bm-prerender").value:a.getNamedItem("bm-prerender")?a.getNamedItem("bm-prerender").value:"";"false"===r&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.configAnimation=function(t){this.renderer.configAnimation(t),this.animationData=t,this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.animation.layers,this.assets=this.animationData.assets,this.totalFrames=this.animationData.animation.totalFrames,this.frameRate=this.animationData.animation.frameRate,this.firstFrame=Math.round(this.animationData.animation.ff*this.frameRate),this.frameMult=this.animationData.animation.frameRate/1e3,dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.animation.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){this.renderer.buildStage(this.container,this.layers),0===this.pendingElements&&(this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationID,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame)):(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()))},AnimationItem.prototype.prerenderFrames=function(t){t||(t=0),this.renderedFrameCount===Math.floor(this.totalFrames)?(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()):(dataManager.renderFrame(this.animationID,this.renderedFrameCount+this.firstFrame),this.renderedFrameCount+=1,t>10?setTimeout(this.prerenderFrames.bind(this),0):(t+=1,this.prerenderFrames(t)))},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?this.math.round(100*this.currentRawFrame)/100:this.math.floor(this.currentRawFrame),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationID,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame))},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,a){a&&this.name!=a||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},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){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.loop===!1)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause();if(this.playCount+=1,this.loop!==!0&&this.playCount==this.loop)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause()}else if(this.currentRawFrame<0)return this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1?(this.currentRawFrame=0,this.gotoFrame(),void this.pause()):(this.currentRawFrame=this.totalFrames+this.currentRawFrame,void this.gotoFrame());this.currentRawFrame=this.currentRawFrame%this.totalFrames,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},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 s(t,e){animationManager.setDirection(t,e)}function n(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function l(t){return animationManager.registerAnimation(t)}function p(){animationManager.resize()}function m(){animationManager.start()}function d(t,e,a){animationManager.goToAndStop(t,e,a)}function c(t){subframeEnabled=t}function f(t){return animationManager.loadAnimation(t)}function u(){"complete"===document.readyState&&(clearInterval(g),h())}var y={};y.play=e,y.pause=a,y.togglePause=i,y.setSpeed=r,y.setDirection=s,y.stop=n,y.moveFrame=o,y.searchAnimations=h,y.registerAnimation=l,y.loadAnimation=f,y.setSubframeRendering=c,y.resize=p,y.start=m,y.goToAndStop=d,y.checkReady=u,t.bodymovin=y;var g=setInterval(u,100)}(window);}(window));