(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));