diff --git a/build/player/bodymovin.js b/build/player/bodymovin.js
index 1c94eeb..1722751 100644
--- a/build/player/bodymovin.js
+++ b/build/player/bodymovin.js
@@ -1,3 +1,4 @@
-(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,r,s,i,n,o,h){var l,m,p,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]]),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]]),c=$M([[r,0,0,0],[0,s,0,0],[0,0,i,0],[0,0,0,1]]),f=l.x(m).x(p).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,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toCSS()},r=function(e,a,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toArray()},s=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},i=function(t,r){return r?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,r){return r?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:r(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:s,getMatrix:i,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:r,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,r="";for(a=t;a>0;--a)r+=e[Math.round(Math.random()*(e.length-1))];return r}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 RenderedFrame(t,e){this.tr=t,this.o=e}function createElement(t,e,a){if(!e){var r=Object.create(t.prototype,a),s={};return r&&"[object Function]"===s.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,r){var s={writable:!1,configurable:!1,enumerable:!1,value:a};if(r)for(var i in r)s[i]=r[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function defineAccessor(t,e,a){var r,s={enumerable:!1,configurable:!1,get:function(){return r},set:function(t){r=t}};if(a)for(var i in a)s[i]=a[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function bezFunction(){function t(t,e,a,r,s,i){return m.abs((a-t)*(i-e)-(s-t)*(r-e))<1e-5}function e(t){return l[t].fnc}function a(t,e,a,r,s){if(s||(s=("bez_"+t+"_"+e+"_"+a+"_"+r).replace(/\./g,"p")),l[s])return l[s];var i,n,o,h,p,d;return l[s]=function(s,l,c,f,u){var y=l/u;s=y;for(var g,v=0;++v<14&&(o=3*t,n=3*(a-t)-o,i=1-o-n,g=s*(o+s*(n+s*i))-y,!(m.abs(g)<.001));)s-=g/(o+s*(2*n+3*i*s));d=3*e,p=3*(r-e)-d,h=1-d-p;var b=s*(d+s*(p+s*h));return f*b+c},l[s]}function r(t){this.segmentLength=0,this.points=new Array(t)}function s(t,e){this.partialLength=t,this.point=e}function i(e){var a,i,n,o,h,l,p,d=e.s,c=e.e,f=e.to,u=e.ti,y=100,g=0,v=null;(d[0]!=c[0]||d[1]!=c[1])&&t(d[0],d[1],c[0],c[1],d[0]+f[0],d[1]+f[1])&&t(d[0],d[1],c[0],c[1],c[0]+u[0],c[1]+u[1])&&(y=2);var b=new r(y);for(n=f.length,a=0;y>a;a+=1){for(p=[],h=a/(y-1),l=0,i=0;n>i;i+=1)o=m.pow(1-h,3)*d[i]+3*m.pow(1-h,2)*h*(d[i]+f[i])+3*(1-h)*m.pow(h,2)*(c[i]+u[i])+m.pow(h,3)*c[i],p.push(o),null!==v&&(l+=m.pow(p[i]-v[i],2));l=m.sqrt(l),g+=l,b.points[a]=new s(l,p),v=p}b.segmentLength=g,e.bezierData=b}function n(t,e){var a=e.segments,r=a.length,s=m.floor((r-1)*t),i=t*e.addedLength,n=0;if(i==a[s].l)return a[s].p;for(var o=a[s].l>i?-1:1,h=!0;h;)a[s].l<=i&&a[s+1].l>i?(n=(i-a[s].l)/(a[s+1].l-a[s].l),h=!1):s+=o,(0>s||s>=r-1)&&(h=!1);return a[s].p+(a[s+1].p-a[s].p)*n}function o(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function h(t,e,a,r,s,i,h){var l=new o;s=0>s?0:s;var m=n(s,h);i=i>1?1:i;var p,d=n(i,h),c=t.length,f=1-m,u=1-d;for(p=0;c>p;p+=1)l.pt1[p]=f*f*f*t[p]+(m*f*f+f*m*f+f*f*m)*a[p]+(m*m*f+f*m*m+m*f*m)*r[p]+m*m*m*e[p],l.pt3[p]=f*f*u*t[p]+(m*f*u+f*m*u+f*f*d)*a[p]+(m*m*u+f*m*d+m*f*d)*r[p]+m*m*d*e[p],l.pt4[p]=f*u*u*t[p]+(m*u*u+f*d*u+f*u*d)*a[p]+(m*d*u+f*d*d+m*u*d)*r[p]+m*d*d*e[p],l.pt2[p]=u*u*u*t[p]+(d*u*u+u*d*u+u*u*d)*a[p]+(d*d*u+u*d*d+d*u*d)*r[p]+d*d*d*e[p];return l}var l=[],m=Math,p=function(){var e={};return function(a,r,s,i){var n=(a.join("_")+"_"+r.join("_")+"_"+s.join("_")+"_"+i.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,d,c,f=100,u=0,y=[],g=[],v={addedLength:0,segments:[]};for((a[0]!=r[0]||a[1]!=r[1])&&t(a[0],a[1],r[0],r[1],s[0],s[1])&&t(a[0],a[1],r[0],r[1],i[0],i[1])&&(f=2),l=s.length,o=0;f>o;o+=1){for(d=o/(f-1),c=0,h=0;l>h;h+=1)p=m.pow(1-d,3)*a[h]+3*m.pow(1-d,2)*d*s[h]+3*(1-d)*m.pow(d,2)*i[h]+m.pow(d,3)*r[h],y[h]=p,null!==g[h]&&(c+=m.pow(y[h]-g[h],2)),g[h]=y[h];c&&(c=m.sqrt(c),u+=c),v.segments.push({l:u,p:d})}return v.addedLength=u,e[n]=v,v}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:p,getNewSegment:h,buildBezierData:i}}function dataFunctionManager(){function t(t,e){var a,r,s,i=t.length;for(a=0;i>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(s=t[a].s.length,r=0;s>r;r+=1)t[a].s[r]*=e,void 0!==t[a].e&&(t[a].e[r]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function e(i,o){var h,l,m,p,d,c,f,y,v,b,E=i.length;for(c=0;E>c;c+=1)if(m=i[c],"ks"in m&&!m.completed){if(m.completed=!0,h=Math.round(m.op-m.st),l=m.st,m.tt&&(i[c-1].td=m.tt),m.renderedFrame={},m.renderedData={},p=[],d=-1,m.tm){m.trmp=m.tm;var C=new Array(Math.round(h));for(f=0;h>f;f+=1)C[f]=Math.floor(n(m.tm,f,l)*u);m.tm=C}if(m.ks.o instanceof Array?t(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?t(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?t(m.ks.r,g):m.ks.r*=g,m.hasMask){var D=m.masksProperties;for(y=D.length,f=0;y>f;f+=1)if(D[f].pt.i)s(D[f].pt);else for(b=D[f].pt.length,v=0;b>v;v+=1)D[f].pt[v].s&&s(D[f].pt[v].s[0]),D[f].pt[v].e&&s(D[f].pt[v].e[0])}0===m.ty?(m.layers=a(m.refId,o),e(m.layers,o)):4===m.ty&&r(m.shapes)}}function a(t,e){for(var a=0,r=e.length;r>a;){if(e[a].id===t)return e[a].layers;a+=1}}function r(e,a){var i,n,o,h,l=e.length,m=a?a:!1;for(i=l-1;i>=0;i-=1)if(e[i].renderedData=[],"tm"==e[i].ty&&(m=!0),"fl"==e[i].ty||"st"==e[i].ty)e[i].o instanceof Array?t(e[i].o,.01):e[i].o*=.01;else if("sh"==e[i].ty)if(e[i].trimmed=m,e[i].ks.i)s(e[i].ks);else for(o=e[i].ks.length,n=0;o>n;n+=1)e[i].ks[n].s&&(s(e[i].ks[n].s[0]),s(e[i].ks[n].e[0]));else"gr"==e[i].ty?r(e[i].it,m):"tr"==e[i].ty?(h=e[i],h.renderedData=[],h.o instanceof Array?t(h.o,.01):h.o/=100,h.s instanceof Array?t(h.s,.01):h.s/=100,h.r instanceof Array?t(h.r,g):h.r*=g):("rc"==e[i].ty||"el"==e[i].ty)&&(e[i].trimmed=m,e[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 i(t){t.__renderedFrames=new Array(Math.floor(t.tf)),t.__renderFinished=!1,u=t.fr,e(t.layers,t.comps)}function n(t,e,a,r,s,i){var n,o,h,l,m,p,d=0;if(!t.length){if(r)for(;i>0;)r[s+d]=t,d+=1,i-=1;return t}if(void 0===t[0].t){if(r)for(;i>0;)r[s+d]=t[d],d+=1,i-=1;return t}m=0,p=t.length-1;for(var c=1,f=!0;!(!f||(n=t[m],o=t[m+1],m==p-1&&e>=o.t-a)||o.t-a>e&&1==c);){if(o.t-a<e&&-1==c){m+=1,n=t[m],o=t[m+1];break}p-1>m&&1==c||m>0&&-1==c?m+=c:f=!1}n.to&&!n.bezierData&&bez.buildBezierData(n);var u,y,g,v,b,E=0;if(r||(h=[]),n.to){if(l=n.bezierData,e>=o.t-a||e<n.t-a){var C=e>=o.t-a?l.points.length-1:0;if(r)for(;i>0;)r[s+d]=l.points[C].point[d],d+=1,i-=1;return l.points[C].point}n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y,n.n),n.__fnct=b),g=b("",e-(n.t-a),0,1,o.t-a-(n.t-a));var D,w=l.segmentLength*g,x=0;for(c=1,f=!0,v=l.points.length;f;){if(x+=l.points[E].partialLength*c,0===w||0===g||E==l.points.length-1){if(r)for(;i>0;)r[s+d]=l.points[E].point[d],d+=1,i-=1;else h=l.points[E].point;break}if(w>x&&w<x+l.points[E+1].partialLength){if(D=(w-x)/l.points[E+1].partialLength,r)for(;i>0;)r[s+d]=l.points[E].point[d]+(l.points[E+1].point[d]-l.points[E].point[d])*D,d+=1,i-=1;else for(y=l.points[E].point.length,u=0;y>u;u+=1)h.push(l.points[E].point[u]+(l.points[E+1].point[u]-l.points[E].point[u])*D);break}v-1>E&&1==c||E>0&&-1==c?E+=c:f=!1}}else{var _,S,A,I,M,F=!1;for(p=n.s.length,m=0;p>m;m+=1)1!==n.h&&(n.o.x instanceof Array?(F=!0,n.__fnct||(n.__fnct=[]),n.__fnct[m]||(_=n.o.x[m]?n.o.x[m]:n.o.x[0],S=n.o.y[m]?n.o.y[m]:n.o.y[0],A=n.i.x[m]?n.i.x[m]:n.i.x[0],I=n.i.y[m]?n.i.y[m]:n.i.y[0])):(F=!1,n.__fnct||(_=n.o.x,S=n.o.y,A=n.i.x,I=n.i.y)),F?n.__fnct[m]?b=n.__fnct[m]:(b=bez.getEasingCurve(_,S,A,I),n.__fnct[m]=b):n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(_,S,A,I),n.__fnct=b),g=e>=o.t-a?1:e<n.t-a?0:b("",e-(n.t-a),0,1,o.t-a-(n.t-a))),M=1===n.h?n.s[m]:n.s[m]+(n.e[m]-n.s[m])*g,r?i>0&&(r[s+d]=M,d+=1,i-=1):1===p?h=M:h.push(M)}return h}function o(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,r=t.v,s=t.o,i=t.i,n=r.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(r[a],r[a+1],s[a],i[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(r[a],r[0],s[a],i[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function h(t,e,a,r,s,i){var n=i&&i.length>0,o={};o.closed=s?t.cl:t.closed;var h=s?t.pt:t.ks;if(h.v)return o.pathNodes=n?v(h,o.closed,i,!1):h,o;var l,m,p,d,c,f,u;if(e<h[0].t-a||e>h[h.length-1].t-a){var y,g,b,E;if(e<h[0].t-a?(E="__minValue",g=0,b=h.__minValue,y=h[g].s):(E="__maxValue",g=h.length-2,b=h.__maxValue,y=h[g].e),!b){for(m=h[g].s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=h[g].s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)c[p]=y[0].i[l][p],f[p]=y[0].o[l][p],u[p]=y[0].v[l][p];t.i[l]=c,t.o[l]=f,t.v[l]=u}h[E]=t,b=t}return o.pathNodes=n?v(b,o.closed,i,!1):b,o}var C,D=!1;h.__lastData?C=h.__lastData.pathNodes:D=!0;for(var w,x,_=0,S=h.length-1,A=1,I=!0;I&&(w=h[_],x=h[_+1],!(x.t-a>e&&1==A));)S-1>_&&1==A||_>0&&-1==A?_+=A:I=!1;var M;if(1!==w.h){var F;w.__fnct?F=w.__fnct:(F=bez.getEasingCurve(w.o.x,w.o.y,w.i.x,w.i.y),w.__fnct=F),M=e>=x.t-a?1:e<w.t-a?0:F("",e-(w.t-a),0,1,x.t-a-(w.t-a))}if(1===w.h&&w.__hValue)t=w.__hValue;else for(m=w.s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=w.s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)1===w.h?(c[p]=w.s[0].i[l][p],f[p]=w.s[0].o[l][p],u[p]=w.s[0].v[l][p]):(c[p]=w.s[0].i[l][p]+(w.e[0].i[l][p]-w.s[0].i[l][p])*M,f[p]=w.s[0].o[l][p]+(w.e[0].o[l][p]-w.s[0].o[l][p])*M,u[p]=w.s[0].v[l][p]+(w.e[0].v[l][p]-w.s[0].v[l][p])*M),C&&(C.i[l]&&C.o[l]&&C.v[l]&&C.i[l][p]===c[p]&&C.o[l][p]===f[p]&&C.v[l][p]===u[p]||(D=!0));t.i[l]=c,t.o[l]=f,t.v[l]=u,1===w.h&&(w.__hValue=t)}return n?o.pathNodes=v(t,o.closed,i,!1):(D?(o.pathNodes=t,h.__lastData=o):o.pathNodes=h.__lastData,o.pathNodes=t),o}function l(t,e,a){var r,s,i,o,m,d,c,f,g,v,E,C=t.length;for(f=0;C>f;f+=1)if(g=t[f],"ks"in t[f]){if(o=e-g.st,r={},r.a=n(g.ks.a,o,g.st),r.o=n(g.ks.o,o,g.st),g.ks.p.s?(n(g.ks.p.x,o,g.st,b,3,1),n(g.ks.p.y,o,g.st,b,4,1)):n(g.ks.p,o,g.st,b,3,2),n(g.ks.r,o,g.st,b,0,1),n(g.ks.s,o,g.st,b,1,2),c={},v=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]),E=!1,g.__lastRenderAn&&r.o===g.__lastRenderAn.tr.o&&r.a[0]===g.__lastRenderAn.tr.a[0]&&r.a[1]===g.__lastRenderAn.tr.a[1]&&v[1]===g.__lastRenderAn.matrixArray[1]&&v[2]===g.__lastRenderAn.matrixArray[2]&&v[3]===g.__lastRenderAn.matrixArray[3]&&v[4]===g.__lastRenderAn.matrixArray[4]&&v[5]===g.__lastRenderAn.matrixArray[5]?c.an=g.__lastRenderAn:(c.an={tr:r},c.an.matrixArray=v,g.__lastRenderAn=c.an),g.renderedData[o]=c,g.hasMask)for(s=g.masksProperties,d=s.length,m=0;d>m;m+=1)s[m].paths||(s[m].paths=[],s[m].opacity=[]),s[m].paths[o]=h(s[m],o,g.st,a,!0),s[m].opacity[o]=n(s[m].o,o,g.st),s[m].opacity[o]=s[m].opacity[o]instanceof Array?s[m].opacity[o][0]/100:s[m].opacity[o]/100;e<g.ip||e>g.op||(0===g.ty?(i=g.tm?g.tm[o]<0?0:o>=g.tm.length?g.tm[g.tm.length-1]:g.tm[o]:o,void 0===i&&(i=n(g.trmp,o,0)[0]*u,g.tm[o]=i),l(g.layers,i,a)):4===g.ty&&p(g.shapes,o,g.st,a))}}function m(t,e,a,r){a=Math.min(e[0],e[1],a/2);var s=new Array(8),i=new Array(8),n=new Array(8),o=a/2;return 2===r?(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=s[0],i[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],s[1]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[1]=[t[0]+e[0]/2,t[1]+e[1]/2-o],i[1]=s[1],s[2]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[2]=s[2],i[2]=[t[0]+e[0]/2-o,t[1]+e[1]/2],s[3]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[3]=[t[0]-e[0]/2+o,t[1]+e[1]/2],i[3]=s[3],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=s[4],i[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],s[5]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[5]=[t[0]-e[0]/2,t[1]-e[1]/2+o],i[5]=s[5],s[6]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[6]=s[6],i[6]=[t[0]-e[0]/2+o,t[1]-e[1]/2],s[7]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[7]=[t[0]+e[0]/2-o,t[1]-e[1]/2],i[7]=s[7]):(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],i[0]=s[0],s[1]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[1]=s[1],i[1]=[t[0]+e[0]/2-o,t[1]-e[1]/2],s[2]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[2]=[t[0]-e[0]/2+o,t[1]-e[1]/2],i[2]=s[2],s[3]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[3]=s[3],i[3]=[t[0]-e[0]/2,t[1]-e[1]/2+o],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],i[4]=s[4],s[5]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[5]=s[5],i[5]=[t[0]-e[0]/2+o,t[1]+e[1]/2],s[6]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[6]=[t[0]+e[0]/2-o,t[1]+e[1]/2],i[6]=s[6],s[7]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[7]=s[7],i[7]=[t[0]+e[0]/2,t[1]+e[1]/2-o]),{v:s,o:n,i:i,c:!0}}function p(t,e,a,r,s){var i,o,l,c,f,u,g,E,C,D,w=t.length;s||(s=[]);var x,_,S,A,I;for(i=w-1;i>=0;i-=1)if(o=t[i],"sh"==o.ty)o.renderedData[e]={path:h(o,e,a,r,!1,s)};else if("fl"==o.ty)l=n(o.c,e,a),c=n(o.o,e,a),o.renderedData[e]={opacity:c instanceof Array?c[0]:c},"canvas"==r?(d(l),o.renderedData[e].color=l):o.renderedData[e].color=rgbToHex(Math.round(l[0]),Math.round(l[1]),Math.round(l[2]));else if("rc"==o.ty)f=n(o.p,e,a),u=n(o.s,e,a),g=n(o.r,e,a),o.trimmed?(o.closed=!0,o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(m(f,u,g,o.d),!0,s,!1)):o.renderedData[e]={position:f,size:u,roundness:g};else if("el"==o.ty){if(f=n(o.p,e,a),u=n(o.s,e,a),o.renderedData[e]={p:f,size:u},"svg"==r){var M={v:new Array(4),i:new Array(4),o:new Array(4)};2!==o.d&&3!==o.d?(M.v[0]=[f[0],f[1]-u[1]/2],M.i[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.o[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]+u[0]/2,f[1]],M.i[1]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.o[1]=[f[0]+u[0]/2,f[1]+u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.i[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.o[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]-u[0]/2,f[1]],M.i[3]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.o[3]=[f[0]-u[0]/2,f[1]-u[1]/2*.55]):(M.v[0]=[f[0],f[1]-u[1]/2],M.o[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.i[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]-u[0]/2,f[1]],M.o[1]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.i[1]=[f[0]-u[0]/2,f[1]-u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.o[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.i[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]+u[0]/2,f[1]],M.o[3]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.i[3]=[f[0]+u[0]/2,f[1]+u[1]/2*.55]),o.trimmed?(o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(M,!0,s,!1),o.closed=!0):(o.renderedData[e].path={pathNodes:M},o.closed=!0)}}else if("st"==o.ty){if(E=n(o.c,e,a),C=n(o.o,e,a),D=n(o.w,e,a),o.renderedData[e]={opacity:C instanceof Array?C[0]:C,width:D instanceof Array?D[0]:D},o.d){var F=[];I=o.d.length;var P;for(A=0;I>A;A+=1)P=n(o.d[A].v,e,a),F.push({v:P instanceof Array?P[0]:P,n:o.d[A].n});o.renderedData[e].dashes=F}"canvas"==r?(d(E),o.renderedData[e].color=E):o.renderedData[e].color=rgbToHex(Math.round(E[0]),Math.round(E[1]),Math.round(E[2]))}else if("tr"==o.ty)o.renderedData[e]={a:n(o.a,e,a),o:n(o.o,e,a)},n(o.s,e,a,b,1,2),n(o.r,e,a,b,0,1),n(o.p,e,a,b,3,2),o.renderedData[e].mtArr=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]);else if("tm"==o.ty){x=n(o.s,e,a),_=n(o.e,e,a),S=n(o.o,e,a);var k={s:x,e:_,o:S};s.push(k),o.renderedData[e]=k}else"gr"==o.ty&&p(o.it,e,a,r,s)}function d(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function c(t,e){for(var a=1;a>0;){if(e+=1,e>=Math.floor(t.tf)){t.__renderFinished=!0;break}t.__renderedFrames[e]||(f(t,e),a-=1)}}function f(t,e){return 2==t.__renderedFrames[e]?void(t.__renderFinished||c(t,e)):(u=t.fr,t.__renderedFrames[e]=2,void l(t.layers,e,t._animType))}var u=0,y=new MatrixManager,g=Math.PI/180,v=function(){function t(t,i,n,o,p){r[h]=i,e[h+1]=n,a[h+1]=o,l?a[h]=t:(m+=" M"+t.join(","),l=!0,s[h]=t),m+=" C"+i.join(",")+" "+n.join(",")+" "+o.join(","),h+=1}var e,a,r,s,i,n,h,l=!1,m="";return function(p,d,c,f){o(p,d);var u,y=c.length,g=p;a=e=r=s=null;var v,b,E,C,D;for(u=y-1;u>=0;u-=1){var w=[],x=c[u].o%360/360;if(0!==x||0!==c[u].s||100!=c[u].e){m="",l=!1,e=[],r=[],a=[],s=[],i=[],n=0,0>x&&(x+=1);var _=c[u].s/100+x,S=c[u].e/100+x;if(_==S)return f?"":{};if(_>S){var A=_;_=S,S=A}1>=S?w.push({s:g.__totalLength*_,e:g.__totalLength*S}):_>=1?w.push({s:g.__totalLength*(_-1),e:g.__totalLength*(S-1)}):(w.push({s:g.__totalLength*_,e:g.__totalLength}),w.push({s:0,e:g.__totalLength*(S-1)})),v=[],b=[],E=[];var I;v=g.v,b=g.o,E=g.i,I=g.__lengths,D=v.length;var M,F,P=0,k=0,N=w.length;for(h=0,M=0;N>M;M+=1){for(P=0,C=1;D>C;C++)if(k=I[C-1].addedLength,P+k<w[M].s)P+=k;else{if(P>w[M].e)break;w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[C],v[C],I[C-1]):(F=bez.getNewSegment(v[C-1],v[C],b[C-1],E[C],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2)),P+=k}d!==!1?P<=w[M].e&&(k=I[C-1].addedLength,w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[0],v[0],I[C-1]):(F=bez.getNewSegment(v[C-1],v[0],b[C-1],E[0],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2))):l=!1}d=!1}}if(a?(v=a,b=r,E=e):(v=g.v,b=g.o,E=g.i,s=[]),D=v.length,f){for(m="",C=1;D>C;C++)s[C-1]?m+="M"+s[C-1].join(","):1==C&&(m+="M"+v[0].join(",")),m+=" C"+b[C-1].join(",")+" "+E[C].join(",")+" "+v[C].join(",");return d!==!1&&(m+=" C"+b[C-1].join(",")+" "+E[0].join(",")+" "+v[0].join(",")),m}return{i:E,o:b,v:v,s:s,c:d}}}(),b=[0,1,1,0,0],E={};return E.completeData=i,E.renderFrame=f,E}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.destroyed=!1}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,r=15;for(a=0;r>a;a+=1)this.contextData.saved[a]=new Array(6);this.elements=[]}function MaskElement(t,e,a){this.data=t,this.storedData=[],this.element=e,this.globalData=a,this.paths=[],this.registeredEffects=[],this.masksProperties=[],this.maskElement=null}function ICompElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r),this.layers=t.layers}function IImageElement(t,e,a,r){this.assetData=a.getAssetData(t.ll),this.path=a.getPath(),this.parent.constructor.call(this,t,e,a,r)}function IShapeElement(t,e,a,r){this.shapes=[],this.parent.constructor.call(this,t,e,a,r)}function ShapeItemElement(t,e,a,r,s){this.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},this.stylesList=[],this.viewData=[],this.shape=e,this.parentContainer=a,this.placeholder=r,this.data=t,this.globalData=s,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}function ITextElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}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.assetData=this.animationItem.getAssetData(t.ll),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.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},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 r,s=this.dataLength-1;this.renderedPaths=new Array(this.globalData.totalFrames);var i;for(r=s;r>=0;r-=1)"gr"==this.data[r].ty?this.data[r].item=new CVShapeItemElement(this.data[r].it,!1,this.globalData):("st"==this.data[r].ty||"fl"==this.data[r].ty)&&(i={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[r].ty?i.type="fill":(i.type="stroke",i.width=0,i.lc=this.lcEnum[this.data[r].lc]||"round",i.lj=this.ljEnum[this.data[r].lj]||"round",1==this.data[r].lj&&(i.ml=this.data[r].ml)),this.stylesPool.push(i))}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),r=2*(a.x*t+a.y*e);return t-=r*a.x,e-=r*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 1==t?this:this._t(t,0,0,1,0,0)},scaleY:function(t){return 1==t?this: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,r,s,i){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=r,this.props[4]=s,this.props[5]=i,this._x()},translate:function(t,e){return 0===t&&0===e?this: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,r,s,i){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*r,this.props[3]=this.b1*a+this.d1*r,this.props[4]=this.a1*s+this.c1*i+this.e1,this.props[5]=this.b1*s+this.d1*i+this.f1,this},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,r=t.c,s=t.d,i=t.e,n=t.f,o=new Matrix,h=e*s-a*r;return o.a=s/h,o.b=-a/h,o.c=-r/h,o.d=e/h,o.e=(r*n-s*i)/h,o.f=-(e*n-a*i)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix;return s.a=r.a+(t.a-r.a)*e,s.b=r.b+(t.b-r.b)*e,s.c=r.c+(t.c-r.c)*e,s.d=r.d+(t.d-r.d)*e,s.e=r.e+(t.e-r.e)*e,s.f=r.f+(t.f-r.f)*e,s._x()},interpolateAnim:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix,i=r.decompose(),n=t.decompose(),o=i.rotation+(n.rotation-i.rotation)*e,h=i.translate.x+(n.translate.x-i.translate.x)*e,l=i.translate.y+(n.translate.y-i.translate.y)*e,m=i.scale.x+(n.scale.x-i.scale.x)*e,p=i.scale.y+(n.scale.y-i.scale.y)*e;return s.translate(h,l),s.rotate(o),s.scale(m,p),s._x()},decompose:function(t){var e=this.props[0],a=this.props[1],r=this.props[2],s=this.props[3],i=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},m=0,p={x:1,y:1},d={x:0,y:0},c=e*s-a*r;if(t)e?(d={x:n(r/e),y:n(a/e)},p={x:e,y:c/e}):a?(m=.5*h,p={x:a,y:c/a},d.x=n(s/a)):(p={x:r,y:s},d.x=.25*h);else if(e||a){var f=o(e*e+a*a);m=a>0?i(e/f):-i(e/f),p={x:f,y:c/f},d.x=n((e*r+a*s)/(f*f))}else if(r||s){var u=o(r*r+s*s);m=.5*h-(s>0?i(-r/u):-i(r/u)),p={x:c/u,y:u},d.y=n((e*r+a*s)/(u*u))}else p={x:0,y:0};return{scale:p,translate:l,rotation:m,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,r=0,s=[];if("number"==typeof t[0])for(a=t.length;a>r;)e=this.applyToPoint(t[r++],t[r++]),s.push(e.x,e.y);else for(a=t.length,r=0;a>r;r++)s.push(this.applyToPoint(t[r].x,t[r].y));return s},applyToTypedArray:function(t,e){for(var a,r=0,s=t.length,i=e?new Float64Array(s):new Float32Array(s);s>r;)a=this.applyToPoint(t[r],t[r+1]),i[r++]=a.x,i[r++]=a.y;return i},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,r,s,i,n,o){this.save(),this.translate(t,e),this.rotate(s),this.scale(a,r),this.arc(0,0,1,i,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,r=[];for(e=0;a>e;e+=1)r.push(arguments[e]);this.ops_.push({type:t,args:r})}}for(var a=CanvasRenderingContext2D.prototype,r=BM_CanvasRenderingContext2D.prototype,s=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],i=0;i<s.length;i++){var n=s[i];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;r.fill=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];"transform"==s.type?this.renderer.ctxTransform(s.args):"save"==s.type?this.renderer.save():"restore"==s.type?this.renderer.restore():this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);o.apply(this.renderer.canvasContext,i)}else o.apply(this.renderer.canvasContext,arguments)},r.stroke=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}h.call(this.renderer.canvasContext)}else h.call(this.renderer.canvasContext)},r.clip=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);l.apply(this.renderer.canvasContext,i)}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,a){var r=(new Date).getTime(),s=Math.max(0,16-(r-t)),i=window.setTimeout(function(){e(r+s)},s);return t=r+s,i}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},bm_rnd=Math.round,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,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+a[t]+a[e]+a[r]}}(),fillColorToString=function(){var t=[];return function(e,a){return void 0!==a&&(e[3]=a),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.createItem=function(t,e,a){switch(t.ty){case 2:return this.createImage(t,e,a);case 0:return this.createComp(t,e,a);case 1:return this.createSolid(t,e,a);case 4:return this.createShape(t,e,a);case 5:return this.createText(t,e,a);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e)},SVGRenderer.prototype.buildItems=function(t,e,a,r){var s,i=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var n;for(s=i-1;s>=0;s--)a[s]=this.createItem(t[s],e,r),0===t[s].ty&&(n=[],this.buildItems(t[s].layers,a[s].getDomElement(),n,r),a[s].setElements(n)),t[s].td&&a[s+1].setMatte(a[s].layerId)},SVGRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var i,n,o,h=a.length;for(r=0;s>r;r+=1)for(i=0;h>i;){if(a[i].data.id==t[r].id){o=a[i],a[i]=this.createItem(t[r],e,o),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,a[i].getDomElement(),n,o),
-a[i].setElements(n));break}i+=1}},SVGRenderer.prototype.createBase=function(t,e,a){return new BaseElement(t,e,this.globalData,a)},SVGRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e,a){return new IShapeElement(t,e,this.globalData,a)},SVGRenderer.prototype.createText=function(t,e,a){return new ITextElement(t,e,this.globalData,a)},SVGRenderer.prototype.createImage=function(t,e,a){return new IImageElement(t,e,this.globalData,a)},SVGRenderer.prototype.createComp=function(t,e,a){return new ICompElement(t,e,this.globalData,a)},SVGRenderer.prototype.createSolid=function(t,e,a){return new ISolidElement(t,e,this.globalData,a)},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.w),this.animationItem.container.setAttribute("height",t.h),this.animationItem.container.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transform="translate3d(0,0,0)",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),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.compSize={w:t.w,h:t.h};var a=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var s="animationMask_"+randomString(10);a.setAttribute("id",s),a.appendChild(r);var i=document.createElementNS(svgNS,"g");i.setAttribute("clip-path","url(#"+s+")"),this.animationItem.container.appendChild(i),e.appendChild(a),this.animationItem.container=i,this.layers=t.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var r,s,i=e.length;for(a||(a=this.elements),r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemParenting(s,a[r],e,s.parent,a,!0),0===s.ty&&this.buildStage(a[r].getComposingElement(),s.layers,a[r].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,r,s,i){t.parents||(t.parents=[]),i&&e.resetHierarchy();for(var n=0,o=a.length;o>n;)a[n].ind==r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemParenting(t,e,a,a[n].parent,s,!1)),n+=1},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t&&!this.destroyed){null===t?t=this.lastFrame: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].st);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.createItem=function(t){switch(t.ty){case 0:return this.createComp(t);case 1:return this.createSolid(t);case 2:return this.createImage(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 99:return this.createPlaceHolder(t);default:return this.createBase(t)}return this.createBase(t,parentContainer)},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,r=t.length;for(a=0;r>a;a++)if(e[a]=this.createItem(t[a]),0===t[a].ty){var s=[];this.buildItems(t[a].layers,s),e[e.length-1].setElements(s)}},CanvasRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements);var i,n,o=a.length;for(r=0;s>r;r+=1)for(i=0;o>i;){if(a[i].data.id==t[r].id){a[i]=this.createItem(t[r],e),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,n),a[i].setElements(n));break}i+=1}},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.createPlaceHolder=function(t){return new PlaceHolderElement(t,null,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*=0>t?0:t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=0>t?0: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]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(6));var a,r=6,s=this.contextData.saved[this.contextData.cArrPos];for(a=0;r>a;a+=1)s[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],r=6,s=this.contextData.cTr.props;for(e=0;r>e;e+=1)s[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.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,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,r=this.transformCanvas.w/this.transformCanvas.h;r>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 r,s,i=e.length;for(r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemHierarchy(s,a[r],e,s.parent,a,!0),0==s.ty&&this.buildStage(null,s.layers,a[r].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,r,s,i){var n=0,o=a.length;for(i&&e.resetHierarchy();o>n;)a[n].ind===r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemHierarchy(t,e,a,a[n].parent,s,!1)),n+=1},CanvasRenderer.prototype.prepareFrame=function(t){if(!this.destroyed){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw()},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.bmCtx=null,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){this.lastFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||(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.masksProperties=this.data.masksProperties;var t,e,a,r,s,i=this.element.maskedElement,n=this.globalData.defs,o=this.masksProperties.length,h=this.data.masksProperties,l=0,m=[],p=randomString(10);for(this.maskElement=document.createElementNS(svgNS,"mask"),t=0;o>t;t++)if("s"!=h[t].mode&&"i"!=h[t].mode||0!=l||(s=document.createElementNS(svgNS,"rect"),s.setAttribute("fill","#ffffff"),s.setAttribute("x","0"),s.setAttribute("y","0"),s.setAttribute("width","100%"),s.setAttribute("height","100%"),m.push(s)),!("f"==h[t].mode&&l>0||"n"==h[t].mode)){if(l+=1,e=document.createElementNS(svgNS,"path"),h[t].cl?"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"):(e.setAttribute("fill","none"),"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"),e.setAttribute("stroke-width","1"),e.setAttribute("stroke-miterlimit","10")),e.setAttribute("clip-rule","nonzero"),this.storedData[t]={elem:e,lastPath:""},"i"==h[t].mode){r=m.length;var d=document.createElementNS(svgNS,"g");for(a=0;r>a;a+=1)d.appendChild(m[a]);var c=document.createElementNS(svgNS,"mask");c.setAttribute("mask-type","alpha"),c.setAttribute("id",p+"_"+l),c.appendChild(e),n.appendChild(c),d.setAttribute("mask","url(#"+p+"_"+l+")"),m.length=0,m.push(d)}else m.push(e);h[t].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath())}for(o=m.length,t=0;o>t;t+=1)this.maskElement.appendChild(m[t]);this.maskElement.setAttribute("id",p),l>0&&i.setAttribute("mask","url(#"+p+")"),n.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length,r=0;for(e=0;a>e;e++)"f"==this.data.masksProperties[e].mode&&r>0||"n"==this.data.masksProperties[e].mode||(r+=1,this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes,this.storedData[e]))},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,r=this.registeredEffects.length;for(a=0;r>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.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,a){var r,s,i="";if(e.__renderedString)i=e.__renderedString;else{for(s=e.v.length,r=1;s>r;r+=1)1==r&&(i+=" M"+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[r][0])+","+bm_rnd(e.i[r][1])+" "+bm_rnd(e.v[r][0])+","+bm_rnd(e.v[r][1]);t.cl&&(i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),e.__renderedString=i}a.lastPath!==i&&(t.inv?a.elem.setAttribute("d",this.solidPath+i):a.elem.setAttribute("d",i),a.lastPath=i)},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.registeredEffects=null,this.masksProperties=null};var BaseElement=function(t,e,a,r){this.globalData=a,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.matteElement=null,this.lastData={},this.renderedFrames=[],this.parentContainer=e,this.layerId=r?r.layerId:"ly_"+randomString(10),this.hidden=!1,this.placeholder=r,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},BaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},BaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var a=document.createElementNS(svgNS,"filter"),r=randomString(10);a.setAttribute("id",r),a.setAttribute("filterUnits","objectBoundingBox"),a.setAttribute("x","0%"),a.setAttribute("y","0%"),a.setAttribute("width","100%"),a.setAttribute("height","100%");var s=document.createElementNS(svgNS,"feComponentTransfer");s.setAttribute("in","SourceGraphic"),a.appendChild(s);var i=document.createElementNS(svgNS,"feFuncA");i.setAttribute("type","table"),i.setAttribute("tableValues","1.0 0.0"),s.appendChild(i),this.globalData.defs.appendChild(a);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+r+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.appendNodeToParent(this.matteElement)):this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.appendNodeToParent(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){if(this.data.renderedData[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(!this.data.renderedData[t]||3===this.data.ty)return!1;if(this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff,t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o;var a,r=this.finalTransform.mat;if(e&&(a=e.mat.props,r.reset().transform(a[0],a[1],a[2],a[3],a[4],a[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var s,i=this.hierarchy.length;for(e||r.reset(),s=i-1;s>=0;s-=1)a=this.hierarchy[s].ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5]);a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])}else this.isVisible&&(e?(a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])):(r.props[0]=this.ownMatrix.props[0],r.props[1]=this.ownMatrix.props[1],r.props[2]=this.ownMatrix.props[2],r.props[3]=this.ownMatrix.props[3],r.props[4]=this.ownMatrix.props[4],r.props[5]=this.ownMatrix.props[5]));if(this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===n&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(n,this.finalTransform.opacity)}var o=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=o.tr&&this.layerElement.setAttribute("transform",o.tr),this.lastData.o!==o.o&&this.layerElement.setAttribute("opacity",o.o),this.lastData=o}return this.isVisible},BaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData),this.maskManager.init()},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 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},BaseElement.prototype.hide=function(){};var PlaceHolderElement=function(t,e,a){if(this.data=t,this.globalData=a,e){this.parentContainer=e;var r=document.createElementNS(svgNS,"g");r.setAttribute("id",this.data.id),e.appendChild(r),this.phElement=r}this.layerId="ly_"+randomString(10)};PlaceHolderElement.prototype.prepareFrame=function(){},PlaceHolderElement.prototype.renderFrame=function(){},PlaceHolderElement.prototype.draw=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 r,s=this.layers.length,i=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(r=0;s>r;r+=1)this.elements[r].prepareFrame(i-this.layers[r].st);for(r=0;s>r;r+=1)this.data.hasMask?this.elements[r].renderFrame(i-this.layers[r].st):this.elements[r].renderFrame(i-this.layers[r].st,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this.parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t].destroy()},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.assetData.p),t.maskedElement=t.image},a=new Image;a.addEventListener("load",e,!1),a.addEventListener("error",e,!1),a.src=this.path+this.assetData.p,this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.assetData.w+"px"),this.image.setAttribute("height",this.assetData.h+"px"),this.layerElement===this.parentContainer?this.appendNodeToParent(this.image):this.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||(this.image.setAttribute("visibility","hidden"),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&&(this.lastData.o=-1,this.hidden=!1,this.image.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.image.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.image.setAttribute("opacity",s.o),this.lastData=s}},IImageElement.prototype.destroy=function(){this.parent.destroy.call(),this.image=null},createElement(BaseElement,IShapeElement),IShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix},IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.parentContainer,this.placeholder,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,this.transformHelper,null,null,!0):this.mainShape.renderShape(t,this.finalTransform,null,null,!0)},IShapeElement.prototype.destroy=function(){this.parent.destroy.call(),this.mainShape.destroy()},ShapeItemElement.prototype.appendNodeToParent=BaseElement.prototype.appendNodeToParent,ShapeItemElement.prototype.searchShapes=function(t,e){var a,r,s,i=t.length-1,n=[];for(a=i;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");"st"==t[a].ty&&(o.setAttribute("stroke-linecap",this.lcEnum[t[a].lc]||"round"),o.setAttribute("stroke-linejoin",this.ljEnum[t[a].lj]||"round"),1==t[a].lj&&o.setAttribute("stroke-miterlimit",t[a].ml)),this.shape===this.parentContainer?this.appendNodeToParent(o):this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:"",ld:""}),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:""}},s=this.stylesList.length,r=0;s>r;r+=1)this.stylesList[r].closed||(e[a].styles.push(this.stylesList[r]),"st"==this.stylesList[r].type&&this.stylesList[r].pathElement.setAttribute("fill-opacity",0));for(i=n.length,a=0;i>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","M 0,0"),this.stylesList[t].ld="M 0,0"},ShapeItemElement.prototype.renderShape=function(t,e,a,r,s){var i,n;if(!a)for(a=this.data,n=this.stylesList.length,i=0;n>i;i+=1)this.stylesList[i].d="";r||(r=this.viewData),this.frameNum=t,n=a.length-1;var o,h;for(o=e,i=n;i>=0;i-=1)if("tr"==a[i].ty){var l=a[i].renderedData[t].mtArr;if(o=r[i].transform,h=o.mat,h.reset(),e){var m=e.mat.props;o.opacity=e.opacity,o.opacity*=a[i].renderedData[t].o,h.transform(m[0],m[1],m[2],m[3],m[4],m[5])}else o.opacity=a[i].renderedData[t].o;h.transform(l[0],l[1],l[2],l[3],l[4],l[5]).translate(-a[i].renderedData[t].a[0],-a[i].renderedData[t].a[1])}else"sh"==a[i].ty?this.renderPath(a[i],r[i],t,o):"el"==a[i].ty?this.renderPath(a[i],r[i],t,o):"rc"==a[i].ty?a[i].trimmed?this.renderPath(a[i],r[i],t,o):this.renderRect(a[i],r[i],t,o):"fl"==a[i].ty?this.renderFill(a[i],r[i],t,o):"st"==a[i].ty?this.renderStroke(a[i],r[i],t,o):"gr"==a[i].ty?this.renderShape(t,o,a[i].it,r[i].it):"tm"==a[i].ty;if(s)for(n=this.stylesList.length,i=0;n>i;i+=1)""==this.stylesList[i].d&&""!==this.stylesList[i].ld?(this.stylesList[i].pathElement.setAttribute("d","M 0,0"),this.stylesList[i].ld=this.stylesList[i].d):this.stylesList[i].ld!==this.stylesList[i].d&&(this.stylesList[i].pathElement.setAttribute("d",this.stylesList[i].d),this.stylesList[i].ld=this.stylesList[i].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,r){var s,i;if(!e.renderedFrames[this.globalData.frameNum]){var n=t.renderedData[a].path.pathNodes;if(!n.v)return;s=n.v.length;var o=n.s?n.s:[],h="";for(i=1;s>i;i+=1)o[i-1]?h+=" M"+bm_rnd(o[i-1][0])+","+bm_rnd(o[i-1][1]):1==i&&(h+=" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[i][0])+","+bm_rnd(n.i[i][1])+" "+bm_rnd(n.v[i][0])+","+bm_rnd(n.v[i][1]);1==s&&(h+=o[0]?" M"+bm_rnd(o[0][0])+","+bm_rnd(o[0][1]):" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),!t.closed||t.trimmed&&!n.c||(h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[0][0])+","+bm_rnd(n.i[0][1])+" "+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(s=e.styles.length,i=0;s>i;i+=1)e.styles[i].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld}var o=e.renderedFrames[this.globalData.frameNum];e.lastData.c!=o.c&&(i.pathElement.setAttribute("fill",o.c),e.lastData.c=o.c),e.lastData.o!=o.o&&(i.pathElement.setAttribute("fill-opacity",o.o),e.lastData.o=o.o),e.lastData.t!=o.t&&(i.pathElement.setAttribute("transform",o.t),e.lastData.t=o.t)},ShapeItemElement.prototype.renderStroke=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.w===s.width&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,w:s.width,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld,s.dashes&&(e.renderedFrames[this.globalData.frameNum].d=s.dashes)}var o,h,l=e.renderedFrames[this.globalData.frameNum],m=l.c,p=l.o,d=l.w,c=l.d,n=l.t;if(c){var f,u=c.length;for(o="",h="",f=0;u>f;f+=1)"o"!=c[f].n?o+=" "+c[f].v:h+=c[f].v;e.lastData.da!=o&&(i.pathElement.setAttribute("stroke-dasharray",o),e.lastData.da=o),e.lastData["do"]!=h&&(i.pathElement.setAttribute("stroke-dashoffset",h),e.lastData["do"]=h)}e.lastData.c!=m&&(i.pathElement.setAttribute("stroke",m),e.lastData.c=m),e.lastData.o!=p&&(i.pathElement.setAttribute("stroke-opacity",p),e.lastData.o=p),e.lastData.w!==d&&(i.pathElement.setAttribute("stroke-width",d),e.lastData.w=d),e.lastData.t!==n&&(i.pathElement.setAttribute("transform",n),e.lastData.t=n)},ShapeItemElement.prototype.destroy=function(t,e){this.shape=null,this.data=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement===this.parentContainer?this.appendNodeToParent(t):this.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||(this.rectElement.setAttribute("visibility","hidden"),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.hidden=!1,this.rectElement.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.rectElement.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.rectElement.setAttribute("opacity",s.o),this.lastData=s}},ICompElement.prototype.destroy=function(){this.parent.destroy.call(),this.rectElement=null},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.parent.createElements.call(this)},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){if(!this.data.renderedData[t])return!1;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.ip-this.data.st<=t&&this.data.op-this.data.st>=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(3!==this.data.ty){
-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 r,s=this.hierarchy.length;for(t||a.reset(),r=s-1;r>=0;r-=1)e=this.hierarchy[r].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.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},CVBaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},CVBaseElement.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,r=this.elements.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(a=0;r>a;a+=1)this.elements[a].prepareFrame(s-this.layers[a].st)}},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},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this.parent.destroy.call()},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.assetData.p,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)}},CVImageElement.prototype.destroy=function(){this.img=null,this.animationItem=null,this.parent.destroy.call()},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)},CVShapeElement.prototype.destroy=function(){this.mainShape.destroy(),this.parent.destroy.call()},CVShapeItemElement.prototype.drawPaths=function(t){var e,a;t?(a=[],e=this.stylesList):e=this.renderedPaths[this.globalData.frameNum];var r,s=e.length,i=this.canvasContext;for(this.globalData.renderer.save(),r=0;s>r;r+=1)"stroke"==e[r].type?(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.lineCap=e[r].lc,i.lineJoin=e[r].lj,i.miterLimit=e[r].ml,i.strokeStyle=e[r].value,i.lineWidth=e[r].width,e[r].dasharray?(i.setLineDash(e[r].dasharray),i.lineDashOffset=e[r].dashoffset):(i.setLineDash([]),i.lineDashOffset=0),this.globalData.bmCtx.stroke(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&(a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,width:e[r].width,path:e[r].path}),e[r].dasharray&&(a[a.length-1].dasharray=e[r].dasharray,a[a.length-1].dashoffset=e[r].dashoffset))):"fill"==e[r].type&&(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.fillStyle=e[r].value,this.globalData.bmCtx.fill(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,path:e[r].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,r;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),r=this.dataLength-1,a=r;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(r=this.ownStylesList.length,a=0;r>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,r=new BM_Path2D,s=a.pathNodes;if(s instanceof Array&&(s=s[0]),s.v){var i,n=s.v.length,o=s.s?s.s:[];for(i=1;n>i;i+=1)o[i-1]?r.moveTo(bm_rnd(o[i-1][0]),bm_rnd(o[i-1][1])):1==i&&r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[i][0]),bm_rnd(s.i[i][1]),bm_rnd(s.v[i][0]),bm_rnd(s.v[i][1]));1==n&&(o[0]?r.moveTo(bm_rnd(o[0][0]),bm_rnd(o[0][1])):r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1]))),!t.closed||t.trimmed&&!s.c||r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[0][0]),bm_rnd(s.i[0][1]),bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),this.addPathToStyles(r)}},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],r=a.roundness;if(0===r)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var s=a.position[0]-a.size[0]/2,i=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];r instanceof Array&&(r=r[0]),r>n/2&&(r=n/2),r>o/2&&(r=o/2),e.moveTo(s+r,i),e.lineTo(s+n-r,i),e.quadraticCurveTo(s+n,i,s+n,i+r),e.lineTo(s+n,i+o-r),e.quadraticCurveTo(s+n,i+o,s+n-r,i+o),e.lineTo(s+r,i+o),e.quadraticCurveTo(s,i+o,s,i+o-r),e.lineTo(s,i+r),e.quadraticCurveTo(s,i,s+r,i)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,r=!0,s=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>s&&this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(s=this.stylesList[e].width)):r&&"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&&(r=!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,r=e.dashes,s=r.length,i=[],n="";for(a=0;s>a;a+=1)"o"!=r[a].n?i.push(r[a].v):n=r[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=i,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},CVShapeItemElement.prototype.destroy=function(){this.data=null,this.globalData=null,this.canvasContext=null},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.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.parent.createElements.call(this)},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,r=new BM_Path2D,s=this.data.masksProperties.length;for(e=new BM_Path2D,a=0;s>a;a++)this.masksProperties[a].inv&&this.createInvertedMask(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes),this.drawShape(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes);e.addPath(r,t.mat.props),this.renderedFrames[this.globalData.frameNum]=e}this.globalData.bmCtx.clip(e)},CVMaskElement.prototype.drawShape=function(t,e){var a,r=e.v.length;for(t.moveTo(bm_rnd(e.v[0][0]),bm_rnd(e.v[0][1])),a=1;r>a;a++)t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[a][0]),bm_rnd(e.i[a][1]),bm_rnd(e.v[a][0]),bm_rnd(e.v[a][1]));t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[0][0]),bm_rnd(e.i[0][1]),bm_rnd(e.v[0][0]),bm_rnd(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)},CVMaskElement.prototype.destroy=function(){this.ctx=null};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;b>e;){if(y[e].elem==t&&null!==y[e].elem)return y[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),y.push({elem:t,animation:a}),b+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),y.push({elem:null,animation:e}),b+=1,e}function a(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setSpeed(t,e)}function r(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setDirection(t,e)}function s(t){var e;for(e=0;b>e;e+=1)y[e].animation.play(t)}function i(t,e){v=!1,g=Date.now();var a;for(a=0;b>a;a+=1)y[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-g;for(t=0;b>t;t+=1)y[t].animation.renderer.destroyed?(y.splice(t,1),t-=1,b-=1):y[t].animation.advanceTime(a);g=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;b>e;e+=1)y[e].animation.pause(t)}function h(t,e,a){var r;for(r=0;b>r;r+=1)y[r].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;b>e;e+=1)y[e].animation.stop(t)}function m(t){var e;for(e=0;b>e;e+=1)y[e].animation.togglePause(t)}function p(t){var e;for(e=0;b>e;e+=1)y[e].animation.destroy(t)}function d(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function c(){var t;for(t=0;b>t;t+=1)y[t].animation.resize()}function f(){g=Date.now(),requestAnimationFrame(n)}var u={},y=[],g=0,v=!0,b=0;return setTimeout(f,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=r,u.play=s,u.moveFrame=i,u.pause=o,u.stop=l,u.togglePause=m,u.searchAnimations=d,u.resize=c,u.start=f,u.goToAndStop=h,u.destroy=p,u}(),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,this.removed=!1,this.timeCompleted=0,this.segmentPos=0,this.segments=[]};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 r=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.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 r=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:"";""===r||(e.loop="false"===r?!1:"true"===r?!0:parseInt(r)),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 s=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"===s&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.includeLayers=function(t){var e,a,r=this.animationData.layers,s=r.length,i=t.layers,n=i.length;for(a=0;n>a;a+=1)for(e=0;s>e;){if(r[e].id==i[a].id){r[e]=i[a];break}e+=1}if(t.comps)for(s=t.comps.length,e=0;s>e;e+=1)this.animationData.comps.push(t.comps[e]);dataManager.completeData(this.animationData),this.renderer.includeLayers(t.layers),this.renderer.buildStage(this.container,this.layers),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length)return void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var a=new XMLHttpRequest,r=this,s=this.path.substr(0,this.path.lastIndexOf("/")+1)+"data_"+this.segmentPos+".json";this.segmentPos+=1,a.open("GET",s,!0),a.send(),a.onreadystatechange=function(){if(4==a.readyState)if(200==a.status)r.includeLayers(JSON.parse(a.responseText));else try{var t=JSON.parse(a.responseText);r.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.comps||(t.comps=[]),this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip*this.frameRate),this.frameMult=this.animationData.fr/1e3,this.loadSegments(),dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(this.renderer.buildStage(this.container,this.layers),this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationData,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.animationData,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.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationData,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.adjustSegment=function(t){this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.currentRawFrame=this.firstFrame},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var a,r=t.length;for(a=0;r>a;a+=1)this.segments.push(t[a])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.resetSegments=function(t){this.segments.push([Math.round(this.animationData.animation.ff*this.frameRate),Math.floor(this.animationData.animation.totalFrames+this.animationData.animation.ff*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||this.renderer.destroy()},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.segments.length&&this.adjustSegment(this.segments.shift()),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.getAssetData=function(t){for(var e=0,a=this.assets.length;a>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.getAssets=function(){return this.assets},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function r(t){animationManager.togglePause(t)}function s(t,e){animationManager.setSpeed(t,e)}function i(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 m(){animationManager.resize()}function p(){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(t){return animationManager.destroy(t)}function y(){"complete"===document.readyState&&(clearInterval(v),h())}var g={};g.play=e,g.pause=a,g.togglePause=r,g.setSpeed=s,g.setDirection=i,g.stop=n,g.moveFrame=o,g.searchAnimations=h,g.registerAnimation=l,g.loadAnimation=f,g.setSubframeRendering=c,g.resize=m,g.start=p,g.goToAndStop=d,g.destroy=u,g.checkReady=y,t.bodymovin=g;var v=setInterval(y,100)}(window);}(window));
\ No newline at end of file
+(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,r,s,i,n,o,h){var l,m,p,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]]),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]]),c=$M([[r,0,0,0],[0,s,0,0],[0,0,i,0],[0,0,0,1]]),f=l.x(m).x(p).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,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toCSS()},r=function(e,a,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toArray()},s=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},i=function(t,r){return r?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,r){return r?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:r(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:s,getMatrix:i,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:r,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 addEventListener(t,e){this.callbacks||(this.callbacks=[]),this.callbacks[t]||(this.callbacks[t]=[]),this.callbacks[t].push(e)}function triggerEvent(t,e){this.callbacks||(this.callbacks=[]);var a=0===this.callbacks.length?!0:!1,r=this;if(this.callbacks[t])if(a)setTimeout(function(){for(var a=0;a<r.callbacks[t].length;a++)r.callbacks[t][a](e)},0);else for(var s=0;s<this.callbacks[t].length;s++)this.callbacks[t][s](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var a,r="";for(a=t;a>0;--a)r+=e[Math.round(Math.random()*(e.length-1))];return r}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 RenderedFrame(t,e){this.tr=t,this.o=e}function createElement(t,e,a){if(!e){var r=Object.create(t.prototype,a),s={};return r&&"[object Function]"===s.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,r){var s={writable:!1,configurable:!1,enumerable:!1,value:a};if(r)for(var i in r)s[i]=r[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function defineAccessor(t,e,a){var r,s={enumerable:!1,configurable:!1,get:function(){return r},set:function(t){r=t}};if(a)for(var i in a)s[i]=a[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function bezFunction(){function t(t,e,a,r,s,i){return m.abs((a-t)*(i-e)-(s-t)*(r-e))<1e-5}function e(t){return l[t].fnc}function a(t,e,a,r,s){if(s||(s=("bez_"+t+"_"+e+"_"+a+"_"+r).replace(/\./g,"p")),l[s])return l[s];var i,n,o,h,p,d;return l[s]=function(s,l,c,f,u){var y=l/u;s=y;for(var g,v=0;++v<14&&(o=3*t,n=3*(a-t)-o,i=1-o-n,g=s*(o+s*(n+s*i))-y,!(m.abs(g)<.001));)s-=g/(o+s*(2*n+3*i*s));d=3*e,p=3*(r-e)-d,h=1-d-p;var b=s*(d+s*(p+s*h));return f*b+c},l[s]}function r(t){this.segmentLength=0,this.points=new Array(t)}function s(t,e){this.partialLength=t,this.point=e}function i(e){var a,i,n,o,h,l,p,d=e.s,c=e.e,f=e.to,u=e.ti,y=100,g=0,v=null;(d[0]!=c[0]||d[1]!=c[1])&&t(d[0],d[1],c[0],c[1],d[0]+f[0],d[1]+f[1])&&t(d[0],d[1],c[0],c[1],c[0]+u[0],c[1]+u[1])&&(y=2);var b=new r(y);for(n=f.length,a=0;y>a;a+=1){for(p=[],h=a/(y-1),l=0,i=0;n>i;i+=1)o=m.pow(1-h,3)*d[i]+3*m.pow(1-h,2)*h*(d[i]+f[i])+3*(1-h)*m.pow(h,2)*(c[i]+u[i])+m.pow(h,3)*c[i],p.push(o),null!==v&&(l+=m.pow(p[i]-v[i],2));l=m.sqrt(l),g+=l,b.points[a]=new s(l,p),v=p}b.segmentLength=g,e.bezierData=b}function n(t,e){var a=e.segments,r=a.length,s=m.floor((r-1)*t),i=t*e.addedLength,n=0;if(i==a[s].l)return a[s].p;for(var o=a[s].l>i?-1:1,h=!0;h;)a[s].l<=i&&a[s+1].l>i?(n=(i-a[s].l)/(a[s+1].l-a[s].l),h=!1):s+=o,(0>s||s>=r-1)&&(h=!1);return a[s].p+(a[s+1].p-a[s].p)*n}function o(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function h(t,e,a,r,s,i,h){var l=new o;s=0>s?0:s;var m=n(s,h);i=i>1?1:i;var p,d=n(i,h),c=t.length,f=1-m,u=1-d;for(p=0;c>p;p+=1)l.pt1[p]=f*f*f*t[p]+(m*f*f+f*m*f+f*f*m)*a[p]+(m*m*f+f*m*m+m*f*m)*r[p]+m*m*m*e[p],l.pt3[p]=f*f*u*t[p]+(m*f*u+f*m*u+f*f*d)*a[p]+(m*m*u+f*m*d+m*f*d)*r[p]+m*m*d*e[p],l.pt4[p]=f*u*u*t[p]+(m*u*u+f*d*u+f*u*d)*a[p]+(m*d*u+f*d*d+m*u*d)*r[p]+m*d*d*e[p],l.pt2[p]=u*u*u*t[p]+(d*u*u+u*d*u+u*u*d)*a[p]+(d*d*u+u*d*d+d*u*d)*r[p]+d*d*d*e[p];return l}var l=[],m=Math,p=function(){var e={};return function(a,r,s,i){var n=(a.join("_")+"_"+r.join("_")+"_"+s.join("_")+"_"+i.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,d,c,f=100,u=0,y=[],g=[],v={addedLength:0,segments:[]};for((a[0]!=r[0]||a[1]!=r[1])&&t(a[0],a[1],r[0],r[1],s[0],s[1])&&t(a[0],a[1],r[0],r[1],i[0],i[1])&&(f=2),l=s.length,o=0;f>o;o+=1){for(d=o/(f-1),c=0,h=0;l>h;h+=1)p=m.pow(1-d,3)*a[h]+3*m.pow(1-d,2)*d*s[h]+3*(1-d)*m.pow(d,2)*i[h]+m.pow(d,3)*r[h],y[h]=p,null!==g[h]&&(c+=m.pow(y[h]-g[h],2)),g[h]=y[h];c&&(c=m.sqrt(c),u+=c),v.segments.push({l:u,p:d})}return v.addedLength=u,e[n]=v,v}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:p,getNewSegment:h,buildBezierData:i}}function dataFunctionManager(){function t(t,e){var a,r,s,i=t.length;for(a=0;i>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(s=t[a].s.length,r=0;s>r;r+=1)t[a].s[r]*=e,void 0!==t[a].e&&(t[a].e[r]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function e(i,o){var h,l,m,p,d,c,f,y,v,b,E=i.length;for(c=0;E>c;c+=1)if(m=i[c],"ks"in m&&!m.completed){if(m.completed=!0,h=Math.round(m.op-m.st),l=m.st,m.tt&&(i[c-1].td=m.tt),m.renderedFrame={},m.renderedData={},p=[],d=-1,m.tm){m.trmp=m.tm;var C=new Array(Math.round(h));for(f=0;h>f;f+=1)C[f]=Math.floor(n(m.tm,f,l)*u);m.tm=C}if(m.ks.o instanceof Array?t(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?t(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?t(m.ks.r,g):m.ks.r*=g,m.hasMask){var D=m.masksProperties;for(y=D.length,f=0;y>f;f+=1)if(D[f].pt.i)s(D[f].pt);else for(b=D[f].pt.length,v=0;b>v;v+=1)D[f].pt[v].s&&s(D[f].pt[v].s[0]),D[f].pt[v].e&&s(D[f].pt[v].e[0])}0===m.ty?(m.layers=a(m.refId,o),e(m.layers,o)):4===m.ty&&r(m.shapes)}}function a(t,e){for(var a=0,r=e.length;r>a;){if(e[a].id===t)return e[a].layers;a+=1}}function r(e,a){var i,n,o,h,l=e.length,m=a?a:!1;for(i=l-1;i>=0;i-=1)if(e[i].renderedData=[],"tm"==e[i].ty&&(m=!0),"fl"==e[i].ty||"st"==e[i].ty)e[i].o instanceof Array?t(e[i].o,.01):e[i].o*=.01;else if("sh"==e[i].ty)if(e[i].trimmed=m,e[i].ks.i)s(e[i].ks);else for(o=e[i].ks.length,n=0;o>n;n+=1)e[i].ks[n].s&&(s(e[i].ks[n].s[0]),s(e[i].ks[n].e[0]));else"gr"==e[i].ty?r(e[i].it,m):"tr"==e[i].ty?(h=e[i],h.renderedData=[],h.o instanceof Array?t(h.o,.01):h.o/=100,h.s instanceof Array?t(h.s,.01):h.s/=100,h.r instanceof Array?t(h.r,g):h.r*=g):("rc"==e[i].ty||"el"==e[i].ty)&&(e[i].trimmed=m,e[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 i(t){t.__renderedFrames=new Array(Math.floor(t.tf)),t.__renderFinished=!1,u=t.fr,e(t.layers,t.comps)}function n(t,e,a,r,s,i){var n,o,h,l,m,p,d=0;if(!t.length){if(r)for(;i>0;)r[s+d]=t,d+=1,i-=1;return t}if(void 0===t[0].t){if(r)for(;i>0;)r[s+d]=t[d],d+=1,i-=1;return t}m=0,p=t.length-1;for(var c=1,f=!0;!(!f||(n=t[m],o=t[m+1],m==p-1&&e>=o.t-a)||o.t-a>e&&1==c);){if(o.t-a<e&&-1==c){m+=1,n=t[m],o=t[m+1];break}p-1>m&&1==c||m>0&&-1==c?m+=c:f=!1}n.to&&!n.bezierData&&bez.buildBezierData(n);var u,y,g,v,b,E=0;if(r||(h=[]),n.to){if(l=n.bezierData,e>=o.t-a||e<n.t-a){var C=e>=o.t-a?l.points.length-1:0;if(r)for(;i>0;)r[s+d]=l.points[C].point[d],d+=1,i-=1;return l.points[C].point}n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y,n.n),n.__fnct=b),g=b("",e-(n.t-a),0,1,o.t-a-(n.t-a));var D,w=l.segmentLength*g,x=0;for(c=1,f=!0,v=l.points.length;f;){if(x+=l.points[E].partialLength*c,0===w||0===g||E==l.points.length-1){if(r)for(;i>0;)r[s+d]=l.points[E].point[d],d+=1,i-=1;else h=l.points[E].point;break}if(w>x&&w<x+l.points[E+1].partialLength){if(D=(w-x)/l.points[E+1].partialLength,r)for(;i>0;)r[s+d]=l.points[E].point[d]+(l.points[E+1].point[d]-l.points[E].point[d])*D,d+=1,i-=1;else for(y=l.points[E].point.length,u=0;y>u;u+=1)h.push(l.points[E].point[u]+(l.points[E+1].point[u]-l.points[E].point[u])*D);break}v-1>E&&1==c||E>0&&-1==c?E+=c:f=!1}}else{var _,S,A,I,M,F=!1;for(p=n.s.length,m=0;p>m;m+=1)1!==n.h&&(n.o.x instanceof Array?(F=!0,n.__fnct||(n.__fnct=[]),n.__fnct[m]||(_=n.o.x[m]?n.o.x[m]:n.o.x[0],S=n.o.y[m]?n.o.y[m]:n.o.y[0],A=n.i.x[m]?n.i.x[m]:n.i.x[0],I=n.i.y[m]?n.i.y[m]:n.i.y[0])):(F=!1,n.__fnct||(_=n.o.x,S=n.o.y,A=n.i.x,I=n.i.y)),F?n.__fnct[m]?b=n.__fnct[m]:(b=bez.getEasingCurve(_,S,A,I),n.__fnct[m]=b):n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(_,S,A,I),n.__fnct=b),g=e>=o.t-a?1:e<n.t-a?0:b("",e-(n.t-a),0,1,o.t-a-(n.t-a))),M=1===n.h?n.s[m]:n.s[m]+(n.e[m]-n.s[m])*g,r?i>0&&(r[s+d]=M,d+=1,i-=1):1===p?h=M:h.push(M)}return h}function o(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,r=t.v,s=t.o,i=t.i,n=r.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(r[a],r[a+1],s[a],i[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(r[a],r[0],s[a],i[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function h(t,e,a,r,s,i){var n=i&&i.length>0,o={};o.closed=s?t.cl:t.closed;var h=s?t.pt:t.ks;if(h.v)return o.pathNodes=n?v(h,o.closed,i,!1):h,o;var l,m,p,d,c,f,u;if(e<h[0].t-a||e>h[h.length-1].t-a){var y,g,b,E;if(e<h[0].t-a?(E="__minValue",g=0,b=h.__minValue,y=h[g].s):(E="__maxValue",g=h.length-2,b=h.__maxValue,y=h[g].e),!b){for(m=h[g].s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=h[g].s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)c[p]=y[0].i[l][p],f[p]=y[0].o[l][p],u[p]=y[0].v[l][p];t.i[l]=c,t.o[l]=f,t.v[l]=u}h[E]=t,b=t}return o.pathNodes=n?v(b,o.closed,i,!1):b,o}var C,D=!1;h.__lastData?C=h.__lastData.pathNodes:D=!0;for(var w,x,_=0,S=h.length-1,A=1,I=!0;I&&(w=h[_],x=h[_+1],!(x.t-a>e&&1==A));)S-1>_&&1==A||_>0&&-1==A?_+=A:I=!1;var M;if(1!==w.h){var F;w.__fnct?F=w.__fnct:(F=bez.getEasingCurve(w.o.x,w.o.y,w.i.x,w.i.y),w.__fnct=F),M=e>=x.t-a?1:e<w.t-a?0:F("",e-(w.t-a),0,1,x.t-a-(w.t-a))}if(1===w.h&&w.__hValue)t=w.__hValue;else for(m=w.s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=w.s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)1===w.h?(c[p]=w.s[0].i[l][p],f[p]=w.s[0].o[l][p],u[p]=w.s[0].v[l][p]):(c[p]=w.s[0].i[l][p]+(w.e[0].i[l][p]-w.s[0].i[l][p])*M,f[p]=w.s[0].o[l][p]+(w.e[0].o[l][p]-w.s[0].o[l][p])*M,u[p]=w.s[0].v[l][p]+(w.e[0].v[l][p]-w.s[0].v[l][p])*M),C&&(C.i[l]&&C.o[l]&&C.v[l]&&C.i[l][p]===c[p]&&C.o[l][p]===f[p]&&C.v[l][p]===u[p]||(D=!0));t.i[l]=c,t.o[l]=f,t.v[l]=u,1===w.h&&(w.__hValue=t)}return n?o.pathNodes=v(t,o.closed,i,!1):(D?(o.pathNodes=t,h.__lastData=o):o.pathNodes=h.__lastData,o.pathNodes=t),o}function l(t,e,a){var r,s,i,o,m,d,c,f,g,v,E,C=t.length;for(f=0;C>f;f+=1)if(g=t[f],"ks"in t[f]){if(o=e-g.st,r={},r.a=n(g.ks.a,o,g.st),r.o=n(g.ks.o,o,g.st),g.ks.p.s?(n(g.ks.p.x,o,g.st,b,3,1),n(g.ks.p.y,o,g.st,b,4,1)):n(g.ks.p,o,g.st,b,3,2),n(g.ks.r,o,g.st,b,0,1),n(g.ks.s,o,g.st,b,1,2),c={},v=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]),E=!1,g.__lastRenderAn&&r.o===g.__lastRenderAn.tr.o&&r.a[0]===g.__lastRenderAn.tr.a[0]&&r.a[1]===g.__lastRenderAn.tr.a[1]&&v[1]===g.__lastRenderAn.matrixArray[1]&&v[2]===g.__lastRenderAn.matrixArray[2]&&v[3]===g.__lastRenderAn.matrixArray[3]&&v[4]===g.__lastRenderAn.matrixArray[4]&&v[5]===g.__lastRenderAn.matrixArray[5]?c.an=g.__lastRenderAn:(c.an={tr:r},c.an.matrixArray=v,g.__lastRenderAn=c.an),g.renderedData[o]=c,g.hasMask)for(s=g.masksProperties,d=s.length,m=0;d>m;m+=1)s[m].paths||(s[m].paths=[],s[m].opacity=[]),s[m].paths[o]=h(s[m],o,g.st,a,!0),s[m].opacity[o]=n(s[m].o,o,g.st),s[m].opacity[o]=s[m].opacity[o]instanceof Array?s[m].opacity[o][0]/100:s[m].opacity[o]/100;e<g.ip||e>g.op||(0===g.ty?(i=g.tm?g.tm[o]<0?0:o>=g.tm.length?g.tm[g.tm.length-1]:g.tm[o]:o,void 0===i&&(i=n(g.trmp,o,0)[0]*u,g.tm[o]=i),l(g.layers,i,a)):4===g.ty&&p(g.shapes,o,g.st,a))}}function m(t,e,a,r){a=Math.min(e[0],e[1],a/2);var s=new Array(8),i=new Array(8),n=new Array(8),o=a/2;return 2===r?(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=s[0],i[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],s[1]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[1]=[t[0]+e[0]/2,t[1]+e[1]/2-o],i[1]=s[1],s[2]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[2]=s[2],i[2]=[t[0]+e[0]/2-o,t[1]+e[1]/2],s[3]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[3]=[t[0]-e[0]/2+o,t[1]+e[1]/2],i[3]=s[3],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=s[4],i[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],s[5]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[5]=[t[0]-e[0]/2,t[1]-e[1]/2+o],i[5]=s[5],s[6]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[6]=s[6],i[6]=[t[0]-e[0]/2+o,t[1]-e[1]/2],s[7]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[7]=[t[0]+e[0]/2-o,t[1]-e[1]/2],i[7]=s[7]):(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],i[0]=s[0],s[1]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[1]=s[1],i[1]=[t[0]+e[0]/2-o,t[1]-e[1]/2],s[2]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[2]=[t[0]-e[0]/2+o,t[1]-e[1]/2],i[2]=s[2],s[3]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[3]=s[3],i[3]=[t[0]-e[0]/2,t[1]-e[1]/2+o],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],i[4]=s[4],s[5]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[5]=s[5],i[5]=[t[0]-e[0]/2+o,t[1]+e[1]/2],s[6]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[6]=[t[0]+e[0]/2-o,t[1]+e[1]/2],i[6]=s[6],s[7]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[7]=s[7],i[7]=[t[0]+e[0]/2,t[1]+e[1]/2-o]),{v:s,o:n,i:i,c:!0}}function p(t,e,a,r,s){var i,o,l,c,f,u,g,E,C,D,w=t.length;s||(s=[]);var x,_,S,A,I;for(i=w-1;i>=0;i-=1)if(o=t[i],"sh"==o.ty)o.renderedData[e]={path:h(o,e,a,r,!1,s)};else if("fl"==o.ty)l=n(o.c,e,a),c=n(o.o,e,a),o.renderedData[e]={opacity:c instanceof Array?c[0]:c},"canvas"==r?(d(l),o.renderedData[e].color=l):o.renderedData[e].color=rgbToHex(Math.round(l[0]),Math.round(l[1]),Math.round(l[2]));else if("rc"==o.ty)f=n(o.p,e,a),u=n(o.s,e,a),g=n(o.r,e,a),o.trimmed?(o.closed=!0,o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(m(f,u,g,o.d),!0,s,!1)):o.renderedData[e]={position:f,size:u,roundness:g};else if("el"==o.ty){if(f=n(o.p,e,a),u=n(o.s,e,a),o.renderedData[e]={p:f,size:u},"svg"==r){var M={v:new Array(4),i:new Array(4),o:new Array(4)};2!==o.d&&3!==o.d?(M.v[0]=[f[0],f[1]-u[1]/2],M.i[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.o[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]+u[0]/2,f[1]],M.i[1]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.o[1]=[f[0]+u[0]/2,f[1]+u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.i[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.o[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]-u[0]/2,f[1]],M.i[3]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.o[3]=[f[0]-u[0]/2,f[1]-u[1]/2*.55]):(M.v[0]=[f[0],f[1]-u[1]/2],M.o[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.i[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]-u[0]/2,f[1]],M.o[1]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.i[1]=[f[0]-u[0]/2,f[1]-u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.o[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.i[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]+u[0]/2,f[1]],M.o[3]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.i[3]=[f[0]+u[0]/2,f[1]+u[1]/2*.55]),o.trimmed?(o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(M,!0,s,!1),o.closed=!0):(o.renderedData[e].path={pathNodes:M},o.closed=!0)}}else if("st"==o.ty){if(E=n(o.c,e,a),C=n(o.o,e,a),D=n(o.w,e,a),o.renderedData[e]={opacity:C instanceof Array?C[0]:C,width:D instanceof Array?D[0]:D},o.d){var F=[];I=o.d.length;var P;for(A=0;I>A;A+=1)P=n(o.d[A].v,e,a),F.push({v:P instanceof Array?P[0]:P,n:o.d[A].n});o.renderedData[e].dashes=F}"canvas"==r?(d(E),o.renderedData[e].color=E):o.renderedData[e].color=rgbToHex(Math.round(E[0]),Math.round(E[1]),Math.round(E[2]))}else if("tr"==o.ty)o.renderedData[e]={a:n(o.a,e,a),o:n(o.o,e,a)},n(o.s,e,a,b,1,2),n(o.r,e,a,b,0,1),n(o.p,e,a,b,3,2),o.renderedData[e].mtArr=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]);else if("tm"==o.ty){x=n(o.s,e,a),_=n(o.e,e,a),S=n(o.o,e,a);var k={s:x,e:_,o:S};s.push(k),o.renderedData[e]=k}else"gr"==o.ty&&p(o.it,e,a,r,s)}function d(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function c(t,e){for(var a=1;a>0;){if(e+=1,e>=Math.floor(t.tf)){t.__renderFinished=!0;break}t.__renderedFrames[e]||(f(t,e),a-=1)}}function f(t,e){return 2==t.__renderedFrames[e]?void(t.__renderFinished||c(t,e)):(u=t.fr,t.__renderedFrames[e]=2,void l(t.layers,e,t._animType))}var u=0,y=new MatrixManager,g=Math.PI/180,v=function(){function t(t,i,n,o,p){r[h]=i,e[h+1]=n,a[h+1]=o,l?a[h]=t:(m+=" M"+t.join(","),l=!0,s[h]=t),m+=" C"+i.join(",")+" "+n.join(",")+" "+o.join(","),h+=1}var e,a,r,s,i,n,h,l=!1,m="";return function(p,d,c,f){o(p,d);var u,y=c.length,g=p;a=e=r=s=null;var v,b,E,C,D;for(u=y-1;u>=0;u-=1){var w=[],x=c[u].o%360/360;if(0!==x||0!==c[u].s||100!=c[u].e){m="",l=!1,e=[],r=[],a=[],s=[],i=[],n=0,0>x&&(x+=1);var _=c[u].s/100+x,S=c[u].e/100+x;if(_==S)return f?"":{};if(_>S){var A=_;_=S,S=A}1>=S?w.push({s:g.__totalLength*_,e:g.__totalLength*S}):_>=1?w.push({s:g.__totalLength*(_-1),e:g.__totalLength*(S-1)}):(w.push({s:g.__totalLength*_,e:g.__totalLength}),w.push({s:0,e:g.__totalLength*(S-1)})),v=[],b=[],E=[];var I;v=g.v,b=g.o,E=g.i,I=g.__lengths,D=v.length;var M,F,P=0,k=0,N=w.length;for(h=0,M=0;N>M;M+=1){for(P=0,C=1;D>C;C++)if(k=I[C-1].addedLength,P+k<w[M].s)P+=k;else{if(P>w[M].e)break;w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[C],v[C],I[C-1]):(F=bez.getNewSegment(v[C-1],v[C],b[C-1],E[C],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2)),P+=k}d!==!1?P<=w[M].e&&(k=I[C-1].addedLength,w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[0],v[0],I[C-1]):(F=bez.getNewSegment(v[C-1],v[0],b[C-1],E[0],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2))):l=!1}d=!1}}if(a?(v=a,b=r,E=e):(v=g.v,b=g.o,E=g.i,s=[]),D=v.length,f){for(m="",C=1;D>C;C++)s[C-1]?m+="M"+s[C-1].join(","):1==C&&(m+="M"+v[0].join(",")),m+=" C"+b[C-1].join(",")+" "+E[C].join(",")+" "+v[C].join(",");return d!==!1&&(m+=" C"+b[C-1].join(",")+" "+E[0].join(",")+" "+v[0].join(",")),m}return{i:E,o:b,v:v,s:s,c:d}}}(),b=[0,1,1,0,0],E={};return E.completeData=i,E.renderFrame=f,E}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.destroyed=!1}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,r=15;for(a=0;r>a;a+=1)this.contextData.saved[a]=new Array(6);this.elements=[]}function MaskElement(t,e,a){this.data=t,this.storedData=[],this.element=e,this.globalData=a,this.paths=[],this.registeredEffects=[],this.masksProperties=[],this.maskElement=null}function ICompElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r),this.layers=t.layers}function IImageElement(t,e,a,r){this.assetData=a.getAssetData(t.ll),this.path=a.getPath(),this.parent.constructor.call(this,t,e,a,r)}function IShapeElement(t,e,a,r){this.shapes=[],this.parent.constructor.call(this,t,e,a,r)}function ShapeItemElement(t,e,a,r,s){this.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},this.stylesList=[],this.viewData=[],this.shape=e,this.parentContainer=a,this.placeholder=r,this.data=t,this.globalData=s,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}function ITextElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}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.assetData=this.animationItem.getAssetData(t.ll),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.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},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 r,s=this.dataLength-1;this.renderedPaths=new Array(this.globalData.totalFrames);var i;for(r=s;r>=0;r-=1)"gr"==this.data[r].ty?this.data[r].item=new CVShapeItemElement(this.data[r].it,!1,this.globalData):("st"==this.data[r].ty||"fl"==this.data[r].ty)&&(i={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[r].ty?i.type="fill":(i.type="stroke",i.width=0,i.lc=this.lcEnum[this.data[r].lc]||"round",i.lj=this.ljEnum[this.data[r].lj]||"round",1==this.data[r].lj&&(i.ml=this.data[r].ml)),this.stylesPool.push(i))}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),r=2*(a.x*t+a.y*e);return t-=r*a.x,e-=r*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 1==t?this:this._t(t,0,0,1,0,0)},scaleY:function(t){return 1==t?this: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,r,s,i){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=r,this.props[4]=s,this.props[5]=i,this._x()},translate:function(t,e){return 0===t&&0===e?this: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,r,s,i){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*r,this.props[3]=this.b1*a+this.d1*r,this.props[4]=this.a1*s+this.c1*i+this.e1,this.props[5]=this.b1*s+this.d1*i+this.f1,this},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,r=t.c,s=t.d,i=t.e,n=t.f,o=new Matrix,h=e*s-a*r;return o.a=s/h,o.b=-a/h,o.c=-r/h,o.d=e/h,o.e=(r*n-s*i)/h,o.f=-(e*n-a*i)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix;return s.a=r.a+(t.a-r.a)*e,s.b=r.b+(t.b-r.b)*e,s.c=r.c+(t.c-r.c)*e,s.d=r.d+(t.d-r.d)*e,s.e=r.e+(t.e-r.e)*e,s.f=r.f+(t.f-r.f)*e,s._x()},interpolateAnim:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix,i=r.decompose(),n=t.decompose(),o=i.rotation+(n.rotation-i.rotation)*e,h=i.translate.x+(n.translate.x-i.translate.x)*e,l=i.translate.y+(n.translate.y-i.translate.y)*e,m=i.scale.x+(n.scale.x-i.scale.x)*e,p=i.scale.y+(n.scale.y-i.scale.y)*e;return s.translate(h,l),s.rotate(o),s.scale(m,p),s._x()},decompose:function(t){var e=this.props[0],a=this.props[1],r=this.props[2],s=this.props[3],i=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},m=0,p={x:1,y:1},d={x:0,y:0},c=e*s-a*r;if(t)e?(d={x:n(r/e),y:n(a/e)},p={x:e,y:c/e}):a?(m=.5*h,p={x:a,y:c/a},d.x=n(s/a)):(p={x:r,y:s},d.x=.25*h);else if(e||a){var f=o(e*e+a*a);m=a>0?i(e/f):-i(e/f),p={x:f,y:c/f},d.x=n((e*r+a*s)/(f*f))}else if(r||s){var u=o(r*r+s*s);m=.5*h-(s>0?i(-r/u):-i(r/u)),p={x:c/u,y:u},d.y=n((e*r+a*s)/(u*u))}else p={x:0,y:0};return{scale:p,translate:l,rotation:m,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,r=0,s=[];if("number"==typeof t[0])for(a=t.length;a>r;)e=this.applyToPoint(t[r++],t[r++]),s.push(e.x,e.y);else for(a=t.length,r=0;a>r;r++)s.push(this.applyToPoint(t[r].x,t[r].y));return s},applyToTypedArray:function(t,e){for(var a,r=0,s=t.length,i=e?new Float64Array(s):new Float32Array(s);s>r;)a=this.applyToPoint(t[r],t[r+1]),i[r++]=a.x,i[r++]=a.y;return i},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,r,s,i,n,o){this.save(),this.translate(t,e),this.rotate(s),this.scale(a,r),this.arc(0,0,1,i,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,r=[];for(e=0;a>e;e+=1)r.push(arguments[e]);this.ops_.push({type:t,args:r})}}for(var a=CanvasRenderingContext2D.prototype,r=BM_CanvasRenderingContext2D.prototype,s=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],i=0;i<s.length;i++){var n=s[i];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;r.fill=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];"transform"==s.type?this.renderer.ctxTransform(s.args):"save"==s.type?this.renderer.save():"restore"==s.type?this.renderer.restore():this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);o.apply(this.renderer.canvasContext,i)}else o.apply(this.renderer.canvasContext,arguments)},r.stroke=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}h.call(this.renderer.canvasContext)}else h.call(this.renderer.canvasContext)},r.clip=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);l.apply(this.renderer.canvasContext,i)}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,a){var r=(new Date).getTime(),s=Math.max(0,16-(r-t)),i=window.setTimeout(function(){e(r+s)},s);return t=r+s,i}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},bm_rnd=Math.round,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,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+a[t]+a[e]+a[r]}}(),fillColorToString=function(){var t=[];return function(e,a){return void 0!==a&&(e[3]=a),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.createItem=function(t,e,a){switch(t.ty){case 2:return this.createImage(t,e,a);case 0:return this.createComp(t,e,a);case 1:return this.createSolid(t,e,a);case 4:return this.createShape(t,e,a);case 5:return this.createText(t,e,a);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e)},SVGRenderer.prototype.buildItems=function(t,e,a,r){var s,i=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var n;for(s=i-1;s>=0;s--)a[s]=this.createItem(t[s],e,r),0===t[s].ty&&(n=[],
+this.buildItems(t[s].layers,a[s].getDomElement(),n,r),a[s].setElements(n)),t[s].td&&a[s+1].setMatte(a[s].layerId)},SVGRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var i,n,o,h=a.length;for(r=0;s>r;r+=1)for(i=0;h>i;){if(a[i].data.id==t[r].id){o=a[i],a[i]=this.createItem(t[r],e,o),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,a[i].getDomElement(),n,o),a[i].setElements(n));break}i+=1}},SVGRenderer.prototype.createBase=function(t,e,a){return new BaseElement(t,e,this.globalData,a)},SVGRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e,a){return new IShapeElement(t,e,this.globalData,a)},SVGRenderer.prototype.createText=function(t,e,a){return new ITextElement(t,e,this.globalData,a)},SVGRenderer.prototype.createImage=function(t,e,a){return new IImageElement(t,e,this.globalData,a)},SVGRenderer.prototype.createComp=function(t,e,a){return new ICompElement(t,e,this.globalData,a)},SVGRenderer.prototype.createSolid=function(t,e,a){return new ISolidElement(t,e,this.globalData,a)},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.w),this.animationItem.container.setAttribute("height",t.h),this.animationItem.container.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transform="translate3d(0,0,0)",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),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.compSize={w:t.w,h:t.h};var a=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var s="animationMask_"+randomString(10);a.setAttribute("id",s),a.appendChild(r);var i=document.createElementNS(svgNS,"g");i.setAttribute("clip-path","url(#"+s+")"),this.animationItem.container.appendChild(i),e.appendChild(a),this.animationItem.container=i,this.layers=t.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var r,s,i=e.length;for(a||(a=this.elements),r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemParenting(s,a[r],e,s.parent,a,!0),0===s.ty&&this.buildStage(a[r].getComposingElement(),s.layers,a[r].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,r,s,i){t.parents||(t.parents=[]),i&&e.resetHierarchy();for(var n=0,o=a.length;o>n;)a[n].ind==r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemParenting(t,e,a,a[n].parent,s,!1)),n+=1},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t&&!this.destroyed){null===t?t=this.lastFrame: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].st);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.createItem=function(t){switch(t.ty){case 0:return this.createComp(t);case 1:return this.createSolid(t);case 2:return this.createImage(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 99:return this.createPlaceHolder(t);default:return this.createBase(t)}return this.createBase(t,parentContainer)},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,r=t.length;for(a=0;r>a;a++)if(e[a]=this.createItem(t[a]),0===t[a].ty){var s=[];this.buildItems(t[a].layers,s),e[e.length-1].setElements(s)}},CanvasRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements);var i,n,o=a.length;for(r=0;s>r;r+=1)for(i=0;o>i;){if(a[i].data.id==t[r].id){a[i]=this.createItem(t[r],e),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,n),a[i].setElements(n));break}i+=1}},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.createPlaceHolder=function(t){return new PlaceHolderElement(t,null,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*=0>t?0:t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=0>t?0: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]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(6));var a,r=6,s=this.contextData.saved[this.contextData.cArrPos];for(a=0;r>a;a+=1)s[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],r=6,s=this.contextData.cTr.props;for(e=0;r>e;e+=1)s[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.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,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,r=this.transformCanvas.w/this.transformCanvas.h;r>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 r,s,i=e.length;for(r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemHierarchy(s,a[r],e,s.parent,a,!0),0==s.ty&&this.buildStage(null,s.layers,a[r].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,r,s,i){var n=0,o=a.length;for(i&&e.resetHierarchy();o>n;)a[n].ind===r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemHierarchy(t,e,a,a[n].parent,s,!1)),n+=1},CanvasRenderer.prototype.prepareFrame=function(t){if(!this.destroyed){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw()},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.bmCtx=null,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){this.lastFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||(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.masksProperties=this.data.masksProperties;var t,e,a,r,s,i=this.element.maskedElement,n=this.globalData.defs,o=this.masksProperties.length,h=this.data.masksProperties,l=0,m=[],p=randomString(10);for(this.maskElement=document.createElementNS(svgNS,"mask"),t=0;o>t;t++)if("s"!=h[t].mode&&"i"!=h[t].mode||0!=l||(s=document.createElementNS(svgNS,"rect"),s.setAttribute("fill","#ffffff"),s.setAttribute("x","0"),s.setAttribute("y","0"),s.setAttribute("width","100%"),s.setAttribute("height","100%"),m.push(s)),!("f"==h[t].mode&&l>0||"n"==h[t].mode)){if(l+=1,e=document.createElementNS(svgNS,"path"),h[t].cl?"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"):(e.setAttribute("fill","none"),"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"),e.setAttribute("stroke-width","1"),e.setAttribute("stroke-miterlimit","10")),e.setAttribute("clip-rule","nonzero"),this.storedData[t]={elem:e,lastPath:""},"i"==h[t].mode){r=m.length;var d=document.createElementNS(svgNS,"g");for(a=0;r>a;a+=1)d.appendChild(m[a]);var c=document.createElementNS(svgNS,"mask");c.setAttribute("mask-type","alpha"),c.setAttribute("id",p+"_"+l),c.appendChild(e),n.appendChild(c),d.setAttribute("mask","url(#"+p+"_"+l+")"),m.length=0,m.push(d)}else m.push(e);h[t].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath())}for(o=m.length,t=0;o>t;t+=1)this.maskElement.appendChild(m[t]);this.maskElement.setAttribute("id",p),l>0&&i.setAttribute("mask","url(#"+p+")"),n.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length,r=0;for(e=0;a>e;e++)"f"==this.data.masksProperties[e].mode&&r>0||"n"==this.data.masksProperties[e].mode||(r+=1,this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes,this.storedData[e]))},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,r=this.registeredEffects.length;for(a=0;r>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.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,a){var r,s,i="";if(e.__renderedString)i=e.__renderedString;else{for(s=e.v.length,r=1;s>r;r+=1)1==r&&(i+=" M"+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[r][0])+","+bm_rnd(e.i[r][1])+" "+bm_rnd(e.v[r][0])+","+bm_rnd(e.v[r][1]);t.cl&&(i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),e.__renderedString=i}a.lastPath!==i&&(t.inv?a.elem.setAttribute("d",this.solidPath+i):a.elem.setAttribute("d",i),a.lastPath=i)},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.registeredEffects=null,this.masksProperties=null};var BaseElement=function(t,e,a,r){this.globalData=a,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.matteElement=null,this.lastData={},this.renderedFrames=[],this.parentContainer=e,this.layerId=r?r.layerId:"ly_"+randomString(10),this.hidden=!1,this.placeholder=r,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},BaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},BaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var a=document.createElementNS(svgNS,"filter"),r=randomString(10);a.setAttribute("id",r),a.setAttribute("filterUnits","objectBoundingBox"),a.setAttribute("x","0%"),a.setAttribute("y","0%"),a.setAttribute("width","100%"),a.setAttribute("height","100%");var s=document.createElementNS(svgNS,"feComponentTransfer");s.setAttribute("in","SourceGraphic"),a.appendChild(s);var i=document.createElementNS(svgNS,"feFuncA");i.setAttribute("type","table"),i.setAttribute("tableValues","1.0 0.0"),s.appendChild(i),this.globalData.defs.appendChild(a);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+r+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.appendNodeToParent(this.matteElement)):this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.appendNodeToParent(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){if(this.data.renderedData[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(!this.data.renderedData[t]||3===this.data.ty)return!1;if(this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff,t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o;var a,r=this.finalTransform.mat;if(e&&(a=e.mat.props,r.reset().transform(a[0],a[1],a[2],a[3],a[4],a[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var s,i=this.hierarchy.length;for(e||r.reset(),s=i-1;s>=0;s-=1)a=this.hierarchy[s].ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5]);a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])}else this.isVisible&&(e?(a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])):(r.props[0]=this.ownMatrix.props[0],r.props[1]=this.ownMatrix.props[1],r.props[2]=this.ownMatrix.props[2],r.props[3]=this.ownMatrix.props[3],r.props[4]=this.ownMatrix.props[4],r.props[5]=this.ownMatrix.props[5]));if(this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===n&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(n,this.finalTransform.opacity)}var o=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=o.tr&&this.layerElement.setAttribute("transform",o.tr),this.lastData.o!==o.o&&this.layerElement.setAttribute("opacity",o.o),this.lastData=o}return this.isVisible},BaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData),this.maskManager.init()},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 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},BaseElement.prototype.hide=function(){};var PlaceHolderElement=function(t,e,a){if(this.data=t,this.globalData=a,e){this.parentContainer=e;var r=document.createElementNS(svgNS,"g");r.setAttribute("id",this.data.id),e.appendChild(r),this.phElement=r}this.layerId="ly_"+randomString(10)};PlaceHolderElement.prototype.prepareFrame=function(){},PlaceHolderElement.prototype.renderFrame=function(){},PlaceHolderElement.prototype.draw=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 r,s=this.layers.length,i=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(r=0;s>r;r+=1)this.elements[r].prepareFrame(i-this.layers[r].st);for(r=0;s>r;r+=1)this.data.hasMask?this.elements[r].renderFrame(i-this.layers[r].st):this.elements[r].renderFrame(i-this.layers[r].st,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this.parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t].destroy()},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.assetData.p),t.maskedElement=t.image},a=new Image;a.addEventListener("load",e,!1),a.addEventListener("error",e,!1),a.src=this.path+this.assetData.p,this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.assetData.w+"px"),this.image.setAttribute("height",this.assetData.h+"px"),this.layerElement===this.parentContainer?this.appendNodeToParent(this.image):this.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||(this.image.setAttribute("visibility","hidden"),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&&(this.lastData.o=-1,this.hidden=!1,this.image.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.image.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.image.setAttribute("opacity",s.o),this.lastData=s}},IImageElement.prototype.destroy=function(){this.parent.destroy.call(),this.image=null},createElement(BaseElement,IShapeElement),IShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix},IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.parentContainer,this.placeholder,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,this.transformHelper,null,null,!0):this.mainShape.renderShape(t,this.finalTransform,null,null,!0)},IShapeElement.prototype.destroy=function(){this.parent.destroy.call(),this.mainShape.destroy()},ShapeItemElement.prototype.appendNodeToParent=BaseElement.prototype.appendNodeToParent,ShapeItemElement.prototype.searchShapes=function(t,e){var a,r,s,i=t.length-1,n=[];for(a=i;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");"st"==t[a].ty&&(o.setAttribute("stroke-linecap",this.lcEnum[t[a].lc]||"round"),o.setAttribute("stroke-linejoin",this.ljEnum[t[a].lj]||"round"),1==t[a].lj&&o.setAttribute("stroke-miterlimit",t[a].ml)),this.shape===this.parentContainer?this.appendNodeToParent(o):this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:"",ld:""}),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:""}},s=this.stylesList.length,r=0;s>r;r+=1)this.stylesList[r].closed||(e[a].styles.push(this.stylesList[r]),"st"==this.stylesList[r].type&&this.stylesList[r].pathElement.setAttribute("fill-opacity",0));for(i=n.length,a=0;i>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","M 0,0"),this.stylesList[t].ld="M 0,0"},ShapeItemElement.prototype.renderShape=function(t,e,a,r,s){var i,n;if(!a)for(a=this.data,n=this.stylesList.length,i=0;n>i;i+=1)this.stylesList[i].d="";r||(r=this.viewData),this.frameNum=t,n=a.length-1;var o,h;for(o=e,i=n;i>=0;i-=1)if("tr"==a[i].ty){var l=a[i].renderedData[t].mtArr;if(o=r[i].transform,h=o.mat,h.reset(),e){var m=e.mat.props;o.opacity=e.opacity,o.opacity*=a[i].renderedData[t].o,h.transform(m[0],m[1],m[2],m[3],m[4],m[5])}else o.opacity=a[i].renderedData[t].o;h.transform(l[0],l[1],l[2],l[3],l[4],l[5]).translate(-a[i].renderedData[t].a[0],-a[i].renderedData[t].a[1])}else"sh"==a[i].ty?this.renderPath(a[i],r[i],t,o):"el"==a[i].ty?this.renderPath(a[i],r[i],t,o):"rc"==a[i].ty?a[i].trimmed?this.renderPath(a[i],r[i],t,o):this.renderRect(a[i],r[i],t,o):"fl"==a[i].ty?this.renderFill(a[i],r[i],t,o):"st"==a[i].ty?this.renderStroke(a[i],r[i],t,o):"gr"==a[i].ty?this.renderShape(t,o,a[i].it,r[i].it):"tm"==a[i].ty;if(s)for(n=this.stylesList.length,i=0;n>i;i+=1)""==this.stylesList[i].d&&""!==this.stylesList[i].ld?(this.stylesList[i].pathElement.setAttribute("d","M 0,0"),this.stylesList[i].ld=this.stylesList[i].d):this.stylesList[i].ld!==this.stylesList[i].d&&(this.stylesList[i].pathElement.setAttribute("d",this.stylesList[i].d),this.stylesList[i].ld=this.stylesList[i].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,r){var s,i;if(!e.renderedFrames[this.globalData.frameNum]){var n=t.renderedData[a].path.pathNodes;if(!n.v)return;s=n.v.length;var o=n.s?n.s:[],h="";for(i=1;s>i;i+=1)o[i-1]?h+=" M"+bm_rnd(o[i-1][0])+","+bm_rnd(o[i-1][1]):1==i&&(h+=" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[i][0])+","+bm_rnd(n.i[i][1])+" "+bm_rnd(n.v[i][0])+","+bm_rnd(n.v[i][1]);1==s&&(h+=o[0]?" M"+bm_rnd(o[0][0])+","+bm_rnd(o[0][1]):" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),!t.closed||t.trimmed&&!n.c||(h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[0][0])+","+bm_rnd(n.i[0][1])+" "+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(s=e.styles.length,i=0;s>i;i+=1)e.styles[i].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld}var o=e.renderedFrames[this.globalData.frameNum];e.lastData.c!=o.c&&(i.pathElement.setAttribute("fill",o.c),e.lastData.c=o.c),e.lastData.o!=o.o&&(i.pathElement.setAttribute("fill-opacity",o.o),e.lastData.o=o.o),e.lastData.t!=o.t&&(i.pathElement.setAttribute("transform",o.t),e.lastData.t=o.t)},ShapeItemElement.prototype.renderStroke=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.w===s.width&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,w:s.width,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld,s.dashes&&(e.renderedFrames[this.globalData.frameNum].d=s.dashes)}var o,h,l=e.renderedFrames[this.globalData.frameNum],m=l.c,p=l.o,d=l.w,c=l.d,n=l.t;if(c){var f,u=c.length;for(o="",h="",f=0;u>f;f+=1)"o"!=c[f].n?o+=" "+c[f].v:h+=c[f].v;e.lastData.da!=o&&(i.pathElement.setAttribute("stroke-dasharray",o),e.lastData.da=o),e.lastData["do"]!=h&&(i.pathElement.setAttribute("stroke-dashoffset",h),e.lastData["do"]=h)}e.lastData.c!=m&&(i.pathElement.setAttribute("stroke",m),e.lastData.c=m),e.lastData.o!=p&&(i.pathElement.setAttribute("stroke-opacity",p),e.lastData.o=p),e.lastData.w!==d&&(i.pathElement.setAttribute("stroke-width",d),e.lastData.w=d),e.lastData.t!==n&&(i.pathElement.setAttribute("transform",n),e.lastData.t=n)},ShapeItemElement.prototype.destroy=function(t,e){this.shape=null,this.data=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement===this.parentContainer?this.appendNodeToParent(t):this.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||(this.rectElement.setAttribute("visibility","hidden"),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.hidden=!1,this.rectElement.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.rectElement.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.rectElement.setAttribute("opacity",s.o),this.lastData=s}},ICompElement.prototype.destroy=function(){this.parent.destroy.call(),this.rectElement=null},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.parent.createElements.call(this)},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){if(!this.data.renderedData[t])return!1;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.ip-this.data.st<=t&&this.data.op-this.data.st>=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(3!==this.data.ty){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 r,s=this.hierarchy.length;for(t||a.reset(),r=s-1;r>=0;r-=1)e=this.hierarchy[r].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.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},CVBaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},CVBaseElement.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,r=this.elements.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(a=0;r>a;a+=1)this.elements[a].prepareFrame(s-this.layers[a].st)}},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},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this.parent.destroy.call()},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.assetData.p,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)}},CVImageElement.prototype.destroy=function(){this.img=null,this.animationItem=null,this.parent.destroy.call()},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)},CVShapeElement.prototype.destroy=function(){this.mainShape.destroy(),this.parent.destroy.call()},CVShapeItemElement.prototype.drawPaths=function(t){var e,a;t?(a=[],e=this.stylesList):e=this.renderedPaths[this.globalData.frameNum];var r,s=e.length,i=this.canvasContext;for(this.globalData.renderer.save(),r=0;s>r;r+=1)"stroke"==e[r].type?(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.lineCap=e[r].lc,i.lineJoin=e[r].lj,i.miterLimit=e[r].ml,i.strokeStyle=e[r].value,i.lineWidth=e[r].width,e[r].dasharray?(i.setLineDash(e[r].dasharray),i.lineDashOffset=e[r].dashoffset):(i.setLineDash([]),i.lineDashOffset=0),this.globalData.bmCtx.stroke(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&(a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,width:e[r].width,path:e[r].path}),e[r].dasharray&&(a[a.length-1].dasharray=e[r].dasharray,a[a.length-1].dashoffset=e[r].dashoffset))):"fill"==e[r].type&&(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.fillStyle=e[r].value,this.globalData.bmCtx.fill(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,path:e[r].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,r;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),r=this.dataLength-1,a=r;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(r=this.ownStylesList.length,a=0;r>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,r=new BM_Path2D,s=a.pathNodes;if(s instanceof Array&&(s=s[0]),s.v){var i,n=s.v.length,o=s.s?s.s:[];for(i=1;n>i;i+=1)o[i-1]?r.moveTo(bm_rnd(o[i-1][0]),bm_rnd(o[i-1][1])):1==i&&r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[i][0]),bm_rnd(s.i[i][1]),bm_rnd(s.v[i][0]),bm_rnd(s.v[i][1]));1==n&&(o[0]?r.moveTo(bm_rnd(o[0][0]),bm_rnd(o[0][1])):r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1]))),!t.closed||t.trimmed&&!s.c||r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[0][0]),bm_rnd(s.i[0][1]),bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),this.addPathToStyles(r)}},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],r=a.roundness;if(0===r)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var s=a.position[0]-a.size[0]/2,i=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];r instanceof Array&&(r=r[0]),r>n/2&&(r=n/2),r>o/2&&(r=o/2),e.moveTo(s+r,i),e.lineTo(s+n-r,i),e.quadraticCurveTo(s+n,i,s+n,i+r),e.lineTo(s+n,i+o-r),e.quadraticCurveTo(s+n,i+o,s+n-r,i+o),e.lineTo(s+r,i+o),e.quadraticCurveTo(s,i+o,s,i+o-r),e.lineTo(s,i+r),e.quadraticCurveTo(s,i,s+r,i)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,r=!0,s=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>s&&this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(s=this.stylesList[e].width)):r&&"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&&(r=!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,r=e.dashes,s=r.length,i=[],n="";for(a=0;s>a;a+=1)"o"!=r[a].n?i.push(r[a].v):n=r[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=i,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},CVShapeItemElement.prototype.destroy=function(){this.data=null,this.globalData=null,this.canvasContext=null},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.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.parent.createElements.call(this)},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,r=new BM_Path2D,s=this.data.masksProperties.length;for(e=new BM_Path2D,a=0;s>a;a++)this.masksProperties[a].inv&&this.createInvertedMask(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes),this.drawShape(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes);e.addPath(r,t.mat.props),this.renderedFrames[this.globalData.frameNum]=e}this.globalData.bmCtx.clip(e)},CVMaskElement.prototype.drawShape=function(t,e){var a,r=e.v.length;for(t.moveTo(bm_rnd(e.v[0][0]),bm_rnd(e.v[0][1])),a=1;r>a;a++)t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[a][0]),bm_rnd(e.i[a][1]),bm_rnd(e.v[a][0]),bm_rnd(e.v[a][1]));t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[0][0]),bm_rnd(e.i[0][1]),bm_rnd(e.v[0][0]),bm_rnd(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)},CVMaskElement.prototype.destroy=function(){this.ctx=null};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;b>e;){if(y[e].elem==t&&null!==y[e].elem)return y[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),y.push({elem:t,animation:a}),b+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),y.push({elem:null,animation:e}),b+=1,e}function a(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setSpeed(t,e)}function r(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setDirection(t,e)}function s(t){var e;for(e=0;b>e;e+=1)y[e].animation.play(t)}function i(t,e){v=!1,g=Date.now();var a;for(a=0;b>a;a+=1)y[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-g;for(t=0;b>t;t+=1)y[t].animation.renderer.destroyed?(y.splice(t,1),t-=1,b-=1):y[t].animation.advanceTime(a);g=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;b>e;e+=1)y[e].animation.pause(t)}function h(t,e,a){var r;for(r=0;b>r;r+=1)y[r].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;b>e;e+=1)y[e].animation.stop(t)}function m(t){var e;for(e=0;b>e;e+=1)y[e].animation.togglePause(t)}function p(t){var e;for(e=0;b>e;e+=1)y[e].animation.destroy(t)}function d(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function c(){var t;for(t=0;b>t;t+=1)y[t].animation.resize()}function f(){g=Date.now(),requestAnimationFrame(n)}var u={},y=[],g=0,v=!0,b=0;return setTimeout(f,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=r,u.play=s,u.moveFrame=i,u.pause=o,u.stop=l,u.togglePause=m,u.searchAnimations=d,u.resize=c,u.start=f,u.goToAndStop=h,u.destroy=p,u}(),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,this.removed=!1,this.timeCompleted=0,this.segmentPos=0,this.segments=[]};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 r=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.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 r=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:"";""===r||(e.loop="false"===r?!1:"true"===r?!0:parseInt(r)),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 s=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"===s&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.includeLayers=function(t){var e,a,r=this.animationData.layers,s=r.length,i=t.layers,n=i.length;for(a=0;n>a;a+=1)for(e=0;s>e;){if(r[e].id==i[a].id){r[e]=i[a];break}e+=1}if(t.comps)for(s=t.comps.length,e=0;s>e;e+=1)this.animationData.comps.push(t.comps[e]);dataManager.completeData(this.animationData),this.renderer.includeLayers(t.layers),this.renderer.buildStage(this.container,this.layers),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length)return this.trigger("bm:data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var a=new XMLHttpRequest,r=this,s=this.path+"data_"+this.segmentPos+".json";this.segmentPos+=1,a.open("GET",s,!0),a.send(),a.onreadystatechange=function(){if(4==a.readyState)if(200==a.status)r.includeLayers(JSON.parse(a.responseText));else try{var t=JSON.parse(a.responseText);r.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.comps||(t.comps=[]),this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip*this.frameRate),this.frameMult=this.animationData.fr/1e3,this.trigger("bm:config_ready"),this.loadSegments(),dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(this.renderer.buildStage(this.container,this.layers),this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationData,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.animationData,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.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationData,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.adjustSegment=function(t){this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.currentRawFrame=this.firstFrame},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var a,r=t.length;for(a=0;r>a;a+=1)this.segments.push(t[a])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.resetSegments=function(t){this.segments.push([Math.round(this.animationData.animation.ff*this.frameRate),Math.floor(this.animationData.animation.totalFrames+this.animationData.animation.ff*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||this.renderer.destroy()},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.segments.length&&this.adjustSegment(this.segments.shift()),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.getAssetData=function(t){for(var e=0,a=this.assets.length;a>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.getAssets=function(){return this.assets},AnimationItem.prototype.addEventListener=addEventListener,AnimationItem.prototype.trigger=triggerEvent,function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function r(t){animationManager.togglePause(t)}function s(t,e){animationManager.setSpeed(t,e)}function i(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 m(){animationManager.resize()}function p(){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(t){return animationManager.destroy(t)}function y(){"complete"===document.readyState&&(clearInterval(v),h())}var g={};g.play=e,g.pause=a,g.togglePause=r,g.setSpeed=s,g.setDirection=i,g.stop=n,g.moveFrame=o,g.searchAnimations=h,g.registerAnimation=l,g.loadAnimation=f,g.setSubframeRendering=c,g.resize=m,g.start=p,g.goToAndStop=d,g.destroy=u,g.checkReady=y,t.bodymovin=g;var v=setInterval(y,100)}(window);}(window));
\ No newline at end of file
diff --git a/extension/js/controllers/CompRenderController.js b/extension/js/controllers/CompRenderController.js
index 121efd0..ddf8aa2 100644
--- a/extension/js/controllers/CompRenderController.js
+++ b/extension/js/controllers/CompRenderController.js
@@ -90,7 +90,7 @@
         }
         if (messageData.isFinished) {
             elem.addClass('rendered');
-            compData.renderData = messageData.data.substr(7);
+            compData.fsPath = messageData.fsPath;
         }
     }
     
diff --git a/extension/js/controllers/snapshotController.js b/extension/js/controllers/snapshotController.js
index 896e928..5d3756f 100644
--- a/extension/js/controllers/snapshotController.js
+++ b/extension/js/controllers/snapshotController.js
@@ -37,31 +37,47 @@
         thumb.css('left', x - 5 + 'px');
     }
     
-    function loadAnimation(data) {
-        var jsonData = JSON.parse(data);
-        totalFrames = Math.floor(jsonData.op - jsonData.ip);
+    function handleWindowResize() {
+        if (!showing) {
+            return;
+        }
+        animContainer.css('height', $window.height() - 2 - header.outerHeight() - controls.outerHeight() + 'px');
+        sliderWidth = slider.width();
+        updateControls();
+        
+    }
+    
+    function setTotalFrames() {
+        if (!anim) {
+            return;
+        }
+        totalFrames = anim.totalFrames;
         controls.find('.frames .total .value').html(totalFrames);
-        currentFrame = 1;
+        showControls();
+        handleWindowResize();
+    }
+    
+    function loadAnimation(uri) {
+        currentFrame = 0;
         if (anim) {
             anim.destroy();
         }
-        updateControls();
         var params = {
                 animType: 'svg',
                 wrapper: animContainer[0],
                 loop: false,
                 autoplay: false,
                 prerender: true,
-                animationData: jsonData
+                path: uri
             };
         anim = bodymovin.loadAnimation(params);
-        showControls();
+        anim.addEventListener('bm:config_ready', setTotalFrames);
     }
     
     function addSelectionListener(elem, data) {
         elem.on('click', function () {
             rendersSelection.hide();
-            loadAnimation(data.renderData);
+            loadAnimation(data.fsPath);
         });
     }
     
@@ -70,7 +86,7 @@
         if (!compositions || compositions.length === 0) {
             messageController.showMessage({type: 'alert', message: 'You have no recent renders.\n Try browsing your files'});
         } else if (compositions.length === 1) {
-            loadAnimation(compositions[0].renderData);
+            loadAnimation(compositions[0].fsPath);
         } else {
             rendersSelection.show();
             listContainer.empty();
@@ -85,17 +101,8 @@
         }
     }
     
-    function handleFilePath(ev) {
-        loadAnimation(ev.data.substr(7));
-    }
-    
-    function handleWindowResize() {
-        if (!showing) {
-            return;
-        }
-        animContainer.css('height', $window.height() - 2 - header.outerHeight() - controls.outerHeight() + 'px');
-        sliderWidth = slider.width();
-        
+    function handleFileUri(ev) {
+        loadAnimation(ev.data);
     }
     
     function frameChangeHandler() {
@@ -173,7 +180,7 @@
         listContainer = rendersSelection.find('.listContainer');
         rendersSelection.hide();
         $window = $(window);
-        csInterface.addEventListener('bm:file:path', handleFilePath);
+        csInterface.addEventListener('bm:file:uri', handleFileUri);
         $(window).on('resize', handleWindowResize);
         addSliderListeners();
         hideControls();
diff --git a/extension/js/libs/bodymovin.js b/extension/js/libs/bodymovin.js
index 1c94eeb..1722751 100644
--- a/extension/js/libs/bodymovin.js
+++ b/extension/js/libs/bodymovin.js
@@ -1,3 +1,4 @@
-(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,r,s,i,n,o,h){var l,m,p,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]]),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]]),c=$M([[r,0,0,0],[0,s,0,0],[0,0,i,0],[0,0,0,1]]),f=l.x(m).x(p).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,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toCSS()},r=function(e,a,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toArray()},s=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},i=function(t,r){return r?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,r){return r?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:r(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:s,getMatrix:i,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:r,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,r="";for(a=t;a>0;--a)r+=e[Math.round(Math.random()*(e.length-1))];return r}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 RenderedFrame(t,e){this.tr=t,this.o=e}function createElement(t,e,a){if(!e){var r=Object.create(t.prototype,a),s={};return r&&"[object Function]"===s.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,r){var s={writable:!1,configurable:!1,enumerable:!1,value:a};if(r)for(var i in r)s[i]=r[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function defineAccessor(t,e,a){var r,s={enumerable:!1,configurable:!1,get:function(){return r},set:function(t){r=t}};if(a)for(var i in a)s[i]=a[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function bezFunction(){function t(t,e,a,r,s,i){return m.abs((a-t)*(i-e)-(s-t)*(r-e))<1e-5}function e(t){return l[t].fnc}function a(t,e,a,r,s){if(s||(s=("bez_"+t+"_"+e+"_"+a+"_"+r).replace(/\./g,"p")),l[s])return l[s];var i,n,o,h,p,d;return l[s]=function(s,l,c,f,u){var y=l/u;s=y;for(var g,v=0;++v<14&&(o=3*t,n=3*(a-t)-o,i=1-o-n,g=s*(o+s*(n+s*i))-y,!(m.abs(g)<.001));)s-=g/(o+s*(2*n+3*i*s));d=3*e,p=3*(r-e)-d,h=1-d-p;var b=s*(d+s*(p+s*h));return f*b+c},l[s]}function r(t){this.segmentLength=0,this.points=new Array(t)}function s(t,e){this.partialLength=t,this.point=e}function i(e){var a,i,n,o,h,l,p,d=e.s,c=e.e,f=e.to,u=e.ti,y=100,g=0,v=null;(d[0]!=c[0]||d[1]!=c[1])&&t(d[0],d[1],c[0],c[1],d[0]+f[0],d[1]+f[1])&&t(d[0],d[1],c[0],c[1],c[0]+u[0],c[1]+u[1])&&(y=2);var b=new r(y);for(n=f.length,a=0;y>a;a+=1){for(p=[],h=a/(y-1),l=0,i=0;n>i;i+=1)o=m.pow(1-h,3)*d[i]+3*m.pow(1-h,2)*h*(d[i]+f[i])+3*(1-h)*m.pow(h,2)*(c[i]+u[i])+m.pow(h,3)*c[i],p.push(o),null!==v&&(l+=m.pow(p[i]-v[i],2));l=m.sqrt(l),g+=l,b.points[a]=new s(l,p),v=p}b.segmentLength=g,e.bezierData=b}function n(t,e){var a=e.segments,r=a.length,s=m.floor((r-1)*t),i=t*e.addedLength,n=0;if(i==a[s].l)return a[s].p;for(var o=a[s].l>i?-1:1,h=!0;h;)a[s].l<=i&&a[s+1].l>i?(n=(i-a[s].l)/(a[s+1].l-a[s].l),h=!1):s+=o,(0>s||s>=r-1)&&(h=!1);return a[s].p+(a[s+1].p-a[s].p)*n}function o(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function h(t,e,a,r,s,i,h){var l=new o;s=0>s?0:s;var m=n(s,h);i=i>1?1:i;var p,d=n(i,h),c=t.length,f=1-m,u=1-d;for(p=0;c>p;p+=1)l.pt1[p]=f*f*f*t[p]+(m*f*f+f*m*f+f*f*m)*a[p]+(m*m*f+f*m*m+m*f*m)*r[p]+m*m*m*e[p],l.pt3[p]=f*f*u*t[p]+(m*f*u+f*m*u+f*f*d)*a[p]+(m*m*u+f*m*d+m*f*d)*r[p]+m*m*d*e[p],l.pt4[p]=f*u*u*t[p]+(m*u*u+f*d*u+f*u*d)*a[p]+(m*d*u+f*d*d+m*u*d)*r[p]+m*d*d*e[p],l.pt2[p]=u*u*u*t[p]+(d*u*u+u*d*u+u*u*d)*a[p]+(d*d*u+u*d*d+d*u*d)*r[p]+d*d*d*e[p];return l}var l=[],m=Math,p=function(){var e={};return function(a,r,s,i){var n=(a.join("_")+"_"+r.join("_")+"_"+s.join("_")+"_"+i.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,d,c,f=100,u=0,y=[],g=[],v={addedLength:0,segments:[]};for((a[0]!=r[0]||a[1]!=r[1])&&t(a[0],a[1],r[0],r[1],s[0],s[1])&&t(a[0],a[1],r[0],r[1],i[0],i[1])&&(f=2),l=s.length,o=0;f>o;o+=1){for(d=o/(f-1),c=0,h=0;l>h;h+=1)p=m.pow(1-d,3)*a[h]+3*m.pow(1-d,2)*d*s[h]+3*(1-d)*m.pow(d,2)*i[h]+m.pow(d,3)*r[h],y[h]=p,null!==g[h]&&(c+=m.pow(y[h]-g[h],2)),g[h]=y[h];c&&(c=m.sqrt(c),u+=c),v.segments.push({l:u,p:d})}return v.addedLength=u,e[n]=v,v}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:p,getNewSegment:h,buildBezierData:i}}function dataFunctionManager(){function t(t,e){var a,r,s,i=t.length;for(a=0;i>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(s=t[a].s.length,r=0;s>r;r+=1)t[a].s[r]*=e,void 0!==t[a].e&&(t[a].e[r]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function e(i,o){var h,l,m,p,d,c,f,y,v,b,E=i.length;for(c=0;E>c;c+=1)if(m=i[c],"ks"in m&&!m.completed){if(m.completed=!0,h=Math.round(m.op-m.st),l=m.st,m.tt&&(i[c-1].td=m.tt),m.renderedFrame={},m.renderedData={},p=[],d=-1,m.tm){m.trmp=m.tm;var C=new Array(Math.round(h));for(f=0;h>f;f+=1)C[f]=Math.floor(n(m.tm,f,l)*u);m.tm=C}if(m.ks.o instanceof Array?t(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?t(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?t(m.ks.r,g):m.ks.r*=g,m.hasMask){var D=m.masksProperties;for(y=D.length,f=0;y>f;f+=1)if(D[f].pt.i)s(D[f].pt);else for(b=D[f].pt.length,v=0;b>v;v+=1)D[f].pt[v].s&&s(D[f].pt[v].s[0]),D[f].pt[v].e&&s(D[f].pt[v].e[0])}0===m.ty?(m.layers=a(m.refId,o),e(m.layers,o)):4===m.ty&&r(m.shapes)}}function a(t,e){for(var a=0,r=e.length;r>a;){if(e[a].id===t)return e[a].layers;a+=1}}function r(e,a){var i,n,o,h,l=e.length,m=a?a:!1;for(i=l-1;i>=0;i-=1)if(e[i].renderedData=[],"tm"==e[i].ty&&(m=!0),"fl"==e[i].ty||"st"==e[i].ty)e[i].o instanceof Array?t(e[i].o,.01):e[i].o*=.01;else if("sh"==e[i].ty)if(e[i].trimmed=m,e[i].ks.i)s(e[i].ks);else for(o=e[i].ks.length,n=0;o>n;n+=1)e[i].ks[n].s&&(s(e[i].ks[n].s[0]),s(e[i].ks[n].e[0]));else"gr"==e[i].ty?r(e[i].it,m):"tr"==e[i].ty?(h=e[i],h.renderedData=[],h.o instanceof Array?t(h.o,.01):h.o/=100,h.s instanceof Array?t(h.s,.01):h.s/=100,h.r instanceof Array?t(h.r,g):h.r*=g):("rc"==e[i].ty||"el"==e[i].ty)&&(e[i].trimmed=m,e[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 i(t){t.__renderedFrames=new Array(Math.floor(t.tf)),t.__renderFinished=!1,u=t.fr,e(t.layers,t.comps)}function n(t,e,a,r,s,i){var n,o,h,l,m,p,d=0;if(!t.length){if(r)for(;i>0;)r[s+d]=t,d+=1,i-=1;return t}if(void 0===t[0].t){if(r)for(;i>0;)r[s+d]=t[d],d+=1,i-=1;return t}m=0,p=t.length-1;for(var c=1,f=!0;!(!f||(n=t[m],o=t[m+1],m==p-1&&e>=o.t-a)||o.t-a>e&&1==c);){if(o.t-a<e&&-1==c){m+=1,n=t[m],o=t[m+1];break}p-1>m&&1==c||m>0&&-1==c?m+=c:f=!1}n.to&&!n.bezierData&&bez.buildBezierData(n);var u,y,g,v,b,E=0;if(r||(h=[]),n.to){if(l=n.bezierData,e>=o.t-a||e<n.t-a){var C=e>=o.t-a?l.points.length-1:0;if(r)for(;i>0;)r[s+d]=l.points[C].point[d],d+=1,i-=1;return l.points[C].point}n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y,n.n),n.__fnct=b),g=b("",e-(n.t-a),0,1,o.t-a-(n.t-a));var D,w=l.segmentLength*g,x=0;for(c=1,f=!0,v=l.points.length;f;){if(x+=l.points[E].partialLength*c,0===w||0===g||E==l.points.length-1){if(r)for(;i>0;)r[s+d]=l.points[E].point[d],d+=1,i-=1;else h=l.points[E].point;break}if(w>x&&w<x+l.points[E+1].partialLength){if(D=(w-x)/l.points[E+1].partialLength,r)for(;i>0;)r[s+d]=l.points[E].point[d]+(l.points[E+1].point[d]-l.points[E].point[d])*D,d+=1,i-=1;else for(y=l.points[E].point.length,u=0;y>u;u+=1)h.push(l.points[E].point[u]+(l.points[E+1].point[u]-l.points[E].point[u])*D);break}v-1>E&&1==c||E>0&&-1==c?E+=c:f=!1}}else{var _,S,A,I,M,F=!1;for(p=n.s.length,m=0;p>m;m+=1)1!==n.h&&(n.o.x instanceof Array?(F=!0,n.__fnct||(n.__fnct=[]),n.__fnct[m]||(_=n.o.x[m]?n.o.x[m]:n.o.x[0],S=n.o.y[m]?n.o.y[m]:n.o.y[0],A=n.i.x[m]?n.i.x[m]:n.i.x[0],I=n.i.y[m]?n.i.y[m]:n.i.y[0])):(F=!1,n.__fnct||(_=n.o.x,S=n.o.y,A=n.i.x,I=n.i.y)),F?n.__fnct[m]?b=n.__fnct[m]:(b=bez.getEasingCurve(_,S,A,I),n.__fnct[m]=b):n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(_,S,A,I),n.__fnct=b),g=e>=o.t-a?1:e<n.t-a?0:b("",e-(n.t-a),0,1,o.t-a-(n.t-a))),M=1===n.h?n.s[m]:n.s[m]+(n.e[m]-n.s[m])*g,r?i>0&&(r[s+d]=M,d+=1,i-=1):1===p?h=M:h.push(M)}return h}function o(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,r=t.v,s=t.o,i=t.i,n=r.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(r[a],r[a+1],s[a],i[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(r[a],r[0],s[a],i[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function h(t,e,a,r,s,i){var n=i&&i.length>0,o={};o.closed=s?t.cl:t.closed;var h=s?t.pt:t.ks;if(h.v)return o.pathNodes=n?v(h,o.closed,i,!1):h,o;var l,m,p,d,c,f,u;if(e<h[0].t-a||e>h[h.length-1].t-a){var y,g,b,E;if(e<h[0].t-a?(E="__minValue",g=0,b=h.__minValue,y=h[g].s):(E="__maxValue",g=h.length-2,b=h.__maxValue,y=h[g].e),!b){for(m=h[g].s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=h[g].s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)c[p]=y[0].i[l][p],f[p]=y[0].o[l][p],u[p]=y[0].v[l][p];t.i[l]=c,t.o[l]=f,t.v[l]=u}h[E]=t,b=t}return o.pathNodes=n?v(b,o.closed,i,!1):b,o}var C,D=!1;h.__lastData?C=h.__lastData.pathNodes:D=!0;for(var w,x,_=0,S=h.length-1,A=1,I=!0;I&&(w=h[_],x=h[_+1],!(x.t-a>e&&1==A));)S-1>_&&1==A||_>0&&-1==A?_+=A:I=!1;var M;if(1!==w.h){var F;w.__fnct?F=w.__fnct:(F=bez.getEasingCurve(w.o.x,w.o.y,w.i.x,w.i.y),w.__fnct=F),M=e>=x.t-a?1:e<w.t-a?0:F("",e-(w.t-a),0,1,x.t-a-(w.t-a))}if(1===w.h&&w.__hValue)t=w.__hValue;else for(m=w.s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=w.s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)1===w.h?(c[p]=w.s[0].i[l][p],f[p]=w.s[0].o[l][p],u[p]=w.s[0].v[l][p]):(c[p]=w.s[0].i[l][p]+(w.e[0].i[l][p]-w.s[0].i[l][p])*M,f[p]=w.s[0].o[l][p]+(w.e[0].o[l][p]-w.s[0].o[l][p])*M,u[p]=w.s[0].v[l][p]+(w.e[0].v[l][p]-w.s[0].v[l][p])*M),C&&(C.i[l]&&C.o[l]&&C.v[l]&&C.i[l][p]===c[p]&&C.o[l][p]===f[p]&&C.v[l][p]===u[p]||(D=!0));t.i[l]=c,t.o[l]=f,t.v[l]=u,1===w.h&&(w.__hValue=t)}return n?o.pathNodes=v(t,o.closed,i,!1):(D?(o.pathNodes=t,h.__lastData=o):o.pathNodes=h.__lastData,o.pathNodes=t),o}function l(t,e,a){var r,s,i,o,m,d,c,f,g,v,E,C=t.length;for(f=0;C>f;f+=1)if(g=t[f],"ks"in t[f]){if(o=e-g.st,r={},r.a=n(g.ks.a,o,g.st),r.o=n(g.ks.o,o,g.st),g.ks.p.s?(n(g.ks.p.x,o,g.st,b,3,1),n(g.ks.p.y,o,g.st,b,4,1)):n(g.ks.p,o,g.st,b,3,2),n(g.ks.r,o,g.st,b,0,1),n(g.ks.s,o,g.st,b,1,2),c={},v=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]),E=!1,g.__lastRenderAn&&r.o===g.__lastRenderAn.tr.o&&r.a[0]===g.__lastRenderAn.tr.a[0]&&r.a[1]===g.__lastRenderAn.tr.a[1]&&v[1]===g.__lastRenderAn.matrixArray[1]&&v[2]===g.__lastRenderAn.matrixArray[2]&&v[3]===g.__lastRenderAn.matrixArray[3]&&v[4]===g.__lastRenderAn.matrixArray[4]&&v[5]===g.__lastRenderAn.matrixArray[5]?c.an=g.__lastRenderAn:(c.an={tr:r},c.an.matrixArray=v,g.__lastRenderAn=c.an),g.renderedData[o]=c,g.hasMask)for(s=g.masksProperties,d=s.length,m=0;d>m;m+=1)s[m].paths||(s[m].paths=[],s[m].opacity=[]),s[m].paths[o]=h(s[m],o,g.st,a,!0),s[m].opacity[o]=n(s[m].o,o,g.st),s[m].opacity[o]=s[m].opacity[o]instanceof Array?s[m].opacity[o][0]/100:s[m].opacity[o]/100;e<g.ip||e>g.op||(0===g.ty?(i=g.tm?g.tm[o]<0?0:o>=g.tm.length?g.tm[g.tm.length-1]:g.tm[o]:o,void 0===i&&(i=n(g.trmp,o,0)[0]*u,g.tm[o]=i),l(g.layers,i,a)):4===g.ty&&p(g.shapes,o,g.st,a))}}function m(t,e,a,r){a=Math.min(e[0],e[1],a/2);var s=new Array(8),i=new Array(8),n=new Array(8),o=a/2;return 2===r?(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=s[0],i[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],s[1]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[1]=[t[0]+e[0]/2,t[1]+e[1]/2-o],i[1]=s[1],s[2]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[2]=s[2],i[2]=[t[0]+e[0]/2-o,t[1]+e[1]/2],s[3]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[3]=[t[0]-e[0]/2+o,t[1]+e[1]/2],i[3]=s[3],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=s[4],i[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],s[5]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[5]=[t[0]-e[0]/2,t[1]-e[1]/2+o],i[5]=s[5],s[6]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[6]=s[6],i[6]=[t[0]-e[0]/2+o,t[1]-e[1]/2],s[7]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[7]=[t[0]+e[0]/2-o,t[1]-e[1]/2],i[7]=s[7]):(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],i[0]=s[0],s[1]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[1]=s[1],i[1]=[t[0]+e[0]/2-o,t[1]-e[1]/2],s[2]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[2]=[t[0]-e[0]/2+o,t[1]-e[1]/2],i[2]=s[2],s[3]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[3]=s[3],i[3]=[t[0]-e[0]/2,t[1]-e[1]/2+o],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],i[4]=s[4],s[5]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[5]=s[5],i[5]=[t[0]-e[0]/2+o,t[1]+e[1]/2],s[6]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[6]=[t[0]+e[0]/2-o,t[1]+e[1]/2],i[6]=s[6],s[7]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[7]=s[7],i[7]=[t[0]+e[0]/2,t[1]+e[1]/2-o]),{v:s,o:n,i:i,c:!0}}function p(t,e,a,r,s){var i,o,l,c,f,u,g,E,C,D,w=t.length;s||(s=[]);var x,_,S,A,I;for(i=w-1;i>=0;i-=1)if(o=t[i],"sh"==o.ty)o.renderedData[e]={path:h(o,e,a,r,!1,s)};else if("fl"==o.ty)l=n(o.c,e,a),c=n(o.o,e,a),o.renderedData[e]={opacity:c instanceof Array?c[0]:c},"canvas"==r?(d(l),o.renderedData[e].color=l):o.renderedData[e].color=rgbToHex(Math.round(l[0]),Math.round(l[1]),Math.round(l[2]));else if("rc"==o.ty)f=n(o.p,e,a),u=n(o.s,e,a),g=n(o.r,e,a),o.trimmed?(o.closed=!0,o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(m(f,u,g,o.d),!0,s,!1)):o.renderedData[e]={position:f,size:u,roundness:g};else if("el"==o.ty){if(f=n(o.p,e,a),u=n(o.s,e,a),o.renderedData[e]={p:f,size:u},"svg"==r){var M={v:new Array(4),i:new Array(4),o:new Array(4)};2!==o.d&&3!==o.d?(M.v[0]=[f[0],f[1]-u[1]/2],M.i[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.o[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]+u[0]/2,f[1]],M.i[1]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.o[1]=[f[0]+u[0]/2,f[1]+u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.i[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.o[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]-u[0]/2,f[1]],M.i[3]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.o[3]=[f[0]-u[0]/2,f[1]-u[1]/2*.55]):(M.v[0]=[f[0],f[1]-u[1]/2],M.o[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.i[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]-u[0]/2,f[1]],M.o[1]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.i[1]=[f[0]-u[0]/2,f[1]-u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.o[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.i[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]+u[0]/2,f[1]],M.o[3]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.i[3]=[f[0]+u[0]/2,f[1]+u[1]/2*.55]),o.trimmed?(o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(M,!0,s,!1),o.closed=!0):(o.renderedData[e].path={pathNodes:M},o.closed=!0)}}else if("st"==o.ty){if(E=n(o.c,e,a),C=n(o.o,e,a),D=n(o.w,e,a),o.renderedData[e]={opacity:C instanceof Array?C[0]:C,width:D instanceof Array?D[0]:D},o.d){var F=[];I=o.d.length;var P;for(A=0;I>A;A+=1)P=n(o.d[A].v,e,a),F.push({v:P instanceof Array?P[0]:P,n:o.d[A].n});o.renderedData[e].dashes=F}"canvas"==r?(d(E),o.renderedData[e].color=E):o.renderedData[e].color=rgbToHex(Math.round(E[0]),Math.round(E[1]),Math.round(E[2]))}else if("tr"==o.ty)o.renderedData[e]={a:n(o.a,e,a),o:n(o.o,e,a)},n(o.s,e,a,b,1,2),n(o.r,e,a,b,0,1),n(o.p,e,a,b,3,2),o.renderedData[e].mtArr=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]);else if("tm"==o.ty){x=n(o.s,e,a),_=n(o.e,e,a),S=n(o.o,e,a);var k={s:x,e:_,o:S};s.push(k),o.renderedData[e]=k}else"gr"==o.ty&&p(o.it,e,a,r,s)}function d(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function c(t,e){for(var a=1;a>0;){if(e+=1,e>=Math.floor(t.tf)){t.__renderFinished=!0;break}t.__renderedFrames[e]||(f(t,e),a-=1)}}function f(t,e){return 2==t.__renderedFrames[e]?void(t.__renderFinished||c(t,e)):(u=t.fr,t.__renderedFrames[e]=2,void l(t.layers,e,t._animType))}var u=0,y=new MatrixManager,g=Math.PI/180,v=function(){function t(t,i,n,o,p){r[h]=i,e[h+1]=n,a[h+1]=o,l?a[h]=t:(m+=" M"+t.join(","),l=!0,s[h]=t),m+=" C"+i.join(",")+" "+n.join(",")+" "+o.join(","),h+=1}var e,a,r,s,i,n,h,l=!1,m="";return function(p,d,c,f){o(p,d);var u,y=c.length,g=p;a=e=r=s=null;var v,b,E,C,D;for(u=y-1;u>=0;u-=1){var w=[],x=c[u].o%360/360;if(0!==x||0!==c[u].s||100!=c[u].e){m="",l=!1,e=[],r=[],a=[],s=[],i=[],n=0,0>x&&(x+=1);var _=c[u].s/100+x,S=c[u].e/100+x;if(_==S)return f?"":{};if(_>S){var A=_;_=S,S=A}1>=S?w.push({s:g.__totalLength*_,e:g.__totalLength*S}):_>=1?w.push({s:g.__totalLength*(_-1),e:g.__totalLength*(S-1)}):(w.push({s:g.__totalLength*_,e:g.__totalLength}),w.push({s:0,e:g.__totalLength*(S-1)})),v=[],b=[],E=[];var I;v=g.v,b=g.o,E=g.i,I=g.__lengths,D=v.length;var M,F,P=0,k=0,N=w.length;for(h=0,M=0;N>M;M+=1){for(P=0,C=1;D>C;C++)if(k=I[C-1].addedLength,P+k<w[M].s)P+=k;else{if(P>w[M].e)break;w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[C],v[C],I[C-1]):(F=bez.getNewSegment(v[C-1],v[C],b[C-1],E[C],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2)),P+=k}d!==!1?P<=w[M].e&&(k=I[C-1].addedLength,w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[0],v[0],I[C-1]):(F=bez.getNewSegment(v[C-1],v[0],b[C-1],E[0],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2))):l=!1}d=!1}}if(a?(v=a,b=r,E=e):(v=g.v,b=g.o,E=g.i,s=[]),D=v.length,f){for(m="",C=1;D>C;C++)s[C-1]?m+="M"+s[C-1].join(","):1==C&&(m+="M"+v[0].join(",")),m+=" C"+b[C-1].join(",")+" "+E[C].join(",")+" "+v[C].join(",");return d!==!1&&(m+=" C"+b[C-1].join(",")+" "+E[0].join(",")+" "+v[0].join(",")),m}return{i:E,o:b,v:v,s:s,c:d}}}(),b=[0,1,1,0,0],E={};return E.completeData=i,E.renderFrame=f,E}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.destroyed=!1}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,r=15;for(a=0;r>a;a+=1)this.contextData.saved[a]=new Array(6);this.elements=[]}function MaskElement(t,e,a){this.data=t,this.storedData=[],this.element=e,this.globalData=a,this.paths=[],this.registeredEffects=[],this.masksProperties=[],this.maskElement=null}function ICompElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r),this.layers=t.layers}function IImageElement(t,e,a,r){this.assetData=a.getAssetData(t.ll),this.path=a.getPath(),this.parent.constructor.call(this,t,e,a,r)}function IShapeElement(t,e,a,r){this.shapes=[],this.parent.constructor.call(this,t,e,a,r)}function ShapeItemElement(t,e,a,r,s){this.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},this.stylesList=[],this.viewData=[],this.shape=e,this.parentContainer=a,this.placeholder=r,this.data=t,this.globalData=s,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}function ITextElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}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.assetData=this.animationItem.getAssetData(t.ll),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.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},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 r,s=this.dataLength-1;this.renderedPaths=new Array(this.globalData.totalFrames);var i;for(r=s;r>=0;r-=1)"gr"==this.data[r].ty?this.data[r].item=new CVShapeItemElement(this.data[r].it,!1,this.globalData):("st"==this.data[r].ty||"fl"==this.data[r].ty)&&(i={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[r].ty?i.type="fill":(i.type="stroke",i.width=0,i.lc=this.lcEnum[this.data[r].lc]||"round",i.lj=this.ljEnum[this.data[r].lj]||"round",1==this.data[r].lj&&(i.ml=this.data[r].ml)),this.stylesPool.push(i))}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),r=2*(a.x*t+a.y*e);return t-=r*a.x,e-=r*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 1==t?this:this._t(t,0,0,1,0,0)},scaleY:function(t){return 1==t?this: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,r,s,i){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=r,this.props[4]=s,this.props[5]=i,this._x()},translate:function(t,e){return 0===t&&0===e?this: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,r,s,i){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*r,this.props[3]=this.b1*a+this.d1*r,this.props[4]=this.a1*s+this.c1*i+this.e1,this.props[5]=this.b1*s+this.d1*i+this.f1,this},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,r=t.c,s=t.d,i=t.e,n=t.f,o=new Matrix,h=e*s-a*r;return o.a=s/h,o.b=-a/h,o.c=-r/h,o.d=e/h,o.e=(r*n-s*i)/h,o.f=-(e*n-a*i)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix;return s.a=r.a+(t.a-r.a)*e,s.b=r.b+(t.b-r.b)*e,s.c=r.c+(t.c-r.c)*e,s.d=r.d+(t.d-r.d)*e,s.e=r.e+(t.e-r.e)*e,s.f=r.f+(t.f-r.f)*e,s._x()},interpolateAnim:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix,i=r.decompose(),n=t.decompose(),o=i.rotation+(n.rotation-i.rotation)*e,h=i.translate.x+(n.translate.x-i.translate.x)*e,l=i.translate.y+(n.translate.y-i.translate.y)*e,m=i.scale.x+(n.scale.x-i.scale.x)*e,p=i.scale.y+(n.scale.y-i.scale.y)*e;return s.translate(h,l),s.rotate(o),s.scale(m,p),s._x()},decompose:function(t){var e=this.props[0],a=this.props[1],r=this.props[2],s=this.props[3],i=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},m=0,p={x:1,y:1},d={x:0,y:0},c=e*s-a*r;if(t)e?(d={x:n(r/e),y:n(a/e)},p={x:e,y:c/e}):a?(m=.5*h,p={x:a,y:c/a},d.x=n(s/a)):(p={x:r,y:s},d.x=.25*h);else if(e||a){var f=o(e*e+a*a);m=a>0?i(e/f):-i(e/f),p={x:f,y:c/f},d.x=n((e*r+a*s)/(f*f))}else if(r||s){var u=o(r*r+s*s);m=.5*h-(s>0?i(-r/u):-i(r/u)),p={x:c/u,y:u},d.y=n((e*r+a*s)/(u*u))}else p={x:0,y:0};return{scale:p,translate:l,rotation:m,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,r=0,s=[];if("number"==typeof t[0])for(a=t.length;a>r;)e=this.applyToPoint(t[r++],t[r++]),s.push(e.x,e.y);else for(a=t.length,r=0;a>r;r++)s.push(this.applyToPoint(t[r].x,t[r].y));return s},applyToTypedArray:function(t,e){for(var a,r=0,s=t.length,i=e?new Float64Array(s):new Float32Array(s);s>r;)a=this.applyToPoint(t[r],t[r+1]),i[r++]=a.x,i[r++]=a.y;return i},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,r,s,i,n,o){this.save(),this.translate(t,e),this.rotate(s),this.scale(a,r),this.arc(0,0,1,i,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,r=[];for(e=0;a>e;e+=1)r.push(arguments[e]);this.ops_.push({type:t,args:r})}}for(var a=CanvasRenderingContext2D.prototype,r=BM_CanvasRenderingContext2D.prototype,s=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],i=0;i<s.length;i++){var n=s[i];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;r.fill=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];"transform"==s.type?this.renderer.ctxTransform(s.args):"save"==s.type?this.renderer.save():"restore"==s.type?this.renderer.restore():this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);o.apply(this.renderer.canvasContext,i)}else o.apply(this.renderer.canvasContext,arguments)},r.stroke=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}h.call(this.renderer.canvasContext)}else h.call(this.renderer.canvasContext)},r.clip=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);l.apply(this.renderer.canvasContext,i)}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,a){var r=(new Date).getTime(),s=Math.max(0,16-(r-t)),i=window.setTimeout(function(){e(r+s)},s);return t=r+s,i}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},bm_rnd=Math.round,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,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+a[t]+a[e]+a[r]}}(),fillColorToString=function(){var t=[];return function(e,a){return void 0!==a&&(e[3]=a),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.createItem=function(t,e,a){switch(t.ty){case 2:return this.createImage(t,e,a);case 0:return this.createComp(t,e,a);case 1:return this.createSolid(t,e,a);case 4:return this.createShape(t,e,a);case 5:return this.createText(t,e,a);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e)},SVGRenderer.prototype.buildItems=function(t,e,a,r){var s,i=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var n;for(s=i-1;s>=0;s--)a[s]=this.createItem(t[s],e,r),0===t[s].ty&&(n=[],this.buildItems(t[s].layers,a[s].getDomElement(),n,r),a[s].setElements(n)),t[s].td&&a[s+1].setMatte(a[s].layerId)},SVGRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var i,n,o,h=a.length;for(r=0;s>r;r+=1)for(i=0;h>i;){if(a[i].data.id==t[r].id){o=a[i],a[i]=this.createItem(t[r],e,o),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,a[i].getDomElement(),n,o),
-a[i].setElements(n));break}i+=1}},SVGRenderer.prototype.createBase=function(t,e,a){return new BaseElement(t,e,this.globalData,a)},SVGRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e,a){return new IShapeElement(t,e,this.globalData,a)},SVGRenderer.prototype.createText=function(t,e,a){return new ITextElement(t,e,this.globalData,a)},SVGRenderer.prototype.createImage=function(t,e,a){return new IImageElement(t,e,this.globalData,a)},SVGRenderer.prototype.createComp=function(t,e,a){return new ICompElement(t,e,this.globalData,a)},SVGRenderer.prototype.createSolid=function(t,e,a){return new ISolidElement(t,e,this.globalData,a)},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.w),this.animationItem.container.setAttribute("height",t.h),this.animationItem.container.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transform="translate3d(0,0,0)",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),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.compSize={w:t.w,h:t.h};var a=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var s="animationMask_"+randomString(10);a.setAttribute("id",s),a.appendChild(r);var i=document.createElementNS(svgNS,"g");i.setAttribute("clip-path","url(#"+s+")"),this.animationItem.container.appendChild(i),e.appendChild(a),this.animationItem.container=i,this.layers=t.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var r,s,i=e.length;for(a||(a=this.elements),r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemParenting(s,a[r],e,s.parent,a,!0),0===s.ty&&this.buildStage(a[r].getComposingElement(),s.layers,a[r].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,r,s,i){t.parents||(t.parents=[]),i&&e.resetHierarchy();for(var n=0,o=a.length;o>n;)a[n].ind==r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemParenting(t,e,a,a[n].parent,s,!1)),n+=1},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t&&!this.destroyed){null===t?t=this.lastFrame: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].st);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.createItem=function(t){switch(t.ty){case 0:return this.createComp(t);case 1:return this.createSolid(t);case 2:return this.createImage(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 99:return this.createPlaceHolder(t);default:return this.createBase(t)}return this.createBase(t,parentContainer)},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,r=t.length;for(a=0;r>a;a++)if(e[a]=this.createItem(t[a]),0===t[a].ty){var s=[];this.buildItems(t[a].layers,s),e[e.length-1].setElements(s)}},CanvasRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements);var i,n,o=a.length;for(r=0;s>r;r+=1)for(i=0;o>i;){if(a[i].data.id==t[r].id){a[i]=this.createItem(t[r],e),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,n),a[i].setElements(n));break}i+=1}},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.createPlaceHolder=function(t){return new PlaceHolderElement(t,null,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*=0>t?0:t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=0>t?0: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]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(6));var a,r=6,s=this.contextData.saved[this.contextData.cArrPos];for(a=0;r>a;a+=1)s[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],r=6,s=this.contextData.cTr.props;for(e=0;r>e;e+=1)s[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.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,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,r=this.transformCanvas.w/this.transformCanvas.h;r>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 r,s,i=e.length;for(r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemHierarchy(s,a[r],e,s.parent,a,!0),0==s.ty&&this.buildStage(null,s.layers,a[r].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,r,s,i){var n=0,o=a.length;for(i&&e.resetHierarchy();o>n;)a[n].ind===r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemHierarchy(t,e,a,a[n].parent,s,!1)),n+=1},CanvasRenderer.prototype.prepareFrame=function(t){if(!this.destroyed){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw()},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.bmCtx=null,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){this.lastFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||(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.masksProperties=this.data.masksProperties;var t,e,a,r,s,i=this.element.maskedElement,n=this.globalData.defs,o=this.masksProperties.length,h=this.data.masksProperties,l=0,m=[],p=randomString(10);for(this.maskElement=document.createElementNS(svgNS,"mask"),t=0;o>t;t++)if("s"!=h[t].mode&&"i"!=h[t].mode||0!=l||(s=document.createElementNS(svgNS,"rect"),s.setAttribute("fill","#ffffff"),s.setAttribute("x","0"),s.setAttribute("y","0"),s.setAttribute("width","100%"),s.setAttribute("height","100%"),m.push(s)),!("f"==h[t].mode&&l>0||"n"==h[t].mode)){if(l+=1,e=document.createElementNS(svgNS,"path"),h[t].cl?"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"):(e.setAttribute("fill","none"),"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"),e.setAttribute("stroke-width","1"),e.setAttribute("stroke-miterlimit","10")),e.setAttribute("clip-rule","nonzero"),this.storedData[t]={elem:e,lastPath:""},"i"==h[t].mode){r=m.length;var d=document.createElementNS(svgNS,"g");for(a=0;r>a;a+=1)d.appendChild(m[a]);var c=document.createElementNS(svgNS,"mask");c.setAttribute("mask-type","alpha"),c.setAttribute("id",p+"_"+l),c.appendChild(e),n.appendChild(c),d.setAttribute("mask","url(#"+p+"_"+l+")"),m.length=0,m.push(d)}else m.push(e);h[t].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath())}for(o=m.length,t=0;o>t;t+=1)this.maskElement.appendChild(m[t]);this.maskElement.setAttribute("id",p),l>0&&i.setAttribute("mask","url(#"+p+")"),n.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length,r=0;for(e=0;a>e;e++)"f"==this.data.masksProperties[e].mode&&r>0||"n"==this.data.masksProperties[e].mode||(r+=1,this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes,this.storedData[e]))},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,r=this.registeredEffects.length;for(a=0;r>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.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,a){var r,s,i="";if(e.__renderedString)i=e.__renderedString;else{for(s=e.v.length,r=1;s>r;r+=1)1==r&&(i+=" M"+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[r][0])+","+bm_rnd(e.i[r][1])+" "+bm_rnd(e.v[r][0])+","+bm_rnd(e.v[r][1]);t.cl&&(i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),e.__renderedString=i}a.lastPath!==i&&(t.inv?a.elem.setAttribute("d",this.solidPath+i):a.elem.setAttribute("d",i),a.lastPath=i)},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.registeredEffects=null,this.masksProperties=null};var BaseElement=function(t,e,a,r){this.globalData=a,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.matteElement=null,this.lastData={},this.renderedFrames=[],this.parentContainer=e,this.layerId=r?r.layerId:"ly_"+randomString(10),this.hidden=!1,this.placeholder=r,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},BaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},BaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var a=document.createElementNS(svgNS,"filter"),r=randomString(10);a.setAttribute("id",r),a.setAttribute("filterUnits","objectBoundingBox"),a.setAttribute("x","0%"),a.setAttribute("y","0%"),a.setAttribute("width","100%"),a.setAttribute("height","100%");var s=document.createElementNS(svgNS,"feComponentTransfer");s.setAttribute("in","SourceGraphic"),a.appendChild(s);var i=document.createElementNS(svgNS,"feFuncA");i.setAttribute("type","table"),i.setAttribute("tableValues","1.0 0.0"),s.appendChild(i),this.globalData.defs.appendChild(a);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+r+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.appendNodeToParent(this.matteElement)):this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.appendNodeToParent(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){if(this.data.renderedData[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(!this.data.renderedData[t]||3===this.data.ty)return!1;if(this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff,t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o;var a,r=this.finalTransform.mat;if(e&&(a=e.mat.props,r.reset().transform(a[0],a[1],a[2],a[3],a[4],a[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var s,i=this.hierarchy.length;for(e||r.reset(),s=i-1;s>=0;s-=1)a=this.hierarchy[s].ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5]);a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])}else this.isVisible&&(e?(a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])):(r.props[0]=this.ownMatrix.props[0],r.props[1]=this.ownMatrix.props[1],r.props[2]=this.ownMatrix.props[2],r.props[3]=this.ownMatrix.props[3],r.props[4]=this.ownMatrix.props[4],r.props[5]=this.ownMatrix.props[5]));if(this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===n&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(n,this.finalTransform.opacity)}var o=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=o.tr&&this.layerElement.setAttribute("transform",o.tr),this.lastData.o!==o.o&&this.layerElement.setAttribute("opacity",o.o),this.lastData=o}return this.isVisible},BaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData),this.maskManager.init()},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 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},BaseElement.prototype.hide=function(){};var PlaceHolderElement=function(t,e,a){if(this.data=t,this.globalData=a,e){this.parentContainer=e;var r=document.createElementNS(svgNS,"g");r.setAttribute("id",this.data.id),e.appendChild(r),this.phElement=r}this.layerId="ly_"+randomString(10)};PlaceHolderElement.prototype.prepareFrame=function(){},PlaceHolderElement.prototype.renderFrame=function(){},PlaceHolderElement.prototype.draw=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 r,s=this.layers.length,i=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(r=0;s>r;r+=1)this.elements[r].prepareFrame(i-this.layers[r].st);for(r=0;s>r;r+=1)this.data.hasMask?this.elements[r].renderFrame(i-this.layers[r].st):this.elements[r].renderFrame(i-this.layers[r].st,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this.parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t].destroy()},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.assetData.p),t.maskedElement=t.image},a=new Image;a.addEventListener("load",e,!1),a.addEventListener("error",e,!1),a.src=this.path+this.assetData.p,this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.assetData.w+"px"),this.image.setAttribute("height",this.assetData.h+"px"),this.layerElement===this.parentContainer?this.appendNodeToParent(this.image):this.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||(this.image.setAttribute("visibility","hidden"),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&&(this.lastData.o=-1,this.hidden=!1,this.image.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.image.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.image.setAttribute("opacity",s.o),this.lastData=s}},IImageElement.prototype.destroy=function(){this.parent.destroy.call(),this.image=null},createElement(BaseElement,IShapeElement),IShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix},IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.parentContainer,this.placeholder,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,this.transformHelper,null,null,!0):this.mainShape.renderShape(t,this.finalTransform,null,null,!0)},IShapeElement.prototype.destroy=function(){this.parent.destroy.call(),this.mainShape.destroy()},ShapeItemElement.prototype.appendNodeToParent=BaseElement.prototype.appendNodeToParent,ShapeItemElement.prototype.searchShapes=function(t,e){var a,r,s,i=t.length-1,n=[];for(a=i;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");"st"==t[a].ty&&(o.setAttribute("stroke-linecap",this.lcEnum[t[a].lc]||"round"),o.setAttribute("stroke-linejoin",this.ljEnum[t[a].lj]||"round"),1==t[a].lj&&o.setAttribute("stroke-miterlimit",t[a].ml)),this.shape===this.parentContainer?this.appendNodeToParent(o):this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:"",ld:""}),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:""}},s=this.stylesList.length,r=0;s>r;r+=1)this.stylesList[r].closed||(e[a].styles.push(this.stylesList[r]),"st"==this.stylesList[r].type&&this.stylesList[r].pathElement.setAttribute("fill-opacity",0));for(i=n.length,a=0;i>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","M 0,0"),this.stylesList[t].ld="M 0,0"},ShapeItemElement.prototype.renderShape=function(t,e,a,r,s){var i,n;if(!a)for(a=this.data,n=this.stylesList.length,i=0;n>i;i+=1)this.stylesList[i].d="";r||(r=this.viewData),this.frameNum=t,n=a.length-1;var o,h;for(o=e,i=n;i>=0;i-=1)if("tr"==a[i].ty){var l=a[i].renderedData[t].mtArr;if(o=r[i].transform,h=o.mat,h.reset(),e){var m=e.mat.props;o.opacity=e.opacity,o.opacity*=a[i].renderedData[t].o,h.transform(m[0],m[1],m[2],m[3],m[4],m[5])}else o.opacity=a[i].renderedData[t].o;h.transform(l[0],l[1],l[2],l[3],l[4],l[5]).translate(-a[i].renderedData[t].a[0],-a[i].renderedData[t].a[1])}else"sh"==a[i].ty?this.renderPath(a[i],r[i],t,o):"el"==a[i].ty?this.renderPath(a[i],r[i],t,o):"rc"==a[i].ty?a[i].trimmed?this.renderPath(a[i],r[i],t,o):this.renderRect(a[i],r[i],t,o):"fl"==a[i].ty?this.renderFill(a[i],r[i],t,o):"st"==a[i].ty?this.renderStroke(a[i],r[i],t,o):"gr"==a[i].ty?this.renderShape(t,o,a[i].it,r[i].it):"tm"==a[i].ty;if(s)for(n=this.stylesList.length,i=0;n>i;i+=1)""==this.stylesList[i].d&&""!==this.stylesList[i].ld?(this.stylesList[i].pathElement.setAttribute("d","M 0,0"),this.stylesList[i].ld=this.stylesList[i].d):this.stylesList[i].ld!==this.stylesList[i].d&&(this.stylesList[i].pathElement.setAttribute("d",this.stylesList[i].d),this.stylesList[i].ld=this.stylesList[i].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,r){var s,i;if(!e.renderedFrames[this.globalData.frameNum]){var n=t.renderedData[a].path.pathNodes;if(!n.v)return;s=n.v.length;var o=n.s?n.s:[],h="";for(i=1;s>i;i+=1)o[i-1]?h+=" M"+bm_rnd(o[i-1][0])+","+bm_rnd(o[i-1][1]):1==i&&(h+=" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[i][0])+","+bm_rnd(n.i[i][1])+" "+bm_rnd(n.v[i][0])+","+bm_rnd(n.v[i][1]);1==s&&(h+=o[0]?" M"+bm_rnd(o[0][0])+","+bm_rnd(o[0][1]):" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),!t.closed||t.trimmed&&!n.c||(h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[0][0])+","+bm_rnd(n.i[0][1])+" "+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(s=e.styles.length,i=0;s>i;i+=1)e.styles[i].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld}var o=e.renderedFrames[this.globalData.frameNum];e.lastData.c!=o.c&&(i.pathElement.setAttribute("fill",o.c),e.lastData.c=o.c),e.lastData.o!=o.o&&(i.pathElement.setAttribute("fill-opacity",o.o),e.lastData.o=o.o),e.lastData.t!=o.t&&(i.pathElement.setAttribute("transform",o.t),e.lastData.t=o.t)},ShapeItemElement.prototype.renderStroke=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.w===s.width&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,w:s.width,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld,s.dashes&&(e.renderedFrames[this.globalData.frameNum].d=s.dashes)}var o,h,l=e.renderedFrames[this.globalData.frameNum],m=l.c,p=l.o,d=l.w,c=l.d,n=l.t;if(c){var f,u=c.length;for(o="",h="",f=0;u>f;f+=1)"o"!=c[f].n?o+=" "+c[f].v:h+=c[f].v;e.lastData.da!=o&&(i.pathElement.setAttribute("stroke-dasharray",o),e.lastData.da=o),e.lastData["do"]!=h&&(i.pathElement.setAttribute("stroke-dashoffset",h),e.lastData["do"]=h)}e.lastData.c!=m&&(i.pathElement.setAttribute("stroke",m),e.lastData.c=m),e.lastData.o!=p&&(i.pathElement.setAttribute("stroke-opacity",p),e.lastData.o=p),e.lastData.w!==d&&(i.pathElement.setAttribute("stroke-width",d),e.lastData.w=d),e.lastData.t!==n&&(i.pathElement.setAttribute("transform",n),e.lastData.t=n)},ShapeItemElement.prototype.destroy=function(t,e){this.shape=null,this.data=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement===this.parentContainer?this.appendNodeToParent(t):this.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||(this.rectElement.setAttribute("visibility","hidden"),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.hidden=!1,this.rectElement.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.rectElement.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.rectElement.setAttribute("opacity",s.o),this.lastData=s}},ICompElement.prototype.destroy=function(){this.parent.destroy.call(),this.rectElement=null},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.parent.createElements.call(this)},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){if(!this.data.renderedData[t])return!1;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.ip-this.data.st<=t&&this.data.op-this.data.st>=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(3!==this.data.ty){
-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 r,s=this.hierarchy.length;for(t||a.reset(),r=s-1;r>=0;r-=1)e=this.hierarchy[r].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.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},CVBaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},CVBaseElement.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,r=this.elements.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(a=0;r>a;a+=1)this.elements[a].prepareFrame(s-this.layers[a].st)}},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},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this.parent.destroy.call()},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.assetData.p,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)}},CVImageElement.prototype.destroy=function(){this.img=null,this.animationItem=null,this.parent.destroy.call()},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)},CVShapeElement.prototype.destroy=function(){this.mainShape.destroy(),this.parent.destroy.call()},CVShapeItemElement.prototype.drawPaths=function(t){var e,a;t?(a=[],e=this.stylesList):e=this.renderedPaths[this.globalData.frameNum];var r,s=e.length,i=this.canvasContext;for(this.globalData.renderer.save(),r=0;s>r;r+=1)"stroke"==e[r].type?(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.lineCap=e[r].lc,i.lineJoin=e[r].lj,i.miterLimit=e[r].ml,i.strokeStyle=e[r].value,i.lineWidth=e[r].width,e[r].dasharray?(i.setLineDash(e[r].dasharray),i.lineDashOffset=e[r].dashoffset):(i.setLineDash([]),i.lineDashOffset=0),this.globalData.bmCtx.stroke(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&(a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,width:e[r].width,path:e[r].path}),e[r].dasharray&&(a[a.length-1].dasharray=e[r].dasharray,a[a.length-1].dashoffset=e[r].dashoffset))):"fill"==e[r].type&&(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.fillStyle=e[r].value,this.globalData.bmCtx.fill(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,path:e[r].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,r;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),r=this.dataLength-1,a=r;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(r=this.ownStylesList.length,a=0;r>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,r=new BM_Path2D,s=a.pathNodes;if(s instanceof Array&&(s=s[0]),s.v){var i,n=s.v.length,o=s.s?s.s:[];for(i=1;n>i;i+=1)o[i-1]?r.moveTo(bm_rnd(o[i-1][0]),bm_rnd(o[i-1][1])):1==i&&r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[i][0]),bm_rnd(s.i[i][1]),bm_rnd(s.v[i][0]),bm_rnd(s.v[i][1]));1==n&&(o[0]?r.moveTo(bm_rnd(o[0][0]),bm_rnd(o[0][1])):r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1]))),!t.closed||t.trimmed&&!s.c||r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[0][0]),bm_rnd(s.i[0][1]),bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),this.addPathToStyles(r)}},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],r=a.roundness;if(0===r)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var s=a.position[0]-a.size[0]/2,i=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];r instanceof Array&&(r=r[0]),r>n/2&&(r=n/2),r>o/2&&(r=o/2),e.moveTo(s+r,i),e.lineTo(s+n-r,i),e.quadraticCurveTo(s+n,i,s+n,i+r),e.lineTo(s+n,i+o-r),e.quadraticCurveTo(s+n,i+o,s+n-r,i+o),e.lineTo(s+r,i+o),e.quadraticCurveTo(s,i+o,s,i+o-r),e.lineTo(s,i+r),e.quadraticCurveTo(s,i,s+r,i)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,r=!0,s=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>s&&this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(s=this.stylesList[e].width)):r&&"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&&(r=!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,r=e.dashes,s=r.length,i=[],n="";for(a=0;s>a;a+=1)"o"!=r[a].n?i.push(r[a].v):n=r[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=i,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},CVShapeItemElement.prototype.destroy=function(){this.data=null,this.globalData=null,this.canvasContext=null},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.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.parent.createElements.call(this)},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,r=new BM_Path2D,s=this.data.masksProperties.length;for(e=new BM_Path2D,a=0;s>a;a++)this.masksProperties[a].inv&&this.createInvertedMask(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes),this.drawShape(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes);e.addPath(r,t.mat.props),this.renderedFrames[this.globalData.frameNum]=e}this.globalData.bmCtx.clip(e)},CVMaskElement.prototype.drawShape=function(t,e){var a,r=e.v.length;for(t.moveTo(bm_rnd(e.v[0][0]),bm_rnd(e.v[0][1])),a=1;r>a;a++)t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[a][0]),bm_rnd(e.i[a][1]),bm_rnd(e.v[a][0]),bm_rnd(e.v[a][1]));t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[0][0]),bm_rnd(e.i[0][1]),bm_rnd(e.v[0][0]),bm_rnd(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)},CVMaskElement.prototype.destroy=function(){this.ctx=null};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;b>e;){if(y[e].elem==t&&null!==y[e].elem)return y[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),y.push({elem:t,animation:a}),b+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),y.push({elem:null,animation:e}),b+=1,e}function a(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setSpeed(t,e)}function r(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setDirection(t,e)}function s(t){var e;for(e=0;b>e;e+=1)y[e].animation.play(t)}function i(t,e){v=!1,g=Date.now();var a;for(a=0;b>a;a+=1)y[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-g;for(t=0;b>t;t+=1)y[t].animation.renderer.destroyed?(y.splice(t,1),t-=1,b-=1):y[t].animation.advanceTime(a);g=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;b>e;e+=1)y[e].animation.pause(t)}function h(t,e,a){var r;for(r=0;b>r;r+=1)y[r].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;b>e;e+=1)y[e].animation.stop(t)}function m(t){var e;for(e=0;b>e;e+=1)y[e].animation.togglePause(t)}function p(t){var e;for(e=0;b>e;e+=1)y[e].animation.destroy(t)}function d(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function c(){var t;for(t=0;b>t;t+=1)y[t].animation.resize()}function f(){g=Date.now(),requestAnimationFrame(n)}var u={},y=[],g=0,v=!0,b=0;return setTimeout(f,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=r,u.play=s,u.moveFrame=i,u.pause=o,u.stop=l,u.togglePause=m,u.searchAnimations=d,u.resize=c,u.start=f,u.goToAndStop=h,u.destroy=p,u}(),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,this.removed=!1,this.timeCompleted=0,this.segmentPos=0,this.segments=[]};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 r=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.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 r=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:"";""===r||(e.loop="false"===r?!1:"true"===r?!0:parseInt(r)),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 s=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"===s&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.includeLayers=function(t){var e,a,r=this.animationData.layers,s=r.length,i=t.layers,n=i.length;for(a=0;n>a;a+=1)for(e=0;s>e;){if(r[e].id==i[a].id){r[e]=i[a];break}e+=1}if(t.comps)for(s=t.comps.length,e=0;s>e;e+=1)this.animationData.comps.push(t.comps[e]);dataManager.completeData(this.animationData),this.renderer.includeLayers(t.layers),this.renderer.buildStage(this.container,this.layers),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length)return void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var a=new XMLHttpRequest,r=this,s=this.path.substr(0,this.path.lastIndexOf("/")+1)+"data_"+this.segmentPos+".json";this.segmentPos+=1,a.open("GET",s,!0),a.send(),a.onreadystatechange=function(){if(4==a.readyState)if(200==a.status)r.includeLayers(JSON.parse(a.responseText));else try{var t=JSON.parse(a.responseText);r.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.comps||(t.comps=[]),this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip*this.frameRate),this.frameMult=this.animationData.fr/1e3,this.loadSegments(),dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(this.renderer.buildStage(this.container,this.layers),this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationData,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.animationData,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.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationData,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.adjustSegment=function(t){this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.currentRawFrame=this.firstFrame},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var a,r=t.length;for(a=0;r>a;a+=1)this.segments.push(t[a])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.resetSegments=function(t){this.segments.push([Math.round(this.animationData.animation.ff*this.frameRate),Math.floor(this.animationData.animation.totalFrames+this.animationData.animation.ff*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||this.renderer.destroy()},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.segments.length&&this.adjustSegment(this.segments.shift()),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.getAssetData=function(t){for(var e=0,a=this.assets.length;a>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.getAssets=function(){return this.assets},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function r(t){animationManager.togglePause(t)}function s(t,e){animationManager.setSpeed(t,e)}function i(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 m(){animationManager.resize()}function p(){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(t){return animationManager.destroy(t)}function y(){"complete"===document.readyState&&(clearInterval(v),h())}var g={};g.play=e,g.pause=a,g.togglePause=r,g.setSpeed=s,g.setDirection=i,g.stop=n,g.moveFrame=o,g.searchAnimations=h,g.registerAnimation=l,g.loadAnimation=f,g.setSubframeRendering=c,g.resize=m,g.start=p,g.goToAndStop=d,g.destroy=u,g.checkReady=y,t.bodymovin=g;var v=setInterval(y,100)}(window);}(window));
\ No newline at end of file
+(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,r,s,i,n,o,h){var l,m,p,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]]),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]]),c=$M([[r,0,0,0],[0,s,0,0],[0,0,i,0],[0,0,0,1]]),f=l.x(m).x(p).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,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toCSS()},r=function(e,a,r,s,i){return t.reset().translate(s,i).rotate(e).scale(a,r).toArray()},s=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},i=function(t,r){return r?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,r){return r?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:r(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:s,getMatrix:i,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:r,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 addEventListener(t,e){this.callbacks||(this.callbacks=[]),this.callbacks[t]||(this.callbacks[t]=[]),this.callbacks[t].push(e)}function triggerEvent(t,e){this.callbacks||(this.callbacks=[]);var a=0===this.callbacks.length?!0:!1,r=this;if(this.callbacks[t])if(a)setTimeout(function(){for(var a=0;a<r.callbacks[t].length;a++)r.callbacks[t][a](e)},0);else for(var s=0;s<this.callbacks[t].length;s++)this.callbacks[t][s](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var a,r="";for(a=t;a>0;--a)r+=e[Math.round(Math.random()*(e.length-1))];return r}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 RenderedFrame(t,e){this.tr=t,this.o=e}function createElement(t,e,a){if(!e){var r=Object.create(t.prototype,a),s={};return r&&"[object Function]"===s.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,r){var s={writable:!1,configurable:!1,enumerable:!1,value:a};if(r)for(var i in r)s[i]=r[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function defineAccessor(t,e,a){var r,s={enumerable:!1,configurable:!1,get:function(){return r},set:function(t){r=t}};if(a)for(var i in a)s[i]=a[i];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function bezFunction(){function t(t,e,a,r,s,i){return m.abs((a-t)*(i-e)-(s-t)*(r-e))<1e-5}function e(t){return l[t].fnc}function a(t,e,a,r,s){if(s||(s=("bez_"+t+"_"+e+"_"+a+"_"+r).replace(/\./g,"p")),l[s])return l[s];var i,n,o,h,p,d;return l[s]=function(s,l,c,f,u){var y=l/u;s=y;for(var g,v=0;++v<14&&(o=3*t,n=3*(a-t)-o,i=1-o-n,g=s*(o+s*(n+s*i))-y,!(m.abs(g)<.001));)s-=g/(o+s*(2*n+3*i*s));d=3*e,p=3*(r-e)-d,h=1-d-p;var b=s*(d+s*(p+s*h));return f*b+c},l[s]}function r(t){this.segmentLength=0,this.points=new Array(t)}function s(t,e){this.partialLength=t,this.point=e}function i(e){var a,i,n,o,h,l,p,d=e.s,c=e.e,f=e.to,u=e.ti,y=100,g=0,v=null;(d[0]!=c[0]||d[1]!=c[1])&&t(d[0],d[1],c[0],c[1],d[0]+f[0],d[1]+f[1])&&t(d[0],d[1],c[0],c[1],c[0]+u[0],c[1]+u[1])&&(y=2);var b=new r(y);for(n=f.length,a=0;y>a;a+=1){for(p=[],h=a/(y-1),l=0,i=0;n>i;i+=1)o=m.pow(1-h,3)*d[i]+3*m.pow(1-h,2)*h*(d[i]+f[i])+3*(1-h)*m.pow(h,2)*(c[i]+u[i])+m.pow(h,3)*c[i],p.push(o),null!==v&&(l+=m.pow(p[i]-v[i],2));l=m.sqrt(l),g+=l,b.points[a]=new s(l,p),v=p}b.segmentLength=g,e.bezierData=b}function n(t,e){var a=e.segments,r=a.length,s=m.floor((r-1)*t),i=t*e.addedLength,n=0;if(i==a[s].l)return a[s].p;for(var o=a[s].l>i?-1:1,h=!0;h;)a[s].l<=i&&a[s+1].l>i?(n=(i-a[s].l)/(a[s+1].l-a[s].l),h=!1):s+=o,(0>s||s>=r-1)&&(h=!1);return a[s].p+(a[s+1].p-a[s].p)*n}function o(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function h(t,e,a,r,s,i,h){var l=new o;s=0>s?0:s;var m=n(s,h);i=i>1?1:i;var p,d=n(i,h),c=t.length,f=1-m,u=1-d;for(p=0;c>p;p+=1)l.pt1[p]=f*f*f*t[p]+(m*f*f+f*m*f+f*f*m)*a[p]+(m*m*f+f*m*m+m*f*m)*r[p]+m*m*m*e[p],l.pt3[p]=f*f*u*t[p]+(m*f*u+f*m*u+f*f*d)*a[p]+(m*m*u+f*m*d+m*f*d)*r[p]+m*m*d*e[p],l.pt4[p]=f*u*u*t[p]+(m*u*u+f*d*u+f*u*d)*a[p]+(m*d*u+f*d*d+m*u*d)*r[p]+m*d*d*e[p],l.pt2[p]=u*u*u*t[p]+(d*u*u+u*d*u+u*u*d)*a[p]+(d*d*u+u*d*d+d*u*d)*r[p]+d*d*d*e[p];return l}var l=[],m=Math,p=function(){var e={};return function(a,r,s,i){var n=(a.join("_")+"_"+r.join("_")+"_"+s.join("_")+"_"+i.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,d,c,f=100,u=0,y=[],g=[],v={addedLength:0,segments:[]};for((a[0]!=r[0]||a[1]!=r[1])&&t(a[0],a[1],r[0],r[1],s[0],s[1])&&t(a[0],a[1],r[0],r[1],i[0],i[1])&&(f=2),l=s.length,o=0;f>o;o+=1){for(d=o/(f-1),c=0,h=0;l>h;h+=1)p=m.pow(1-d,3)*a[h]+3*m.pow(1-d,2)*d*s[h]+3*(1-d)*m.pow(d,2)*i[h]+m.pow(d,3)*r[h],y[h]=p,null!==g[h]&&(c+=m.pow(y[h]-g[h],2)),g[h]=y[h];c&&(c=m.sqrt(c),u+=c),v.segments.push({l:u,p:d})}return v.addedLength=u,e[n]=v,v}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:p,getNewSegment:h,buildBezierData:i}}function dataFunctionManager(){function t(t,e){var a,r,s,i=t.length;for(a=0;i>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(s=t[a].s.length,r=0;s>r;r+=1)t[a].s[r]*=e,void 0!==t[a].e&&(t[a].e[r]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function e(i,o){var h,l,m,p,d,c,f,y,v,b,E=i.length;for(c=0;E>c;c+=1)if(m=i[c],"ks"in m&&!m.completed){if(m.completed=!0,h=Math.round(m.op-m.st),l=m.st,m.tt&&(i[c-1].td=m.tt),m.renderedFrame={},m.renderedData={},p=[],d=-1,m.tm){m.trmp=m.tm;var C=new Array(Math.round(h));for(f=0;h>f;f+=1)C[f]=Math.floor(n(m.tm,f,l)*u);m.tm=C}if(m.ks.o instanceof Array?t(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?t(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?t(m.ks.r,g):m.ks.r*=g,m.hasMask){var D=m.masksProperties;for(y=D.length,f=0;y>f;f+=1)if(D[f].pt.i)s(D[f].pt);else for(b=D[f].pt.length,v=0;b>v;v+=1)D[f].pt[v].s&&s(D[f].pt[v].s[0]),D[f].pt[v].e&&s(D[f].pt[v].e[0])}0===m.ty?(m.layers=a(m.refId,o),e(m.layers,o)):4===m.ty&&r(m.shapes)}}function a(t,e){for(var a=0,r=e.length;r>a;){if(e[a].id===t)return e[a].layers;a+=1}}function r(e,a){var i,n,o,h,l=e.length,m=a?a:!1;for(i=l-1;i>=0;i-=1)if(e[i].renderedData=[],"tm"==e[i].ty&&(m=!0),"fl"==e[i].ty||"st"==e[i].ty)e[i].o instanceof Array?t(e[i].o,.01):e[i].o*=.01;else if("sh"==e[i].ty)if(e[i].trimmed=m,e[i].ks.i)s(e[i].ks);else for(o=e[i].ks.length,n=0;o>n;n+=1)e[i].ks[n].s&&(s(e[i].ks[n].s[0]),s(e[i].ks[n].e[0]));else"gr"==e[i].ty?r(e[i].it,m):"tr"==e[i].ty?(h=e[i],h.renderedData=[],h.o instanceof Array?t(h.o,.01):h.o/=100,h.s instanceof Array?t(h.s,.01):h.s/=100,h.r instanceof Array?t(h.r,g):h.r*=g):("rc"==e[i].ty||"el"==e[i].ty)&&(e[i].trimmed=m,e[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 i(t){t.__renderedFrames=new Array(Math.floor(t.tf)),t.__renderFinished=!1,u=t.fr,e(t.layers,t.comps)}function n(t,e,a,r,s,i){var n,o,h,l,m,p,d=0;if(!t.length){if(r)for(;i>0;)r[s+d]=t,d+=1,i-=1;return t}if(void 0===t[0].t){if(r)for(;i>0;)r[s+d]=t[d],d+=1,i-=1;return t}m=0,p=t.length-1;for(var c=1,f=!0;!(!f||(n=t[m],o=t[m+1],m==p-1&&e>=o.t-a)||o.t-a>e&&1==c);){if(o.t-a<e&&-1==c){m+=1,n=t[m],o=t[m+1];break}p-1>m&&1==c||m>0&&-1==c?m+=c:f=!1}n.to&&!n.bezierData&&bez.buildBezierData(n);var u,y,g,v,b,E=0;if(r||(h=[]),n.to){if(l=n.bezierData,e>=o.t-a||e<n.t-a){var C=e>=o.t-a?l.points.length-1:0;if(r)for(;i>0;)r[s+d]=l.points[C].point[d],d+=1,i-=1;return l.points[C].point}n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y,n.n),n.__fnct=b),g=b("",e-(n.t-a),0,1,o.t-a-(n.t-a));var D,w=l.segmentLength*g,x=0;for(c=1,f=!0,v=l.points.length;f;){if(x+=l.points[E].partialLength*c,0===w||0===g||E==l.points.length-1){if(r)for(;i>0;)r[s+d]=l.points[E].point[d],d+=1,i-=1;else h=l.points[E].point;break}if(w>x&&w<x+l.points[E+1].partialLength){if(D=(w-x)/l.points[E+1].partialLength,r)for(;i>0;)r[s+d]=l.points[E].point[d]+(l.points[E+1].point[d]-l.points[E].point[d])*D,d+=1,i-=1;else for(y=l.points[E].point.length,u=0;y>u;u+=1)h.push(l.points[E].point[u]+(l.points[E+1].point[u]-l.points[E].point[u])*D);break}v-1>E&&1==c||E>0&&-1==c?E+=c:f=!1}}else{var _,S,A,I,M,F=!1;for(p=n.s.length,m=0;p>m;m+=1)1!==n.h&&(n.o.x instanceof Array?(F=!0,n.__fnct||(n.__fnct=[]),n.__fnct[m]||(_=n.o.x[m]?n.o.x[m]:n.o.x[0],S=n.o.y[m]?n.o.y[m]:n.o.y[0],A=n.i.x[m]?n.i.x[m]:n.i.x[0],I=n.i.y[m]?n.i.y[m]:n.i.y[0])):(F=!1,n.__fnct||(_=n.o.x,S=n.o.y,A=n.i.x,I=n.i.y)),F?n.__fnct[m]?b=n.__fnct[m]:(b=bez.getEasingCurve(_,S,A,I),n.__fnct[m]=b):n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(_,S,A,I),n.__fnct=b),g=e>=o.t-a?1:e<n.t-a?0:b("",e-(n.t-a),0,1,o.t-a-(n.t-a))),M=1===n.h?n.s[m]:n.s[m]+(n.e[m]-n.s[m])*g,r?i>0&&(r[s+d]=M,d+=1,i-=1):1===p?h=M:h.push(M)}return h}function o(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,r=t.v,s=t.o,i=t.i,n=r.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(r[a],r[a+1],s[a],i[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(r[a],r[0],s[a],i[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function h(t,e,a,r,s,i){var n=i&&i.length>0,o={};o.closed=s?t.cl:t.closed;var h=s?t.pt:t.ks;if(h.v)return o.pathNodes=n?v(h,o.closed,i,!1):h,o;var l,m,p,d,c,f,u;if(e<h[0].t-a||e>h[h.length-1].t-a){var y,g,b,E;if(e<h[0].t-a?(E="__minValue",g=0,b=h.__minValue,y=h[g].s):(E="__maxValue",g=h.length-2,b=h.__maxValue,y=h[g].e),!b){for(m=h[g].s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=h[g].s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)c[p]=y[0].i[l][p],f[p]=y[0].o[l][p],u[p]=y[0].v[l][p];t.i[l]=c,t.o[l]=f,t.v[l]=u}h[E]=t,b=t}return o.pathNodes=n?v(b,o.closed,i,!1):b,o}var C,D=!1;h.__lastData?C=h.__lastData.pathNodes:D=!0;for(var w,x,_=0,S=h.length-1,A=1,I=!0;I&&(w=h[_],x=h[_+1],!(x.t-a>e&&1==A));)S-1>_&&1==A||_>0&&-1==A?_+=A:I=!1;var M;if(1!==w.h){var F;w.__fnct?F=w.__fnct:(F=bez.getEasingCurve(w.o.x,w.o.y,w.i.x,w.i.y),w.__fnct=F),M=e>=x.t-a?1:e<w.t-a?0:F("",e-(w.t-a),0,1,x.t-a-(w.t-a))}if(1===w.h&&w.__hValue)t=w.__hValue;else for(m=w.s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=w.s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)1===w.h?(c[p]=w.s[0].i[l][p],f[p]=w.s[0].o[l][p],u[p]=w.s[0].v[l][p]):(c[p]=w.s[0].i[l][p]+(w.e[0].i[l][p]-w.s[0].i[l][p])*M,f[p]=w.s[0].o[l][p]+(w.e[0].o[l][p]-w.s[0].o[l][p])*M,u[p]=w.s[0].v[l][p]+(w.e[0].v[l][p]-w.s[0].v[l][p])*M),C&&(C.i[l]&&C.o[l]&&C.v[l]&&C.i[l][p]===c[p]&&C.o[l][p]===f[p]&&C.v[l][p]===u[p]||(D=!0));t.i[l]=c,t.o[l]=f,t.v[l]=u,1===w.h&&(w.__hValue=t)}return n?o.pathNodes=v(t,o.closed,i,!1):(D?(o.pathNodes=t,h.__lastData=o):o.pathNodes=h.__lastData,o.pathNodes=t),o}function l(t,e,a){var r,s,i,o,m,d,c,f,g,v,E,C=t.length;for(f=0;C>f;f+=1)if(g=t[f],"ks"in t[f]){if(o=e-g.st,r={},r.a=n(g.ks.a,o,g.st),r.o=n(g.ks.o,o,g.st),g.ks.p.s?(n(g.ks.p.x,o,g.st,b,3,1),n(g.ks.p.y,o,g.st,b,4,1)):n(g.ks.p,o,g.st,b,3,2),n(g.ks.r,o,g.st,b,0,1),n(g.ks.s,o,g.st,b,1,2),c={},v=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]),E=!1,g.__lastRenderAn&&r.o===g.__lastRenderAn.tr.o&&r.a[0]===g.__lastRenderAn.tr.a[0]&&r.a[1]===g.__lastRenderAn.tr.a[1]&&v[1]===g.__lastRenderAn.matrixArray[1]&&v[2]===g.__lastRenderAn.matrixArray[2]&&v[3]===g.__lastRenderAn.matrixArray[3]&&v[4]===g.__lastRenderAn.matrixArray[4]&&v[5]===g.__lastRenderAn.matrixArray[5]?c.an=g.__lastRenderAn:(c.an={tr:r},c.an.matrixArray=v,g.__lastRenderAn=c.an),g.renderedData[o]=c,g.hasMask)for(s=g.masksProperties,d=s.length,m=0;d>m;m+=1)s[m].paths||(s[m].paths=[],s[m].opacity=[]),s[m].paths[o]=h(s[m],o,g.st,a,!0),s[m].opacity[o]=n(s[m].o,o,g.st),s[m].opacity[o]=s[m].opacity[o]instanceof Array?s[m].opacity[o][0]/100:s[m].opacity[o]/100;e<g.ip||e>g.op||(0===g.ty?(i=g.tm?g.tm[o]<0?0:o>=g.tm.length?g.tm[g.tm.length-1]:g.tm[o]:o,void 0===i&&(i=n(g.trmp,o,0)[0]*u,g.tm[o]=i),l(g.layers,i,a)):4===g.ty&&p(g.shapes,o,g.st,a))}}function m(t,e,a,r){a=Math.min(e[0],e[1],a/2);var s=new Array(8),i=new Array(8),n=new Array(8),o=a/2;return 2===r?(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=s[0],i[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],s[1]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[1]=[t[0]+e[0]/2,t[1]+e[1]/2-o],i[1]=s[1],s[2]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[2]=s[2],i[2]=[t[0]+e[0]/2-o,t[1]+e[1]/2],s[3]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[3]=[t[0]-e[0]/2+o,t[1]+e[1]/2],i[3]=s[3],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=s[4],i[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],s[5]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[5]=[t[0]-e[0]/2,t[1]-e[1]/2+o],i[5]=s[5],s[6]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[6]=s[6],i[6]=[t[0]-e[0]/2+o,t[1]-e[1]/2],s[7]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[7]=[t[0]+e[0]/2-o,t[1]-e[1]/2],i[7]=s[7]):(s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],i[0]=s[0],s[1]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[1]=s[1],i[1]=[t[0]+e[0]/2-o,t[1]-e[1]/2],s[2]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[2]=[t[0]-e[0]/2+o,t[1]-e[1]/2],i[2]=s[2],s[3]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[3]=s[3],i[3]=[t[0]-e[0]/2,t[1]-e[1]/2+o],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],i[4]=s[4],s[5]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[5]=s[5],i[5]=[t[0]-e[0]/2+o,t[1]+e[1]/2],s[6]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[6]=[t[0]+e[0]/2-o,t[1]+e[1]/2],i[6]=s[6],s[7]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[7]=s[7],i[7]=[t[0]+e[0]/2,t[1]+e[1]/2-o]),{v:s,o:n,i:i,c:!0}}function p(t,e,a,r,s){var i,o,l,c,f,u,g,E,C,D,w=t.length;s||(s=[]);var x,_,S,A,I;for(i=w-1;i>=0;i-=1)if(o=t[i],"sh"==o.ty)o.renderedData[e]={path:h(o,e,a,r,!1,s)};else if("fl"==o.ty)l=n(o.c,e,a),c=n(o.o,e,a),o.renderedData[e]={opacity:c instanceof Array?c[0]:c},"canvas"==r?(d(l),o.renderedData[e].color=l):o.renderedData[e].color=rgbToHex(Math.round(l[0]),Math.round(l[1]),Math.round(l[2]));else if("rc"==o.ty)f=n(o.p,e,a),u=n(o.s,e,a),g=n(o.r,e,a),o.trimmed?(o.closed=!0,o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(m(f,u,g,o.d),!0,s,!1)):o.renderedData[e]={position:f,size:u,roundness:g};else if("el"==o.ty){if(f=n(o.p,e,a),u=n(o.s,e,a),o.renderedData[e]={p:f,size:u},"svg"==r){var M={v:new Array(4),i:new Array(4),o:new Array(4)};2!==o.d&&3!==o.d?(M.v[0]=[f[0],f[1]-u[1]/2],M.i[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.o[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]+u[0]/2,f[1]],M.i[1]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.o[1]=[f[0]+u[0]/2,f[1]+u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.i[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.o[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]-u[0]/2,f[1]],M.i[3]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.o[3]=[f[0]-u[0]/2,f[1]-u[1]/2*.55]):(M.v[0]=[f[0],f[1]-u[1]/2],M.o[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],M.i[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],M.v[1]=[f[0]-u[0]/2,f[1]],M.o[1]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],M.i[1]=[f[0]-u[0]/2,f[1]-u[1]/2*.55],M.v[2]=[f[0],f[1]+u[1]/2],M.o[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],M.i[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],M.v[3]=[f[0]+u[0]/2,f[1]],M.o[3]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],M.i[3]=[f[0]+u[0]/2,f[1]+u[1]/2*.55]),o.trimmed?(o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(M,!0,s,!1),o.closed=!0):(o.renderedData[e].path={pathNodes:M},o.closed=!0)}}else if("st"==o.ty){if(E=n(o.c,e,a),C=n(o.o,e,a),D=n(o.w,e,a),o.renderedData[e]={opacity:C instanceof Array?C[0]:C,width:D instanceof Array?D[0]:D},o.d){var F=[];I=o.d.length;var P;for(A=0;I>A;A+=1)P=n(o.d[A].v,e,a),F.push({v:P instanceof Array?P[0]:P,n:o.d[A].n});o.renderedData[e].dashes=F}"canvas"==r?(d(E),o.renderedData[e].color=E):o.renderedData[e].color=rgbToHex(Math.round(E[0]),Math.round(E[1]),Math.round(E[2]))}else if("tr"==o.ty)o.renderedData[e]={a:n(o.a,e,a),o:n(o.o,e,a)},n(o.s,e,a,b,1,2),n(o.r,e,a,b,0,1),n(o.p,e,a,b,3,2),o.renderedData[e].mtArr=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]);else if("tm"==o.ty){x=n(o.s,e,a),_=n(o.e,e,a),S=n(o.o,e,a);var k={s:x,e:_,o:S};s.push(k),o.renderedData[e]=k}else"gr"==o.ty&&p(o.it,e,a,r,s)}function d(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function c(t,e){for(var a=1;a>0;){if(e+=1,e>=Math.floor(t.tf)){t.__renderFinished=!0;break}t.__renderedFrames[e]||(f(t,e),a-=1)}}function f(t,e){return 2==t.__renderedFrames[e]?void(t.__renderFinished||c(t,e)):(u=t.fr,t.__renderedFrames[e]=2,void l(t.layers,e,t._animType))}var u=0,y=new MatrixManager,g=Math.PI/180,v=function(){function t(t,i,n,o,p){r[h]=i,e[h+1]=n,a[h+1]=o,l?a[h]=t:(m+=" M"+t.join(","),l=!0,s[h]=t),m+=" C"+i.join(",")+" "+n.join(",")+" "+o.join(","),h+=1}var e,a,r,s,i,n,h,l=!1,m="";return function(p,d,c,f){o(p,d);var u,y=c.length,g=p;a=e=r=s=null;var v,b,E,C,D;for(u=y-1;u>=0;u-=1){var w=[],x=c[u].o%360/360;if(0!==x||0!==c[u].s||100!=c[u].e){m="",l=!1,e=[],r=[],a=[],s=[],i=[],n=0,0>x&&(x+=1);var _=c[u].s/100+x,S=c[u].e/100+x;if(_==S)return f?"":{};if(_>S){var A=_;_=S,S=A}1>=S?w.push({s:g.__totalLength*_,e:g.__totalLength*S}):_>=1?w.push({s:g.__totalLength*(_-1),e:g.__totalLength*(S-1)}):(w.push({s:g.__totalLength*_,e:g.__totalLength}),w.push({s:0,e:g.__totalLength*(S-1)})),v=[],b=[],E=[];var I;v=g.v,b=g.o,E=g.i,I=g.__lengths,D=v.length;var M,F,P=0,k=0,N=w.length;for(h=0,M=0;N>M;M+=1){for(P=0,C=1;D>C;C++)if(k=I[C-1].addedLength,P+k<w[M].s)P+=k;else{if(P>w[M].e)break;w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[C],v[C],I[C-1]):(F=bez.getNewSegment(v[C-1],v[C],b[C-1],E[C],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2)),P+=k}d!==!1?P<=w[M].e&&(k=I[C-1].addedLength,w[M].s<=P&&w[M].e>=P+k?t(v[C-1],b[C-1],E[0],v[0],I[C-1]):(F=bez.getNewSegment(v[C-1],v[0],b[C-1],E[0],(w[M].s-P)/k,(w[M].e-P)/k,I[C-1]),t(F.pt1,F.pt3,F.pt4,F.pt2))):l=!1}d=!1}}if(a?(v=a,b=r,E=e):(v=g.v,b=g.o,E=g.i,s=[]),D=v.length,f){for(m="",C=1;D>C;C++)s[C-1]?m+="M"+s[C-1].join(","):1==C&&(m+="M"+v[0].join(",")),m+=" C"+b[C-1].join(",")+" "+E[C].join(",")+" "+v[C].join(",");return d!==!1&&(m+=" C"+b[C-1].join(",")+" "+E[0].join(",")+" "+v[0].join(",")),m}return{i:E,o:b,v:v,s:s,c:d}}}(),b=[0,1,1,0,0],E={};return E.completeData=i,E.renderFrame=f,E}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.destroyed=!1}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,r=15;for(a=0;r>a;a+=1)this.contextData.saved[a]=new Array(6);this.elements=[]}function MaskElement(t,e,a){this.data=t,this.storedData=[],this.element=e,this.globalData=a,this.paths=[],this.registeredEffects=[],this.masksProperties=[],this.maskElement=null}function ICompElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r),this.layers=t.layers}function IImageElement(t,e,a,r){this.assetData=a.getAssetData(t.ll),this.path=a.getPath(),this.parent.constructor.call(this,t,e,a,r)}function IShapeElement(t,e,a,r){this.shapes=[],this.parent.constructor.call(this,t,e,a,r)}function ShapeItemElement(t,e,a,r,s){this.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},this.stylesList=[],this.viewData=[],this.shape=e,this.parentContainer=a,this.placeholder=r,this.data=t,this.globalData=s,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}function ITextElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}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.assetData=this.animationItem.getAssetData(t.ll),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.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},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 r,s=this.dataLength-1;this.renderedPaths=new Array(this.globalData.totalFrames);var i;for(r=s;r>=0;r-=1)"gr"==this.data[r].ty?this.data[r].item=new CVShapeItemElement(this.data[r].it,!1,this.globalData):("st"==this.data[r].ty||"fl"==this.data[r].ty)&&(i={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[r].ty?i.type="fill":(i.type="stroke",i.width=0,i.lc=this.lcEnum[this.data[r].lc]||"round",i.lj=this.ljEnum[this.data[r].lj]||"round",1==this.data[r].lj&&(i.ml=this.data[r].ml)),this.stylesPool.push(i))}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),r=2*(a.x*t+a.y*e);return t-=r*a.x,e-=r*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 1==t?this:this._t(t,0,0,1,0,0)},scaleY:function(t){return 1==t?this: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,r,s,i){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=r,this.props[4]=s,this.props[5]=i,this._x()},translate:function(t,e){return 0===t&&0===e?this: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,r,s,i){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*r,this.props[3]=this.b1*a+this.d1*r,this.props[4]=this.a1*s+this.c1*i+this.e1,this.props[5]=this.b1*s+this.d1*i+this.f1,this},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,r=t.c,s=t.d,i=t.e,n=t.f,o=new Matrix,h=e*s-a*r;return o.a=s/h,o.b=-a/h,o.c=-r/h,o.d=e/h,o.e=(r*n-s*i)/h,o.f=-(e*n-a*i)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix;return s.a=r.a+(t.a-r.a)*e,s.b=r.b+(t.b-r.b)*e,s.c=r.c+(t.c-r.c)*e,s.d=r.d+(t.d-r.d)*e,s.e=r.e+(t.e-r.e)*e,s.f=r.f+(t.f-r.f)*e,s._x()},interpolateAnim:function(t,e,a){var r=this,s=a?new Matrix(a):new Matrix,i=r.decompose(),n=t.decompose(),o=i.rotation+(n.rotation-i.rotation)*e,h=i.translate.x+(n.translate.x-i.translate.x)*e,l=i.translate.y+(n.translate.y-i.translate.y)*e,m=i.scale.x+(n.scale.x-i.scale.x)*e,p=i.scale.y+(n.scale.y-i.scale.y)*e;return s.translate(h,l),s.rotate(o),s.scale(m,p),s._x()},decompose:function(t){var e=this.props[0],a=this.props[1],r=this.props[2],s=this.props[3],i=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},m=0,p={x:1,y:1},d={x:0,y:0},c=e*s-a*r;if(t)e?(d={x:n(r/e),y:n(a/e)},p={x:e,y:c/e}):a?(m=.5*h,p={x:a,y:c/a},d.x=n(s/a)):(p={x:r,y:s},d.x=.25*h);else if(e||a){var f=o(e*e+a*a);m=a>0?i(e/f):-i(e/f),p={x:f,y:c/f},d.x=n((e*r+a*s)/(f*f))}else if(r||s){var u=o(r*r+s*s);m=.5*h-(s>0?i(-r/u):-i(r/u)),p={x:c/u,y:u},d.y=n((e*r+a*s)/(u*u))}else p={x:0,y:0};return{scale:p,translate:l,rotation:m,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,r=0,s=[];if("number"==typeof t[0])for(a=t.length;a>r;)e=this.applyToPoint(t[r++],t[r++]),s.push(e.x,e.y);else for(a=t.length,r=0;a>r;r++)s.push(this.applyToPoint(t[r].x,t[r].y));return s},applyToTypedArray:function(t,e){for(var a,r=0,s=t.length,i=e?new Float64Array(s):new Float32Array(s);s>r;)a=this.applyToPoint(t[r],t[r+1]),i[r++]=a.x,i[r++]=a.y;return i},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,r,s,i,n,o){this.save(),this.translate(t,e),this.rotate(s),this.scale(a,r),this.arc(0,0,1,i,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,r=[];for(e=0;a>e;e+=1)r.push(arguments[e]);this.ops_.push({type:t,args:r})}}for(var a=CanvasRenderingContext2D.prototype,r=BM_CanvasRenderingContext2D.prototype,s=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],i=0;i<s.length;i++){var n=s[i];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;r.fill=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];"transform"==s.type?this.renderer.ctxTransform(s.args):"save"==s.type?this.renderer.save():"restore"==s.type?this.renderer.restore():this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);o.apply(this.renderer.canvasContext,i)}else o.apply(this.renderer.canvasContext,arguments)},r.stroke=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}h.call(this.renderer.canvasContext)}else h.call(this.renderer.canvasContext)},r.clip=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var s=e.ops_[a];this.renderer.canvasContext[s.type].apply(this.renderer.canvasContext,s.args)}r=arguments.length;var i=[];for(a=1;r>a;a+=1)i.push(arguments[a]);l.apply(this.renderer.canvasContext,i)}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,a){var r=(new Date).getTime(),s=Math.max(0,16-(r-t)),i=window.setTimeout(function(){e(r+s)},s);return t=r+s,i}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},bm_rnd=Math.round,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,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+a[t]+a[e]+a[r]}}(),fillColorToString=function(){var t=[];return function(e,a){return void 0!==a&&(e[3]=a),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.createItem=function(t,e,a){switch(t.ty){case 2:return this.createImage(t,e,a);case 0:return this.createComp(t,e,a);case 1:return this.createSolid(t,e,a);case 4:return this.createShape(t,e,a);case 5:return this.createText(t,e,a);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e)},SVGRenderer.prototype.buildItems=function(t,e,a,r){var s,i=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var n;for(s=i-1;s>=0;s--)a[s]=this.createItem(t[s],e,r),0===t[s].ty&&(n=[],
+this.buildItems(t[s].layers,a[s].getDomElement(),n,r),a[s].setElements(n)),t[s].td&&a[s+1].setMatte(a[s].layerId)},SVGRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements),e||(e=this.animationItem.container);var i,n,o,h=a.length;for(r=0;s>r;r+=1)for(i=0;h>i;){if(a[i].data.id==t[r].id){o=a[i],a[i]=this.createItem(t[r],e,o),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,a[i].getDomElement(),n,o),a[i].setElements(n));break}i+=1}},SVGRenderer.prototype.createBase=function(t,e,a){return new BaseElement(t,e,this.globalData,a)},SVGRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e,a){return new IShapeElement(t,e,this.globalData,a)},SVGRenderer.prototype.createText=function(t,e,a){return new ITextElement(t,e,this.globalData,a)},SVGRenderer.prototype.createImage=function(t,e,a){return new IImageElement(t,e,this.globalData,a)},SVGRenderer.prototype.createComp=function(t,e,a){return new ICompElement(t,e,this.globalData,a)},SVGRenderer.prototype.createSolid=function(t,e,a){return new ISolidElement(t,e,this.globalData,a)},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.w),this.animationItem.container.setAttribute("height",t.h),this.animationItem.container.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transform="translate3d(0,0,0)",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),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.compSize={w:t.w,h:t.h};var a=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var s="animationMask_"+randomString(10);a.setAttribute("id",s),a.appendChild(r);var i=document.createElementNS(svgNS,"g");i.setAttribute("clip-path","url(#"+s+")"),this.animationItem.container.appendChild(i),e.appendChild(a),this.animationItem.container=i,this.layers=t.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var r,s,i=e.length;for(a||(a=this.elements),r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemParenting(s,a[r],e,s.parent,a,!0),0===s.ty&&this.buildStage(a[r].getComposingElement(),s.layers,a[r].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,r,s,i){t.parents||(t.parents=[]),i&&e.resetHierarchy();for(var n=0,o=a.length;o>n;)a[n].ind==r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemParenting(t,e,a,a[n].parent,s,!1)),n+=1},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t&&!this.destroyed){null===t?t=this.lastFrame: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].st);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.createItem=function(t){switch(t.ty){case 0:return this.createComp(t);case 1:return this.createSolid(t);case 2:return this.createImage(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 99:return this.createPlaceHolder(t);default:return this.createBase(t)}return this.createBase(t,parentContainer)},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,r=t.length;for(a=0;r>a;a++)if(e[a]=this.createItem(t[a]),0===t[a].ty){var s=[];this.buildItems(t[a].layers,s),e[e.length-1].setElements(s)}},CanvasRenderer.prototype.includeLayers=function(t,e,a){var r,s=t.length;a||(a=this.elements);var i,n,o=a.length;for(r=0;s>r;r+=1)for(i=0;o>i;){if(a[i].data.id==t[r].id){a[i]=this.createItem(t[r],e),0===t[r].ty&&(n=[],this.buildItems(t[r].layers,n),a[i].setElements(n));break}i+=1}},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.createPlaceHolder=function(t){return new PlaceHolderElement(t,null,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*=0>t?0:t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=0>t?0: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]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(6));var a,r=6,s=this.contextData.saved[this.contextData.cArrPos];for(a=0;r>a;a+=1)s[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],r=6,s=this.contextData.cTr.props;for(e=0;r>e;e+=1)s[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.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,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,r=this.transformCanvas.w/this.transformCanvas.h;r>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 r,s,i=e.length;for(r=i-1;r>=0;r--)s=e[r],void 0!==s.parent&&this.buildItemHierarchy(s,a[r],e,s.parent,a,!0),0==s.ty&&this.buildStage(null,s.layers,a[r].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,r,s,i){var n=0,o=a.length;for(i&&e.resetHierarchy();o>n;)a[n].ind===r&&(e.getHierarchy().push(s[n]),void 0!==a[n].parent&&this.buildItemHierarchy(t,e,a,a[n].parent,s,!1)),n+=1},CanvasRenderer.prototype.prepareFrame=function(t){if(!this.destroyed){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st)}},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw()},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.bmCtx=null,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){this.lastFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||(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.masksProperties=this.data.masksProperties;var t,e,a,r,s,i=this.element.maskedElement,n=this.globalData.defs,o=this.masksProperties.length,h=this.data.masksProperties,l=0,m=[],p=randomString(10);for(this.maskElement=document.createElementNS(svgNS,"mask"),t=0;o>t;t++)if("s"!=h[t].mode&&"i"!=h[t].mode||0!=l||(s=document.createElementNS(svgNS,"rect"),s.setAttribute("fill","#ffffff"),s.setAttribute("x","0"),s.setAttribute("y","0"),s.setAttribute("width","100%"),s.setAttribute("height","100%"),m.push(s)),!("f"==h[t].mode&&l>0||"n"==h[t].mode)){if(l+=1,e=document.createElementNS(svgNS,"path"),h[t].cl?"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"):(e.setAttribute("fill","none"),"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"),e.setAttribute("stroke-width","1"),e.setAttribute("stroke-miterlimit","10")),e.setAttribute("clip-rule","nonzero"),this.storedData[t]={elem:e,lastPath:""},"i"==h[t].mode){r=m.length;var d=document.createElementNS(svgNS,"g");for(a=0;r>a;a+=1)d.appendChild(m[a]);var c=document.createElementNS(svgNS,"mask");c.setAttribute("mask-type","alpha"),c.setAttribute("id",p+"_"+l),c.appendChild(e),n.appendChild(c),d.setAttribute("mask","url(#"+p+"_"+l+")"),m.length=0,m.push(d)}else m.push(e);h[t].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath())}for(o=m.length,t=0;o>t;t+=1)this.maskElement.appendChild(m[t]);this.maskElement.setAttribute("id",p),l>0&&i.setAttribute("mask","url(#"+p+")"),n.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length,r=0;for(e=0;a>e;e++)"f"==this.data.masksProperties[e].mode&&r>0||"n"==this.data.masksProperties[e].mode||(r+=1,this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes,this.storedData[e]))},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,r=this.registeredEffects.length;for(a=0;r>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.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,a){var r,s,i="";if(e.__renderedString)i=e.__renderedString;else{for(s=e.v.length,r=1;s>r;r+=1)1==r&&(i+=" M"+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[r][0])+","+bm_rnd(e.i[r][1])+" "+bm_rnd(e.v[r][0])+","+bm_rnd(e.v[r][1]);t.cl&&(i+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),e.__renderedString=i}a.lastPath!==i&&(t.inv?a.elem.setAttribute("d",this.solidPath+i):a.elem.setAttribute("d",i),a.lastPath=i)},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.registeredEffects=null,this.masksProperties=null};var BaseElement=function(t,e,a,r){this.globalData=a,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.matteElement=null,this.lastData={},this.renderedFrames=[],this.parentContainer=e,this.layerId=r?r.layerId:"ly_"+randomString(10),this.hidden=!1,this.placeholder=r,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},BaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},BaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var a=document.createElementNS(svgNS,"filter"),r=randomString(10);a.setAttribute("id",r),a.setAttribute("filterUnits","objectBoundingBox"),a.setAttribute("x","0%"),a.setAttribute("y","0%"),a.setAttribute("width","100%"),a.setAttribute("height","100%");var s=document.createElementNS(svgNS,"feComponentTransfer");s.setAttribute("in","SourceGraphic"),a.appendChild(s);var i=document.createElementNS(svgNS,"feFuncA");i.setAttribute("type","table"),i.setAttribute("tableValues","1.0 0.0"),s.appendChild(i),this.globalData.defs.appendChild(a);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+r+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.appendNodeToParent(this.matteElement)):this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.appendNodeToParent(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){if(this.data.renderedData[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(!this.data.renderedData[t]||3===this.data.ty)return!1;if(this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff,t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o;var a,r=this.finalTransform.mat;if(e&&(a=e.mat.props,r.reset().transform(a[0],a[1],a[2],a[3],a[4],a[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var s,i=this.hierarchy.length;for(e||r.reset(),s=i-1;s>=0;s-=1)a=this.hierarchy[s].ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5]);a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])}else this.isVisible&&(e?(a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])):(r.props[0]=this.ownMatrix.props[0],r.props[1]=this.ownMatrix.props[1],r.props[2]=this.ownMatrix.props[2],r.props[3]=this.ownMatrix.props[3],r.props[4]=this.ownMatrix.props[4],r.props[5]=this.ownMatrix.props[5]));if(this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===n&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(n,this.finalTransform.opacity)}var o=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=o.tr&&this.layerElement.setAttribute("transform",o.tr),this.lastData.o!==o.o&&this.layerElement.setAttribute("opacity",o.o),this.lastData=o}return this.isVisible},BaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData),this.maskManager.init()},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 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},BaseElement.prototype.hide=function(){};var PlaceHolderElement=function(t,e,a){if(this.data=t,this.globalData=a,e){this.parentContainer=e;var r=document.createElementNS(svgNS,"g");r.setAttribute("id",this.data.id),e.appendChild(r),this.phElement=r}this.layerId="ly_"+randomString(10)};PlaceHolderElement.prototype.prepareFrame=function(){},PlaceHolderElement.prototype.renderFrame=function(){},PlaceHolderElement.prototype.draw=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 r,s=this.layers.length,i=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(r=0;s>r;r+=1)this.elements[r].prepareFrame(i-this.layers[r].st);for(r=0;s>r;r+=1)this.data.hasMask?this.elements[r].renderFrame(i-this.layers[r].st):this.elements[r].renderFrame(i-this.layers[r].st,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this.parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t].destroy()},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.assetData.p),t.maskedElement=t.image},a=new Image;a.addEventListener("load",e,!1),a.addEventListener("error",e,!1),a.src=this.path+this.assetData.p,this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.assetData.w+"px"),this.image.setAttribute("height",this.assetData.h+"px"),this.layerElement===this.parentContainer?this.appendNodeToParent(this.image):this.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||(this.image.setAttribute("visibility","hidden"),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&&(this.lastData.o=-1,this.hidden=!1,this.image.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.image.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.image.setAttribute("opacity",s.o),this.lastData=s}},IImageElement.prototype.destroy=function(){this.parent.destroy.call(),this.image=null},createElement(BaseElement,IShapeElement),IShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix},IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.parentContainer,this.placeholder,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,this.transformHelper,null,null,!0):this.mainShape.renderShape(t,this.finalTransform,null,null,!0)},IShapeElement.prototype.destroy=function(){this.parent.destroy.call(),this.mainShape.destroy()},ShapeItemElement.prototype.appendNodeToParent=BaseElement.prototype.appendNodeToParent,ShapeItemElement.prototype.searchShapes=function(t,e){var a,r,s,i=t.length-1,n=[];for(a=i;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");"st"==t[a].ty&&(o.setAttribute("stroke-linecap",this.lcEnum[t[a].lc]||"round"),o.setAttribute("stroke-linejoin",this.ljEnum[t[a].lj]||"round"),1==t[a].lj&&o.setAttribute("stroke-miterlimit",t[a].ml)),this.shape===this.parentContainer?this.appendNodeToParent(o):this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:"",ld:""}),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:""}},s=this.stylesList.length,r=0;s>r;r+=1)this.stylesList[r].closed||(e[a].styles.push(this.stylesList[r]),"st"==this.stylesList[r].type&&this.stylesList[r].pathElement.setAttribute("fill-opacity",0));for(i=n.length,a=0;i>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","M 0,0"),this.stylesList[t].ld="M 0,0"},ShapeItemElement.prototype.renderShape=function(t,e,a,r,s){var i,n;if(!a)for(a=this.data,n=this.stylesList.length,i=0;n>i;i+=1)this.stylesList[i].d="";r||(r=this.viewData),this.frameNum=t,n=a.length-1;var o,h;for(o=e,i=n;i>=0;i-=1)if("tr"==a[i].ty){var l=a[i].renderedData[t].mtArr;if(o=r[i].transform,h=o.mat,h.reset(),e){var m=e.mat.props;o.opacity=e.opacity,o.opacity*=a[i].renderedData[t].o,h.transform(m[0],m[1],m[2],m[3],m[4],m[5])}else o.opacity=a[i].renderedData[t].o;h.transform(l[0],l[1],l[2],l[3],l[4],l[5]).translate(-a[i].renderedData[t].a[0],-a[i].renderedData[t].a[1])}else"sh"==a[i].ty?this.renderPath(a[i],r[i],t,o):"el"==a[i].ty?this.renderPath(a[i],r[i],t,o):"rc"==a[i].ty?a[i].trimmed?this.renderPath(a[i],r[i],t,o):this.renderRect(a[i],r[i],t,o):"fl"==a[i].ty?this.renderFill(a[i],r[i],t,o):"st"==a[i].ty?this.renderStroke(a[i],r[i],t,o):"gr"==a[i].ty?this.renderShape(t,o,a[i].it,r[i].it):"tm"==a[i].ty;if(s)for(n=this.stylesList.length,i=0;n>i;i+=1)""==this.stylesList[i].d&&""!==this.stylesList[i].ld?(this.stylesList[i].pathElement.setAttribute("d","M 0,0"),this.stylesList[i].ld=this.stylesList[i].d):this.stylesList[i].ld!==this.stylesList[i].d&&(this.stylesList[i].pathElement.setAttribute("d",this.stylesList[i].d),this.stylesList[i].ld=this.stylesList[i].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,r){var s,i;if(!e.renderedFrames[this.globalData.frameNum]){var n=t.renderedData[a].path.pathNodes;if(!n.v)return;s=n.v.length;var o=n.s?n.s:[],h="";for(i=1;s>i;i+=1)o[i-1]?h+=" M"+bm_rnd(o[i-1][0])+","+bm_rnd(o[i-1][1]):1==i&&(h+=" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[i][0])+","+bm_rnd(n.i[i][1])+" "+bm_rnd(n.v[i][0])+","+bm_rnd(n.v[i][1]);1==s&&(h+=o[0]?" M"+bm_rnd(o[0][0])+","+bm_rnd(o[0][1]):" M"+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),!t.closed||t.trimmed&&!n.c||(h+=" C"+bm_rnd(n.o[i-1][0])+","+bm_rnd(n.o[i-1][1])+" "+bm_rnd(n.i[0][0])+","+bm_rnd(n.i[0][1])+" "+bm_rnd(n.v[0][0])+","+bm_rnd(n.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(s=e.styles.length,i=0;s>i;i+=1)e.styles[i].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld}var o=e.renderedFrames[this.globalData.frameNum];e.lastData.c!=o.c&&(i.pathElement.setAttribute("fill",o.c),e.lastData.c=o.c),e.lastData.o!=o.o&&(i.pathElement.setAttribute("fill-opacity",o.o),e.lastData.o=o.o),e.lastData.t!=o.t&&(i.pathElement.setAttribute("transform",o.t),e.lastData.t=o.t)},ShapeItemElement.prototype.renderStroke=function(t,e,a,r){var s=t.renderedData[a],i=e.style;if(!e.renderedFrames[this.globalData.frameNum]){var n="matrix("+r.mat.props.join(",")+")";if(e._ld&&e._ld.c===s.color&&e._ld.o===s.opacity*r.opacity&&e._ld.w===s.width&&e._ld.t===n)return void(e.renderedFrames[this.globalData.frameNum]=e._ld);e._ld={c:s.color,o:s.opacity*r.opacity,w:s.width,t:n},e.renderedFrames[this.globalData.frameNum]=e._ld,s.dashes&&(e.renderedFrames[this.globalData.frameNum].d=s.dashes)}var o,h,l=e.renderedFrames[this.globalData.frameNum],m=l.c,p=l.o,d=l.w,c=l.d,n=l.t;if(c){var f,u=c.length;for(o="",h="",f=0;u>f;f+=1)"o"!=c[f].n?o+=" "+c[f].v:h+=c[f].v;e.lastData.da!=o&&(i.pathElement.setAttribute("stroke-dasharray",o),e.lastData.da=o),e.lastData["do"]!=h&&(i.pathElement.setAttribute("stroke-dashoffset",h),e.lastData["do"]=h)}e.lastData.c!=m&&(i.pathElement.setAttribute("stroke",m),e.lastData.c=m),e.lastData.o!=p&&(i.pathElement.setAttribute("stroke-opacity",p),e.lastData.o=p),e.lastData.w!==d&&(i.pathElement.setAttribute("stroke-width",d),e.lastData.w=d),e.lastData.t!==n&&(i.pathElement.setAttribute("transform",n),e.lastData.t=n)},ShapeItemElement.prototype.destroy=function(t,e){this.shape=null,this.data=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement===this.parentContainer?this.appendNodeToParent(t):this.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||(this.rectElement.setAttribute("visibility","hidden"),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.hidden=!1,this.rectElement.setAttribute("visibility","visible")),!this.data.hasMask){if(!this.renderedFrames[this.globalData.frameNum]){var r="matrix("+this.finalTransform.mat.props.join(",")+")";this.renderedFrames[this.globalData.frameNum]=this.lastData&&this.lastData.tr===r&&this.lastData.o===this.finalTransform.opacity?this.lastData:new RenderedFrame(r,this.finalTransform.opacity)}var s=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=s.tr&&this.rectElement.setAttribute("transform",s.tr),this.lastData.o!==s.o&&this.rectElement.setAttribute("opacity",s.o),this.lastData=s}},ICompElement.prototype.destroy=function(){this.parent.destroy.call(),this.rectElement=null},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.parent.createElements.call(this)},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){if(!this.data.renderedData[t])return!1;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.ip-this.data.st<=t&&this.data.op-this.data.st>=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(3!==this.data.ty){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 r,s=this.hierarchy.length;for(t||a.reset(),r=s-1;r>=0;r-=1)e=this.hierarchy[r].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.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},CVBaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},CVBaseElement.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,r=this.elements.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(a=0;r>a;a+=1)this.elements[a].prepareFrame(s-this.layers[a].st)}},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},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this.parent.destroy.call()},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.assetData.p,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)}},CVImageElement.prototype.destroy=function(){this.img=null,this.animationItem=null,this.parent.destroy.call()},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)},CVShapeElement.prototype.destroy=function(){this.mainShape.destroy(),this.parent.destroy.call()},CVShapeItemElement.prototype.drawPaths=function(t){var e,a;t?(a=[],e=this.stylesList):e=this.renderedPaths[this.globalData.frameNum];var r,s=e.length,i=this.canvasContext;for(this.globalData.renderer.save(),r=0;s>r;r+=1)"stroke"==e[r].type?(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.lineCap=e[r].lc,i.lineJoin=e[r].lj,i.miterLimit=e[r].ml,i.strokeStyle=e[r].value,i.lineWidth=e[r].width,e[r].dasharray?(i.setLineDash(e[r].dasharray),i.lineDashOffset=e[r].dashoffset):(i.setLineDash([]),i.lineDashOffset=0),this.globalData.bmCtx.stroke(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&(a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,width:e[r].width,path:e[r].path}),e[r].dasharray&&(a[a.length-1].dasharray=e[r].dasharray,a[a.length-1].dashoffset=e[r].dashoffset))):"fill"==e[r].type&&(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),i.fillStyle=e[r].value,this.globalData.bmCtx.fill(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,path:e[r].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,r;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),r=this.dataLength-1,a=r;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(r=this.ownStylesList.length,a=0;r>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,r=new BM_Path2D,s=a.pathNodes;if(s instanceof Array&&(s=s[0]),s.v){var i,n=s.v.length,o=s.s?s.s:[];for(i=1;n>i;i+=1)o[i-1]?r.moveTo(bm_rnd(o[i-1][0]),bm_rnd(o[i-1][1])):1==i&&r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[i][0]),bm_rnd(s.i[i][1]),bm_rnd(s.v[i][0]),bm_rnd(s.v[i][1]));1==n&&(o[0]?r.moveTo(bm_rnd(o[0][0]),bm_rnd(o[0][1])):r.moveTo(bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1]))),!t.closed||t.trimmed&&!s.c||r.bezierCurveTo(bm_rnd(s.o[i-1][0]),bm_rnd(s.o[i-1][1]),bm_rnd(s.i[0][0]),bm_rnd(s.i[0][1]),bm_rnd(s.v[0][0]),bm_rnd(s.v[0][1])),this.addPathToStyles(r)}},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],r=a.roundness;if(0===r)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var s=a.position[0]-a.size[0]/2,i=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];r instanceof Array&&(r=r[0]),r>n/2&&(r=n/2),r>o/2&&(r=o/2),e.moveTo(s+r,i),e.lineTo(s+n-r,i),e.quadraticCurveTo(s+n,i,s+n,i+r),e.lineTo(s+n,i+o-r),e.quadraticCurveTo(s+n,i+o,s+n-r,i+o),e.lineTo(s+r,i+o),e.quadraticCurveTo(s,i+o,s,i+o-r),e.lineTo(s,i+r),e.quadraticCurveTo(s,i,s+r,i)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,r=!0,s=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>s&&this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(s=this.stylesList[e].width)):r&&"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&&(r=!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,r=e.dashes,s=r.length,i=[],n="";for(a=0;s>a;a+=1)"o"!=r[a].n?i.push(r[a].v):n=r[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=i,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},CVShapeItemElement.prototype.destroy=function(){this.data=null,this.globalData=null,this.canvasContext=null},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.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.parent.createElements.call(this)},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,r=new BM_Path2D,s=this.data.masksProperties.length;for(e=new BM_Path2D,a=0;s>a;a++)this.masksProperties[a].inv&&this.createInvertedMask(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes),this.drawShape(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes);e.addPath(r,t.mat.props),this.renderedFrames[this.globalData.frameNum]=e}this.globalData.bmCtx.clip(e)},CVMaskElement.prototype.drawShape=function(t,e){var a,r=e.v.length;for(t.moveTo(bm_rnd(e.v[0][0]),bm_rnd(e.v[0][1])),a=1;r>a;a++)t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[a][0]),bm_rnd(e.i[a][1]),bm_rnd(e.v[a][0]),bm_rnd(e.v[a][1]));t.bezierCurveTo(bm_rnd(e.o[a-1][0]),bm_rnd(e.o[a-1][1]),bm_rnd(e.i[0][0]),bm_rnd(e.i[0][1]),bm_rnd(e.v[0][0]),bm_rnd(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)},CVMaskElement.prototype.destroy=function(){this.ctx=null};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;b>e;){if(y[e].elem==t&&null!==y[e].elem)return y[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),y.push({elem:t,animation:a}),b+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),y.push({elem:null,animation:e}),b+=1,e}function a(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setSpeed(t,e)}function r(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setDirection(t,e)}function s(t){var e;for(e=0;b>e;e+=1)y[e].animation.play(t)}function i(t,e){v=!1,g=Date.now();var a;for(a=0;b>a;a+=1)y[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-g;for(t=0;b>t;t+=1)y[t].animation.renderer.destroyed?(y.splice(t,1),t-=1,b-=1):y[t].animation.advanceTime(a);g=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;b>e;e+=1)y[e].animation.pause(t)}function h(t,e,a){var r;for(r=0;b>r;r+=1)y[r].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;b>e;e+=1)y[e].animation.stop(t)}function m(t){var e;for(e=0;b>e;e+=1)y[e].animation.togglePause(t)}function p(t){var e;for(e=0;b>e;e+=1)y[e].animation.destroy(t)}function d(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function c(){var t;for(t=0;b>t;t+=1)y[t].animation.resize()}function f(){g=Date.now(),requestAnimationFrame(n)}var u={},y=[],g=0,v=!0,b=0;return setTimeout(f,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=r,u.play=s,u.moveFrame=i,u.pause=o,u.stop=l,u.togglePause=m,u.searchAnimations=d,u.resize=c,u.start=f,u.goToAndStop=h,u.destroy=p,u}(),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,this.removed=!1,this.timeCompleted=0,this.segmentPos=0,this.segments=[]};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 r=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.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 r=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:"";""===r||(e.loop="false"===r?!1:"true"===r?!0:parseInt(r)),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 s=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"===s&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.includeLayers=function(t){var e,a,r=this.animationData.layers,s=r.length,i=t.layers,n=i.length;for(a=0;n>a;a+=1)for(e=0;s>e;){if(r[e].id==i[a].id){r[e]=i[a];break}e+=1}if(t.comps)for(s=t.comps.length,e=0;s>e;e+=1)this.animationData.comps.push(t.comps[e]);dataManager.completeData(this.animationData),this.renderer.includeLayers(t.layers),this.renderer.buildStage(this.container,this.layers),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length)return this.trigger("bm:data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var a=new XMLHttpRequest,r=this,s=this.path+"data_"+this.segmentPos+".json";this.segmentPos+=1,a.open("GET",s,!0),a.send(),a.onreadystatechange=function(){if(4==a.readyState)if(200==a.status)r.includeLayers(JSON.parse(a.responseText));else try{var t=JSON.parse(a.responseText);r.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.comps||(t.comps=[]),this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip*this.frameRate),this.frameMult=this.animationData.fr/1e3,this.trigger("bm:config_ready"),this.loadSegments(),dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(this.renderer.buildStage(this.container,this.layers),this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationData,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.animationData,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.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationData,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.adjustSegment=function(t){this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.currentRawFrame=this.firstFrame},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var a,r=t.length;for(a=0;r>a;a+=1)this.segments.push(t[a])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.resetSegments=function(t){this.segments.push([Math.round(this.animationData.animation.ff*this.frameRate),Math.floor(this.animationData.animation.totalFrames+this.animationData.animation.ff*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||this.renderer.destroy()},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.segments.length&&this.adjustSegment(this.segments.shift()),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.getAssetData=function(t){for(var e=0,a=this.assets.length;a>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.getAssets=function(){return this.assets},AnimationItem.prototype.addEventListener=addEventListener,AnimationItem.prototype.trigger=triggerEvent,function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function r(t){animationManager.togglePause(t)}function s(t,e){animationManager.setSpeed(t,e)}function i(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 m(){animationManager.resize()}function p(){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(t){return animationManager.destroy(t)}function y(){"complete"===document.readyState&&(clearInterval(v),h())}var g={};g.play=e,g.pause=a,g.togglePause=r,g.setSpeed=s,g.setDirection=i,g.stop=n,g.moveFrame=o,g.searchAnimations=h,g.registerAnimation=l,g.loadAnimation=f,g.setSubframeRendering=c,g.resize=m,g.start=p,g.goToAndStop=d,g.destroy=u,g.checkReady=y,t.bodymovin=g;var v=setInterval(y,100)}(window);}(window));
\ No newline at end of file
diff --git a/extension/jsx/compsManager.jsx b/extension/jsx/compsManager.jsx
index 11e47c9..9bb7c9b 100644
--- a/extension/jsx/compsManager.jsx
+++ b/extension/jsx/compsManager.jsx
@@ -69,6 +69,7 @@
         var saveFileData = f.saveDlg();
         if (saveFileData !== null) {
             compData.absoluteURI = saveFileData.absoluteURI;
+            compData.settings.fsName = saveFileData.fsName;
             compData.destination = saveFileData.fsName;
         }
         bm_eventDispatcher.sendEvent('bm:compositions:list', compositions);
diff --git a/extension/jsx/hostscript.jsx b/extension/jsx/hostscript.jsx
index 5a518b4..2c01fbe 100644
--- a/extension/jsx/hostscript.jsx
+++ b/extension/jsx/hostscript.jsx
@@ -9,13 +9,7 @@
         var f = new File(Folder.desktop.absoluteURI);
         var openFileData = f.openDlg();
         if (openFileData !== null) {
-            var file = new File(openFileData.absoluteURI);
-            if (file.open('r')) {
-                var reading = file.read();
-                reading = '__PFX__' + reading;
-                bm_eventDispatcher.sendEvent('bm:file:path', reading);
-            }
-            
+            bm_eventDispatcher.sendEvent('bm:file:uri', openFileData.fsName);
         }
 
     }
diff --git a/extension/jsx/renderManager.jsx b/extension/jsx/renderManager.jsx
index 9f64ccc..1a4f7f2 100644
--- a/extension/jsx/renderManager.jsx
+++ b/extension/jsx/renderManager.jsx
@@ -102,10 +102,9 @@
     }
     
     function saveData() {
-        var string = JSON.stringify(ob.renderData.exportData);
         bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Saving data ', compId: currentCompID, progress: 1});
         bm_dataManager.saveData(ob.renderData.exportData, destinationPath, currentCompSettings);
-        bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Render finished ', compId: currentCompID, progress: 1, isFinished: true, data: '__PFX__' + string});
+        bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Render finished ', compId: currentCompID, progress: 1, isFinished: true, fsPath: currentCompSettings.fsName});
         reset();
         bm_compsManager.renderComplete();
     }
diff --git a/player/index.html b/player/index.html
index 5f8f4a8..2e1c202 100644
--- a/player/index.html
+++ b/player/index.html
@@ -43,6 +43,15 @@
 <div style="width:100%;height:100%;background-color:#333;display:inline-block;" id="bodymovin"></div>
 
 <script>
+
+    function configReady(){
+        console.log('config ready');
+    }
+
+    function dataReady(){
+        console.log('data ready');
+    }
+
     var animData = {
         wrapper: document.getElementById('bodymovin'),
         animType: 'canvas',
@@ -53,6 +62,8 @@
 
     };
     var anim = bodymovin.loadAnimation(animData);
+    anim.addEventListener('bm:config_ready', configReady);
+    anim.addEventListener('bm:data_ready', dataReady);
 </script>
 </body>
 </html>
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index cfcf4dd..97d4bb0 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -71,7 +71,11 @@
         }
 
         var xhr = new XMLHttpRequest();
-        this.path = params.path.substr(0,params.path.lastIndexOf('/')+1);
+        if(params.path.lastIndexOf('\\') != -1){
+            this.path = params.path.substr(0,params.path.lastIndexOf('\\')+1);
+        }else{
+            this.path = params.path.substr(0,params.path.lastIndexOf('/')+1);
+        }
         xhr.open('GET', params.path, true);
         xhr.send();
         xhr.onreadystatechange = function () {
@@ -149,6 +153,7 @@
 AnimationItem.prototype.loadNextSegment = function() {
     var segments = this.animationData.segments;
     if(!segments || segments.length === 0){
+        this.trigger('bm:data_ready');
         this.timeCompleted = this.animationData.tf;
         return;
     }
@@ -156,7 +161,7 @@
     this.timeCompleted = segment.time * this.frameRate;
     var xhr = new XMLHttpRequest();
     var self = this;
-    var segmentPath = this.path.substr(0,this.path.lastIndexOf('/')+1)+'data_' + this.segmentPos + '.json';
+    var segmentPath = this.path+'data_' + this.segmentPos + '.json';
     this.segmentPos += 1;
     xhr.open('GET', segmentPath, true);
     xhr.send();
@@ -201,6 +206,7 @@
     /*this.firstFrame = 0;
     this.totalFrames = 1;*/
     this.frameMult = this.animationData.fr / 1000;
+    this.trigger('bm:config_ready');
     this.loadSegments();
     dataManager.completeData(this.animationData);
     this.renderer.buildItems(this.animationData.layers);
@@ -463,4 +469,7 @@
 
 AnimationItem.prototype.getAssets = function () {
     return this.assets;
-};
\ No newline at end of file
+};
+
+AnimationItem.prototype.addEventListener = addEventListener;
+AnimationItem.prototype.trigger = triggerEvent;
\ No newline at end of file
diff --git a/player/js/utils/common.js b/player/js/utils/common.js
index b4a038b..d8221aa 100644
--- a/player/js/utils/common.js
+++ b/player/js/utils/common.js
@@ -21,6 +21,45 @@
 
 }
 
+function addEventListener(eventName, callback){
+
+    if (!this._cbs){
+        this._cbs = [];
+    }
+
+    if (!this._cbs[eventName]){
+        this._cbs[eventName] = [];
+    }
+
+    this._cbs[eventName].push(callback);
+
+}
+
+function triggerEvent(eventName, args){
+
+    if (!this._cbs){
+        this._cbs = [];
+    }
+
+    var delay = this._cbs.length === 0;
+    var that = this;
+
+    if (this._cbs[eventName]) {
+        if (delay){
+            setTimeout(function(){
+                for (var i = 0; i < that._cbs[eventName].length; i++){
+                    that._cbs[eventName][i](args);
+                }
+            }, 0);
+        }
+        else {
+            for (var i = 0; i < this._cbs[eventName].length; i++){
+                this._cbs[eventName][i](args);
+            }
+        }
+    }
+}
+
 function randomString(length, chars){
     if(chars === undefined){
         chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
