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