"undefined"!=typeof navigator&&function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lottie=e()}(this,(function(){"use strict";var t="",e=!1,i=-999999,s=function(){return t};function r(t){return document.createElement(t)}function a(t,e){var i,s,r=t.length;for(i=0;i<r;i+=1)for(var a in s=t[i].prototype)Object.prototype.hasOwnProperty.call(s,a)&&(e.prototype[a]=s[a])}function n(t,e){return Object.getOwnPropertyDescriptor(t,e)}function o(t){function e(){}return e.prototype=t,e}var h=function(){function t(t){this.audios=[],this.audioFactory=t,this._volume=1,this._isMuted=!1}return t.prototype={addAudio:function(t){this.audios.push(t)},pause:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].pause()},resume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].resume()},setRate:function(t){var e,i=this.audios.length;for(e=0;e<i;e+=1)this.audios[e].setRate(t)},createAudio:function(t){return this.audioFactory?this.audioFactory(t):window.Howl?new window.Howl({src:[t]}):{isPlaying:!1,play:function(){this.isPlaying=!0},seek:function(){this.isPlaying=!1},playing:function(){},rate:function(){},setVolume:function(){}}},setAudioFactory:function(t){this.audioFactory=t},setVolume:function(t){this._volume=t,this._updateVolume()},mute:function(){this._isMuted=!0,this._updateVolume()},unmute:function(){this._isMuted=!1,this._updateVolume()},getVolume:function(){return this._volume},_updateVolume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].volume(this._volume*(this._isMuted?0:1))}},function(){return new t}}(),l=function(){function t(t,e){var i,s=0,r=[];switch(t){case"int16":case"uint8c":i=1;break;default:i=1.1}for(s=0;s<e;s+=1)r.push(i);return r}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(e,i){return"float32"===e?new Float32Array(i):"int16"===e?new Int16Array(i):"uint8c"===e?new Uint8ClampedArray(i):t(e,i)}:t}();function p(t){return Array.apply(null,{length:t})}function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}var u=!0,c=null,m="",d=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),g=Math.pow,y=Math.sqrt,v=Math.floor,b=(Math.max,Math.min),_={};!function(){var t,e=["abs","acos","acosh","asin","asinh","atan","atanh","atan2","ceil","cbrt","expm1","clz32","cos","cosh","exp","floor","fround","hypot","imul","log","log1p","log2","log10","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc","E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"],i=e.length;for(t=0;t<i;t+=1)_[e[t]]=Math[e[t]]}(),_.random=Math.random,_.abs=function(t){if("object"===f(t)&&t.length){var e,i=p(t.length),s=t.length;for(e=0;e<s;e+=1)i[e]=Math.abs(t[e]);return i}return Math.abs(t)};var P=150,k=Math.PI/180,A=.5519;function x(t){!!t}function S(t,e,i,s){this.type=t,this.currentTime=e,this.totalTime=i,this.direction=s<0?-1:1}function D(t,e){this.type=t,this.direction=e<0?-1:1}function w(t,e,i,s){this.type=t,this.currentLoop=i,this.totalLoops=e,this.direction=s<0?-1:1}function C(t,e,i){this.type=t,this.firstFrame=e,this.totalFrames=i}function T(t,e){this.type=t,this.target=e}function E(t,e){this.type="renderFrameError",this.nativeError=t,this.currentTime=e}function F(t){this.type="configError",this.nativeError=t}var M,I=(M=0,function(){return m+"__lottie_element_"+(M+=1)});function L(t,e,i){var s,r,a,n,o,h,l,p;switch(h=i*(1-e),l=i*(1-(o=6*t-(n=Math.floor(6*t)))*e),p=i*(1-(1-o)*e),n%6){case 0:s=i,r=p,a=h;break;case 1:s=l,r=i,a=h;break;case 2:s=h,r=i,a=p;break;case 3:s=h,r=l,a=i;break;case 4:s=p,r=h,a=i;break;case 5:s=i,r=h,a=l}return[s,r,a]}function R(t,e,i){var s,r=Math.max(t,e,i),a=Math.min(t,e,i),n=r-a,o=0===r?0:n/r,h=r/255;switch(r){case a:s=0;break;case t:s=e-i+n*(e<i?6:0),s/=6*n;break;case e:s=i-t+2*n,s/=6*n;break;case i:s=t-e+4*n,s/=6*n}return[s,o,h]}function V(t,e){var i=R(255*t[0],255*t[1],255*t[2]);return i[1]+=e,i[1]>1?i[1]=1:i[1]<=0&&(i[1]=0),L(i[0],i[1],i[2])}function O(t,e){var i=R(255*t[0],255*t[1],255*t[2]);return i[2]+=e,i[2]>1?i[2]=1:i[2]<0&&(i[2]=0),L(i[0],i[1],i[2])}function z(t,e){var i=R(255*t[0],255*t[1],255*t[2]);return i[0]+=e/360,i[0]>1?i[0]-=1:i[0]<0&&(i[0]+=1),L(i[0],i[1],i[2])}!function(){var t,e,i=[];for(t=0;t<256;t+=1)e=t.toString(16),i[t]=1===e.length?"0"+e:e}();var N=function(){return c},j=function(t){P=t},B=function(){return P};function G(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function q(t){return q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},q(t)}var W=function(){var t,i,s=1,r=[],a={onmessage:function(){},postMessage:function(e){t({data:e})}},n={postMessage:function(t){a.onmessage({data:t})}};function o(i){if(window.Worker&&window.Blob&&e){var s=new Blob(["var _workerSelf = self; self.onmessage = ",i.toString()],{type:"text/javascript"}),r=URL.createObjectURL(s);return new Worker(r)}return t=i,a}function h(){i||(i=o((function(t){if(n.dataManager||(n.dataManager=function(){function t(r,a){var n,o,h,l,p,u,c=r.length;for(o=0;o<c;o+=1)if("ks"in(n=r[o])&&!n.completed){if(n.completed=!0,n.tt&&(r[o-1].td=n.tt),n.hasMask){var m=n.masksProperties;for(l=m.length,h=0;h<l;h+=1)if(m[h].pt.k.i)s(m[h].pt.k);else for(u=m[h].pt.k.length,p=0;p<u;p+=1)m[h].pt.k[p].s&&s(m[h].pt.k[p].s[0]),m[h].pt.k[p].e&&s(m[h].pt.k[p].e[0])}0===n.ty?(n.layers=e(n.refId,a),t(n.layers,a)):4===n.ty?i(n.shapes):5===n.ty&&f(n)}}function e(t,e){var i=function(t,e){for(var i=0,s=e.length;i<s;){if(e[i].id===t)return e[i];i+=1}return null}(t,e);return i?i.layers.__used?JSON.parse(JSON.stringify(i.layers)):(i.layers.__used=!0,i.layers):null}function i(t){var e,r,a;for(e=t.length-1;e>=0;e-=1)if("sh"===t[e].ty)if(t[e].ks.k.i)s(t[e].ks.k);else for(a=t[e].ks.k.length,r=0;r<a;r+=1)t[e].ks.k[r].s&&s(t[e].ks.k[r].s[0]),t[e].ks.k[r].e&&s(t[e].ks.k[r].e[0]);else"gr"===t[e].ty&&i(t[e].it)}function s(t){var e,i=t.i.length;for(e=0;e<i;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 r(t,e){var i=e?e.split("."):[100,100,100];return t[0]>i[0]||!(i[0]>t[0])&&(t[1]>i[1]||!(i[1]>t[1])&&(t[2]>i[2]||!(i[2]>t[2])&&null))}var a,n=function(){var t=[4,4,14];function e(t){var e,i,s,r=t.length;for(e=0;e<r;e+=1)5===t[e].ty&&(s=void 0,s=(i=t[e]).t.d,i.t.d={k:[{s:s,t:0}]})}return function(i){if(r(t,i.v)&&(e(i.layers),i.assets)){var s,a=i.assets.length;for(s=0;s<a;s+=1)i.assets[s].layers&&e(i.assets[s].layers)}}}(),o=(a=[4,7,99],function(t){if(t.chars&&!r(a,t.v)){var e,s=t.chars.length;for(e=0;e<s;e+=1){var n=t.chars[e];n.data&&n.data.shapes&&(i(n.data.shapes),n.data.ip=0,n.data.op=99999,n.data.st=0,n.data.sr=1,n.data.ks={p:{k:[0,0],a:0},s:{k:[100,100],a:0},a:{k:[0,0],a:0},r:{k:0,a:0},o:{k:100,a:0}},t.chars[e].t||(n.data.shapes.push({ty:"no"}),n.data.shapes[0].it.push({p:{k:[0,0],a:0},s:{k:[100,100],a:0},a:{k:[0,0],a:0},r:{k:0,a:0},o:{k:100,a:0},sk:{k:0,a:0},sa:{k:0,a:0},ty:"tr"})))}}}),h=function(){var t=[5,7,15];function e(t){var e,i,s=t.length;for(e=0;e<s;e+=1)5===t[e].ty&&(i=void 0,"number"==typeof(i=t[e].t.p).a&&(i.a={a:0,k:i.a}),"number"==typeof i.p&&(i.p={a:0,k:i.p}),"number"==typeof i.r&&(i.r={a:0,k:i.r}))}return function(i){if(r(t,i.v)&&(e(i.layers),i.assets)){var s,a=i.assets.length;for(s=0;s<a;s+=1)i.assets[s].layers&&e(i.assets[s].layers)}}}(),l=function(){var t=[4,1,9];function e(t){var i,s,r,a=t.length;for(i=0;i<a;i+=1)if("gr"===t[i].ty)e(t[i].it);else if("fl"===t[i].ty||"st"===t[i].ty)if(t[i].c.k&&t[i].c.k[0].i)for(r=t[i].c.k.length,s=0;s<r;s+=1)t[i].c.k[s].s&&(t[i].c.k[s].s[0]/=255,t[i].c.k[s].s[1]/=255,t[i].c.k[s].s[2]/=255,t[i].c.k[s].s[3]/=255),t[i].c.k[s].e&&(t[i].c.k[s].e[0]/=255,t[i].c.k[s].e[1]/=255,t[i].c.k[s].e[2]/=255,t[i].c.k[s].e[3]/=255);else t[i].c.k[0]/=255,t[i].c.k[1]/=255,t[i].c.k[2]/=255,t[i].c.k[3]/=255}function i(t){var i,s=t.length;for(i=0;i<s;i+=1)4===t[i].ty&&e(t[i].shapes)}return function(e){if(r(t,e.v)&&(i(e.layers),e.assets)){var s,a=e.assets.length;for(s=0;s<a;s+=1)e.assets[s].layers&&i(e.assets[s].layers)}}}(),p=function(){var t=[4,4,18];function e(t){var i,s,r;for(i=t.length-1;i>=0;i-=1)if("sh"===t[i].ty)if(t[i].ks.k.i)t[i].ks.k.c=t[i].closed;else for(r=t[i].ks.k.length,s=0;s<r;s+=1)t[i].ks.k[s].s&&(t[i].ks.k[s].s[0].c=t[i].closed),t[i].ks.k[s].e&&(t[i].ks.k[s].e[0].c=t[i].closed);else"gr"===t[i].ty&&e(t[i].it)}function i(t){var i,s,r,a,n,o,h=t.length;for(s=0;s<h;s+=1){if((i=t[s]).hasMask){var l=i.masksProperties;for(a=l.length,r=0;r<a;r+=1)if(l[r].pt.k.i)l[r].pt.k.c=l[r].cl;else for(o=l[r].pt.k.length,n=0;n<o;n+=1)l[r].pt.k[n].s&&(l[r].pt.k[n].s[0].c=l[r].cl),l[r].pt.k[n].e&&(l[r].pt.k[n].e[0].c=l[r].cl)}4===i.ty&&e(i.shapes)}}return function(e){if(r(t,e.v)&&(i(e.layers),e.assets)){var s,a=e.assets.length;for(s=0;s<a;s+=1)e.assets[s].layers&&i(e.assets[s].layers)}}}();function f(t){0===t.t.a.length&&t.t.p}var u={completeData:function(i){i.__complete||(l(i),n(i),o(i),h(i),p(i),t(i.layers,i.assets),function(i,s){if(i){var r=0,a=i.length;for(r=0;r<a;r+=1)1===i[r].t&&(i[r].data.layers=e(i[r].data.refId,s),t(i[r].data.layers,s))}}(i.chars,i.assets),i.__complete=!0)}};return u.checkColors=l,u.checkChars=o,u.checkPathProperties=h,u.checkShapes=p,u.completeLayers=t,u}()),n.assetLoader||(n.assetLoader=function(){function t(t){var e=t.getResponseHeader("content-type");return e&&"json"===t.responseType&&-1!==e.indexOf("json")||t.response&&"object"===q(t.response)?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):null}return{load:function(e,i,s,r){var a,n=new XMLHttpRequest;try{n.responseType="json"}catch(t){}n.onreadystatechange=function(){if(4===n.readyState)if(200===n.status)a=t(n),s(a);else try{a=t(n),s(a)}catch(t){r&&r(t)}};try{n.open("GET",e,!0)}catch(t){n.open("GET",i+"/"+e,!0)}n.send()}}}()),"loadAnimation"===t.data.type)n.assetLoader.load(t.data.path,t.data.fullPath,(function(e){n.dataManager.completeData(e),n.postMessage({id:t.data.id,payload:e,status:"success"})}),(function(){n.postMessage({id:t.data.id,status:"error"})}));else if("complete"===t.data.type){var e=t.data.animation;n.dataManager.completeData(e),n.postMessage({id:t.data.id,payload:e,status:"success"})}else"loadData"===t.data.type&&n.assetLoader.load(t.data.path,t.data.fullPath,(function(e){n.postMessage({id:t.data.id,payload:e,status:"success"})}),(function(){n.postMessage({id:t.data.id,status:"error"})}))})),i.onmessage=function(t){var e=t.data,i=e.id,s=r[i];r[i]=null,"success"===e.status?s.onComplete(e.payload):s.onError&&s.onError()})}function l(t,e){var i="processId_"+(s+=1);return r[i]={onComplete:t,onError:e},i}return{loadAnimation:function(t,e,s){h();var r=l(e,s);i.postMessage({type:"loadAnimation",path:t,fullPath:window.location.origin+window.location.pathname,id:r})},loadData:function(t,e,s){h();var r=l(e,s);i.postMessage({type:"loadData",path:t,fullPath:window.location.origin+window.location.pathname,id:r})},completeAnimation:function(t,e,s){h();var r=l(e,s);i.postMessage({type:"complete",animation:t,id:r})}}}(),X=function(){var t=function(){var t=r("canvas");t.width=1,t.height=1;var e=t.getContext("2d");return e.fillStyle="rgba(0,0,0,0)",e.fillRect(0,0,1,1),t}();function e(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.loadedFootagesCount===this.totalFootages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function i(){this.loadedFootagesCount+=1,this.loadedAssets===this.totalImages&&this.loadedFootagesCount===this.totalFootages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function s(t,e,i){var s="";if(t.e)s=t.p;else if(e){var r=t.p;-1!==r.indexOf("images/")&&(r=r.split("/")[1]),s=e+r}else s=i,s+=t.u?t.u:"",s+=t.p;return s}function a(t){var e=0,i=setInterval(function(){(t.getBBox().width||e>500)&&(this._imageLoaded(),clearInterval(i)),e+=1}.bind(this),50)}function n(t){var e={assetData:t},i=s(t,this.assetsPath,this.path);return W.loadData(i,function(t){e.img=t,this._footageLoaded()}.bind(this),function(){e.img={},this._footageLoaded()}.bind(this)),e}function o(){this._imageLoaded=e.bind(this),this._footageLoaded=i.bind(this),this.testImageLoaded=a.bind(this),this.createFootageData=n.bind(this),this.assetsPath="",this.path="",this.totalImages=0,this.totalFootages=0,this.loadedAssets=0,this.loadedFootagesCount=0,this.imagesLoadedCb=null,this.images=[]}return o.prototype={loadAssets:function(t,e){var i;this.imagesLoadedCb=e;var s=t.length;for(i=0;i<s;i+=1)t[i].layers||(t[i].t&&"seq"!==t[i].t?3===t[i].t&&(this.totalFootages+=1,this.images.push(this.createFootageData(t[i]))):(this.totalImages+=1,this.images.push(this._createImageData(t[i]))))},setAssetsPath:function(t){this.assetsPath=t||""},setPath:function(t){this.path=t||""},loadedImages:function(){return this.totalImages===this.loadedAssets},loadedFootages:function(){return this.totalFootages===this.loadedFootagesCount},destroy:function(){this.imagesLoadedCb=null,this.images.length=0},getAsset:function(t){for(var e=0,i=this.images.length;e<i;){if(this.images[e].assetData===t)return this.images[e].img;e+=1}return null},createImgData:function(e){var i=s(e,this.assetsPath,this.path),a=r("img");a.crossOrigin="anonymous",a.addEventListener("load",this._imageLoaded,!1),a.addEventListener("error",function(){n.img=t,this._imageLoaded()}.bind(this),!1),a.src=i;var n={img:a,assetData:e};return n},createImageData:function(e){var i=s(e,this.assetsPath,this.path),r=G("image");d?this.testImageLoaded(r):r.addEventListener("load",this._imageLoaded,!1),r.addEventListener("error",function(){a.img=t,this._imageLoaded()}.bind(this),!1),r.setAttributeNS("http://www.w3.org/1999/xlink","href",i),this._elementHelper.append?this._elementHelper.append(r):this._elementHelper.appendChild(r);var a={img:r,assetData:e};return a},imageLoaded:e,footageLoaded:i,setCacheType:function(t,e){"svg"===t?(this._elementHelper=e,this._createImageData=this.createImageData.bind(this)):this._createImageData=this.createImgData.bind(this)}},o}();function Y(){}Y.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var i=this._cbs[t],s=0;s<i.length;s+=1)i[s](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var i=0,s=this._cbs[t].length;i<s;)this._cbs[t][i]===e&&(this._cbs[t].splice(i,1),i-=1,s-=1),i+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var H=function(){function t(t){for(var e,i=t.split("\r\n"),s={},r=0,a=0;a<i.length;a+=1)2===(e=i[a].split(":")).length&&(s[e[0]]=e[1].trim(),r+=1);if(0===r)throw new Error;return s}return function(e){for(var i=[],s=0;s<e.length;s+=1){var r=e[s],a={time:r.tm,duration:r.dr};try{a.payload=JSON.parse(e[s].cm)}catch(i){try{a.payload=t(e[s].cm)}catch(t){a.payload={name:e[s].cm}}}i.push(a)}return i}}(),K=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,i=this.compositions.length;e<i;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].data.xt&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}return null}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),J={};function U(t){return U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},U(t)}var Z=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.firstFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=I(),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.isSubframeEnabled=u,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface=K(),this.imagePreloader=new X,this.audioController=h(),this.markers=[],this.configAnimation=this.configAnimation.bind(this),this.onSetupError=this.onSetupError.bind(this),this.onSegmentComplete=this.onSegmentComplete.bind(this),this.drawnFrameEvent=new S("drawnFrame",0,0,0)};a([Y],Z),Z.prototype.setParams=function(t){(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e="svg";t.animType?e=t.animType:t.renderer&&(e=t.renderer);var i=J[e];this.renderer=new i(this,t.rendererSettings),this.imagePreloader.setCacheType(e,this.renderer.globalData.defs),this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||void 0===t.loop||!0===t.loop?this.loop=!0:!1===t.loop?this.loop=!1:this.loop=parseInt(t.loop,10),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!Object.prototype.hasOwnProperty.call(t,"autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,this.initialSegment=t.initialSegment,t.audioFactory&&this.audioController.setAudioFactory(t.audioFactory),t.animationData?this.setupAnimation(t.animationData):t.path&&(-1!==t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),W.loadAnimation(t.path,this.configAnimation,this.onSetupError))},Z.prototype.onSetupError=function(){this.trigger("data_failed")},Z.prototype.setupAnimation=function(t){W.completeAnimation(t,this.configAnimation)},Z.prototype.setData=function(t,e){e&&"object"!==U(e)&&(e=JSON.parse(e));var i={wrapper:t,animationData:e},s=t.attributes;i.path=s.getNamedItem("data-animation-path")?s.getNamedItem("data-animation-path").value:s.getNamedItem("data-bm-path")?s.getNamedItem("data-bm-path").value:s.getNamedItem("bm-path")?s.getNamedItem("bm-path").value:"",i.animType=s.getNamedItem("data-anim-type")?s.getNamedItem("data-anim-type").value:s.getNamedItem("data-bm-type")?s.getNamedItem("data-bm-type").value:s.getNamedItem("bm-type")?s.getNamedItem("bm-type").value:s.getNamedItem("data-bm-renderer")?s.getNamedItem("data-bm-renderer").value:s.getNamedItem("bm-renderer")?s.getNamedItem("bm-renderer").value:"canvas";var r=s.getNamedItem("data-anim-loop")?s.getNamedItem("data-anim-loop").value:s.getNamedItem("data-bm-loop")?s.getNamedItem("data-bm-loop").value:s.getNamedItem("bm-loop")?s.getNamedItem("bm-loop").value:"";"false"===r?i.loop=!1:"true"===r?i.loop=!0:""!==r&&(i.loop=parseInt(r,10));var a=s.getNamedItem("data-anim-autoplay")?s.getNamedItem("data-anim-autoplay").value:s.getNamedItem("data-bm-autoplay")?s.getNamedItem("data-bm-autoplay").value:!s.getNamedItem("bm-autoplay")||s.getNamedItem("bm-autoplay").value;i.autoplay="false"!==a,i.name=s.getNamedItem("data-name")?s.getNamedItem("data-name").value:s.getNamedItem("data-bm-name")?s.getNamedItem("data-bm-name").value:s.getNamedItem("bm-name")?s.getNamedItem("bm-name").value:"","false"===(s.getNamedItem("data-anim-prerender")?s.getNamedItem("data-anim-prerender").value:s.getNamedItem("data-bm-prerender")?s.getNamedItem("data-bm-prerender").value:s.getNamedItem("bm-prerender")?s.getNamedItem("bm-prerender").value:"")&&(i.prerender=!1),this.setParams(i)},Z.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,i,s=this.animationData.layers,r=s.length,a=t.layers,n=a.length;for(i=0;i<n;i+=1)for(e=0;e<r;){if(s[e].id===a[i].id){s[e]=a[i];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(r=t.assets.length,e=0;e<r;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,W.completeAnimation(this.animationData,this.onSegmentComplete)},Z.prototype.onSegmentComplete=function(t){this.animationData=t;var e=N();e&&e.initExpressions(this),this.loadNextSegment()},Z.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,W.loadData(i,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},Z.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},Z.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},Z.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},Z.prototype.configAnimation=function(t){if(this.renderer)try{this.animationData=t,this.initialSegment?(this.totalFrames=Math.floor(this.initialSegment[1]-this.initialSegment[0]),this.firstFrame=Math.round(this.initialSegment[0])):(this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.firstFrame=Math.round(this.animationData.ip)),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.frameMult=this.animationData.fr/1e3,this.renderer.searchExtraCompositions(t.assets),this.markers=H(t.markers||[]),this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded(),this.isPaused&&this.audioController.pause()}catch(t){this.triggerConfigError(t)}},Z.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.isLoaded?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},Z.prototype.checkLoaded=function(){if(!this.isLoaded&&this.renderer.globalData.fontManager.isLoaded&&(this.imagePreloader.loadedImages()||"canvas"!==this.renderer.rendererType)&&this.imagePreloader.loadedFootages()){this.isLoaded=!0;var t=N();t&&t.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play()}},Z.prototype.resize=function(){this.renderer.updateContainerSize()},Z.prototype.setSubframe=function(t){this.isSubframeEnabled=!!t},Z.prototype.gotoFrame=function(){this.currentFrame=this.isSubframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame(),this.trigger("drawnFrame")},Z.prototype.renderFrame=function(){if(!1!==this.isLoaded&&this.renderer)try{this.renderer.renderFrame(this.currentFrame+this.firstFrame)}catch(t){this.triggerRenderFrameError(t)}},Z.prototype.play=function(t){t&&this.name!==t||!0===this.isPaused&&(this.isPaused=!1,this.trigger("_pause"),this.audioController.resume(),this._idle&&(this._idle=!1,this.trigger("_active")))},Z.prototype.pause=function(t){t&&this.name!==t||!1===this.isPaused&&(this.isPaused=!0,this.trigger("_play"),this._idle=!0,this.trigger("_idle"),this.audioController.pause())},Z.prototype.togglePause=function(t){t&&this.name!==t||(!0===this.isPaused?this.play():this.pause())},Z.prototype.stop=function(t){t&&this.name!==t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},Z.prototype.getMarkerData=function(t){for(var e,i=0;i<this.markers.length;i+=1)if((e=this.markers[i]).payload&&e.payload.name===t)return e;return null},Z.prototype.goToAndStop=function(t,e,i){if(!i||this.name===i){var s=Number(t);if(isNaN(s)){var r=this.getMarkerData(t);r&&this.goToAndStop(r.time,!0)}else e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier);this.pause()}},Z.prototype.goToAndPlay=function(t,e,i){if(!i||this.name===i){var s=Number(t);if(isNaN(s)){var r=this.getMarkerData(t);r&&(r.duration?this.playSegments([r.time,r.time+r.duration],!0):this.goToAndStop(r.time,!0))}else this.goToAndStop(s,e,i);this.play()}},Z.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,i=!1;e>=this.totalFrames-1&&this.frameModifier>0?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(i=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(i=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),i&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},Z.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.timeCompleted=this.totalFrames,this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.timeCompleted=this.totalFrames,this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},Z.prototype.setSegment=function(t,e){var i=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?i=t:this.currentRawFrame+this.firstFrame>e&&(i=e-t)),this.firstFrame=t,this.totalFrames=e-t,this.timeCompleted=this.totalFrames,-1!==i&&this.goToAndStop(i,!0)},Z.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"===U(t[0])){var i,s=t.length;for(i=0;i<s;i+=1)this.segments.push(t[i])}else this.segments.push(t);this.segments.length&&e&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},Z.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},Z.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},Z.prototype.destroy=function(t){t&&this.name!==t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=null,this.onLoopComplete=null,this.onComplete=null,this.onSegmentStart=null,this.onDestroy=null,this.renderer=null,this.renderer=null,this.imagePreloader=null,this.projectInterface=null)},Z.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},Z.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},Z.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},Z.prototype.setVolume=function(t,e){e&&this.name!==e||this.audioController.setVolume(t)},Z.prototype.getVolume=function(){return this.audioController.getVolume()},Z.prototype.mute=function(t){t&&this.name!==t||this.audioController.mute()},Z.prototype.unmute=function(t){t&&this.name!==t||this.audioController.unmute()},Z.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection,this.audioController.setRate(this.playSpeed*this.playDirection)},Z.prototype.getPath=function(){return this.path},Z.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else if(this.assetsPath){var i=t.p;-1!==i.indexOf("images/")&&(i=i.split("/")[1]),e=this.assetsPath+i}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},Z.prototype.getAssetData=function(t){for(var e=0,i=this.assets.length;e<i;){if(t===this.assets[e].id)return this.assets[e];e+=1}return null},Z.prototype.hide=function(){this.renderer.hide()},Z.prototype.show=function(){this.renderer.show()},Z.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate},Z.prototype.updateDocumentData=function(t,e,i){try{this.renderer.getElementByPath(t).updateDocumentData(e,i)}catch(t){}},Z.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new S(t,this.currentFrame,this.totalFrames,this.frameModifier));break;case"drawnFrame":this.drawnFrameEvent.currentTime=this.currentFrame,this.drawnFrameEvent.totalTime=this.totalFrames,this.drawnFrameEvent.direction=this.frameModifier,this.triggerEvent(t,this.drawnFrameEvent);break;case"loopComplete":this.triggerEvent(t,new w(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new D(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new C(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new T(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new S(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new w(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new D(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new C(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new T(t,this))},Z.prototype.triggerRenderFrameError=function(t){var e=new E(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)},Z.prototype.triggerConfigError=function(t){var e=new F(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)};var Q=function(){var t={},e=[],i=0,s=0,a=0,n=!0,o=!1;function h(t){for(var i=0,r=t.target;i<s;)e[i].animation===r&&(e.splice(i,1),i-=1,s-=1,r.isPaused||f()),i+=1}function l(t,i){if(!t)return null;for(var r=0;r<s;){if(e[r].elem===t&&null!==e[r].elem)return e[r].animation;r+=1}var a=new Z;return u(a,t),a.setData(t,i),a}function p(){a+=1,d()}function f(){a-=1}function u(t,i){t.addEventListener("destroy",h),t.addEventListener("_active",p),t.addEventListener("_idle",f),e.push({elem:i,animation:t}),s+=1}function c(t){var r,h=t-i;for(r=0;r<s;r+=1)e[r].animation.advanceTime(h);i=t,a&&!o?window.requestAnimationFrame(c):n=!0}function m(t){i=t,window.requestAnimationFrame(c)}function d(){!o&&a&&n&&(window.requestAnimationFrame(m),n=!1)}return t.registerAnimation=l,t.loadAnimation=function(t){var e=new Z;return u(e,null),e.setParams(t),e},t.setSpeed=function(t,i){var r;for(r=0;r<s;r+=1)e[r].animation.setSpeed(t,i)},t.setDirection=function(t,i){var r;for(r=0;r<s;r+=1)e[r].animation.setDirection(t,i)},t.play=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.play(t)},t.pause=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.pause(t)},t.stop=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.stop(t)},t.togglePause=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.togglePause(t)},t.searchAnimations=function(t,e,i){var s,a=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=a.length;for(s=0;s<n;s+=1)i&&a[s].setAttribute("data-bm-type",i),l(a[s],t);if(e&&0===n){i||(i="svg");var o=document.getElementsByTagName("body")[0];o.innerText="";var h=r("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",i),o.appendChild(h),l(h,t)}},t.resize=function(){var t;for(t=0;t<s;t+=1)e[t].animation.resize()},t.goToAndStop=function(t,i,r){var a;for(a=0;a<s;a+=1)e[a].animation.goToAndStop(t,i,r)},t.destroy=function(t){var i;for(i=s-1;i>=0;i-=1)e[i].animation.destroy(t)},t.freeze=function(){o=!0},t.unfreeze=function(){o=!1,d()},t.setVolume=function(t,i){var r;for(r=0;r<s;r+=1)e[r].animation.setVolume(t,i)},t.mute=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.mute(t)},t.unmute=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.unmute(t)},t.getRegisteredAnimations=function(){var t,i=e.length,s=[];for(t=0;t<i;t+=1)s.push(e[t].animation);return s},t}(),$=function(){var t={getBezierEasing:function(t,i,s,r,a){var n=a||("bez_"+t+"_"+i+"_"+s+"_"+r).replace(/\./g,"p");if(e[n])return e[n];var o=new l([t,i,s,r]);return e[n]=o,o}},e={};var i=.1,s="function"==typeof Float32Array;function r(t,e){return 1-3*e+3*t}function a(t,e){return 3*e-6*t}function n(t){return 3*t}function o(t,e,i){return((r(e,i)*t+a(e,i))*t+n(e))*t}function h(t,e,i){return 3*r(e,i)*t*t+2*a(e,i)*t+n(e)}function l(t){this._p=t,this._mSampleValues=s?new Float32Array(11):new Array(11),this._precomputed=!1,this.get=this.get.bind(this)}return l.prototype={get:function(t){var e=this._p[0],i=this._p[1],s=this._p[2],r=this._p[3];return this._precomputed||this._precompute(),e===i&&s===r?t:0===t?0:1===t?1:o(this._getTForX(t),i,r)},_precompute:function(){var t=this._p[0],e=this._p[1],i=this._p[2],s=this._p[3];this._precomputed=!0,t===e&&i===s||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;s<11;++s)this._mSampleValues[s]=o(s*i,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],r=this._mSampleValues,a=0,n=1;10!==n&&r[n]<=t;++n)a+=i;var l=a+(t-r[--n])/(r[n+1]-r[n])*i,p=h(l,e,s);return p>=.001?function(t,e,i,s){for(var r=0;r<4;++r){var a=h(e,i,s);if(0===a)return e;e-=(o(e,i,s)-t)/a}return e}(t,l,e,s):0===p?l:function(t,e,i,s,r){var a,n,h=0;do{(a=o(n=e+(i-e)/2,s,r)-t)>0?i=n:e=n}while(Math.abs(a)>1e-7&&++h<10);return n}(t,a,a+i,e,s)}},t}(),tt={double:function(t){return t.concat(p(t.length))}},et=function(t,e,i){var s=0,r=t,a=p(r);return{newElement:function(){return s?a[s-=1]:e()},release:function(t){s===r&&(a=tt.double(a),r*=2),i&&i(t),a[s]=t,s+=1}}},it=et(8,(function(){return{addedLength:0,percents:l("float32",B()),lengths:l("float32",B())}})),st=et(8,(function(){return{lengths:[],totalLength:0}}),(function(t){var e,i=t.lengths.length;for(e=0;e<i;e+=1)it.release(t.lengths[e]);t.lengths.length=0}));var rt=function(){var t=Math;function e(t,e,i,s,r,a){var n=t*s+e*r+i*a-r*s-a*t-i*e;return n>-.001&&n<.001}var i=function(t,e,i,s){var r,a,n,o,h,l,p=B(),f=0,u=[],c=[],m=it.newElement();for(n=i.length,r=0;r<p;r+=1){for(h=r/(p-1),l=0,a=0;a<n;a+=1)o=g(1-h,3)*t[a]+3*g(1-h,2)*h*i[a]+3*(1-h)*g(h,2)*s[a]+g(h,3)*e[a],u[a]=o,null!==c[a]&&(l+=g(u[a]-c[a],2)),c[a]=u[a];l&&(f+=l=y(l)),m.percents[r]=h,m.lengths[r]=f}return m.addedLength=f,m};function s(t){this.segmentLength=0,this.points=new Array(t)}function r(t,e){this.partialLength=t,this.point=e}var a,n=(a={},function(t,i,n,o){var h=(t[0]+"_"+t[1]+"_"+i[0]+"_"+i[1]+"_"+n[0]+"_"+n[1]+"_"+o[0]+"_"+o[1]).replace(/\./g,"p");if(!a[h]){var l,f,u,c,m,d,v,b=B(),_=0,P=null;2===t.length&&(t[0]!==i[0]||t[1]!==i[1])&&e(t[0],t[1],i[0],i[1],t[0]+n[0],t[1]+n[1])&&e(t[0],t[1],i[0],i[1],i[0]+o[0],i[1]+o[1])&&(b=2);var k=new s(b);for(u=n.length,l=0;l<b;l+=1){for(v=p(u),m=l/(b-1),d=0,f=0;f<u;f+=1)c=g(1-m,3)*t[f]+3*g(1-m,2)*m*(t[f]+n[f])+3*(1-m)*g(m,2)*(i[f]+o[f])+g(m,3)*i[f],v[f]=c,null!==P&&(d+=g(v[f]-P[f],2));_+=d=y(d),k.points[l]=new r(d,v),P=v}k.segmentLength=_,a[h]=k}return a[h]});function o(t,e){var i=e.percents,s=e.lengths,r=i.length,a=v((r-1)*t),n=t*e.addedLength,o=0;if(a===r-1||0===a||n===s[a])return i[a];for(var h=s[a]>n?-1:1,l=!0;l;)if(s[a]<=n&&s[a+1]>n?(o=(n-s[a])/(s[a+1]-s[a]),l=!1):a+=h,a<0||a>=r-1){if(a===r-1)return i[a];l=!1}return i[a]+(i[a+1]-i[a])*o}var h=l("float32",8);return{getSegmentsLength:function(t){var e,s=st.newElement(),r=t.c,a=t.v,n=t.o,o=t.i,h=t._length,l=s.lengths,p=0;for(e=0;e<h-1;e+=1)l[e]=i(a[e],a[e+1],n[e],o[e+1]),p+=l[e].addedLength;return r&&h&&(l[e]=i(a[e],a[0],n[e],o[0]),p+=l[e].addedLength),s.totalLength=p,s},getNewSegment:function(e,i,s,r,a,n,l){a<0?a=0:a>1&&(a=1);var p,f=o(a,l),u=o(n=n>1?1:n,l),c=e.length,m=1-f,d=1-u,g=m*m*m,y=f*m*m*3,v=f*f*m*3,b=f*f*f,_=m*m*d,P=f*m*d+m*f*d+m*m*u,k=f*f*d+m*f*u+f*m*u,A=f*f*u,x=m*d*d,S=f*d*d+m*u*d+m*d*u,D=f*u*d+m*u*u+f*d*u,w=f*u*u,C=d*d*d,T=u*d*d+d*u*d+d*d*u,E=u*u*d+d*u*u+u*d*u,F=u*u*u;for(p=0;p<c;p+=1)h[4*p]=t.round(1e3*(g*e[p]+y*s[p]+v*r[p]+b*i[p]))/1e3,h[4*p+1]=t.round(1e3*(_*e[p]+P*s[p]+k*r[p]+A*i[p]))/1e3,h[4*p+2]=t.round(1e3*(x*e[p]+S*s[p]+D*r[p]+w*i[p]))/1e3,h[4*p+3]=t.round(1e3*(C*e[p]+T*s[p]+E*r[p]+F*i[p]))/1e3;return h},getPointInSegment:function(e,i,s,r,a,n){var h=o(a,n),l=1-h;return[t.round(1e3*(l*l*l*e[0]+(h*l*l+l*h*l+l*l*h)*s[0]+(h*h*l+l*h*h+h*l*h)*r[0]+h*h*h*i[0]))/1e3,t.round(1e3*(l*l*l*e[1]+(h*l*l+l*h*l+l*l*h)*s[1]+(h*h*l+l*h*h+h*l*h)*r[1]+h*h*h*i[1]))/1e3]},buildBezierData:n,pointOnLine2D:e,pointOnLine3D:function(i,s,r,a,n,o,h,l,p){if(0===r&&0===o&&0===p)return e(i,s,a,n,h,l);var f,u=t.sqrt(t.pow(a-i,2)+t.pow(n-s,2)+t.pow(o-r,2)),c=t.sqrt(t.pow(h-i,2)+t.pow(l-s,2)+t.pow(p-r,2)),m=t.sqrt(t.pow(h-a,2)+t.pow(l-n,2)+t.pow(p-o,2));return(f=u>c?u>m?u-c-m:m-c-u:m>c?m-c-u:c-u-m)>-1e-4&&f<1e-4}}}(),at=function(){var t=i,e=Math.abs;function s(t,e){var i,s=this.offsetTime;"multidimensional"===this.propType&&(i=l("float32",this.pv.length));for(var a,n,o,h,p,f,u,c,m,d=e.lastIndex,g=d,y=this.keyframes.length-1,v=!0;v;){if(a=this.keyframes[g],n=this.keyframes[g+1],g===y-1&&t>=n.t-s){a.h&&(a=n),d=0;break}if(n.t-s>t){d=g;break}g<y-1?g+=1:(d=0,v=!1)}o=this.keyframesMetadata[g]||{};var b,_,P,A,x,S,D,w,C,T,E=n.t-s,F=a.t-s;if(a.to){o.bezierData||(o.bezierData=rt.buildBezierData(a.s,n.s||a.e,a.to,a.ti));var M=o.bezierData;if(t>=E||t<F){var I=t>=E?M.points.length-1:0;for(p=M.points[I].point.length,h=0;h<p;h+=1)i[h]=M.points[I].point[h]}else{o.__fnct?m=o.__fnct:(m=$.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,o.__fnct=m),f=m((t-F)/(E-F));var L,R=M.segmentLength*f,V=e.lastFrame<t&&e._lastKeyframeIndex===g?e._lastAddedLength:0;for(c=e.lastFrame<t&&e._lastKeyframeIndex===g?e._lastPoint:0,v=!0,u=M.points.length;v;){if(V+=M.points[c].partialLength,0===R||0===f||c===M.points.length-1){for(p=M.points[c].point.length,h=0;h<p;h+=1)i[h]=M.points[c].point[h];break}if(R>=V&&R<V+M.points[c+1].partialLength){for(L=(R-V)/M.points[c+1].partialLength,p=M.points[c].point.length,h=0;h<p;h+=1)i[h]=M.points[c].point[h]+(M.points[c+1].point[h]-M.points[c].point[h])*L;break}c<u-1?c+=1:v=!1}e._lastPoint=c,e._lastAddedLength=V-M.points[c].partialLength,e._lastKeyframeIndex=g}}else{var O,z,N,j,B;if(y=a.s.length,b=n.s||a.e,this.sh&&1!==a.h)if(t>=E)i[0]=b[0],i[1]=b[1],i[2]=b[2];else if(t<=F)i[0]=a.s[0],i[1]=a.s[1],i[2]=a.s[2];else{var G=r(a.s),q=r(b);_=i,P=function(t,e,i){var s,r,a,n,o,h=[],l=t[0],p=t[1],f=t[2],u=t[3],c=e[0],m=e[1],d=e[2],g=e[3];return(r=l*c+p*m+f*d+u*g)<0&&(r=-r,c=-c,m=-m,d=-d,g=-g),1-r>1e-6?(s=Math.acos(r),a=Math.sin(s),n=Math.sin((1-i)*s)/a,o=Math.sin(i*s)/a):(n=1-i,o=i),h[0]=n*l+o*c,h[1]=n*p+o*m,h[2]=n*f+o*d,h[3]=n*u+o*g,h}(G,q,(t-F)/(E-F)),A=P[0],x=P[1],S=P[2],D=P[3],w=Math.atan2(2*x*D-2*A*S,1-2*x*x-2*S*S),C=Math.asin(2*A*x+2*S*D),T=Math.atan2(2*A*D-2*x*S,1-2*A*A-2*S*S),_[0]=w/k,_[1]=C/k,_[2]=T/k}else for(g=0;g<y;g+=1)1!==a.h&&(t>=E?f=1:t<F?f=0:(a.o.x.constructor===Array?(o.__fnct||(o.__fnct=[]),o.__fnct[g]?m=o.__fnct[g]:(O=void 0===a.o.x[g]?a.o.x[0]:a.o.x[g],z=void 0===a.o.y[g]?a.o.y[0]:a.o.y[g],N=void 0===a.i.x[g]?a.i.x[0]:a.i.x[g],j=void 0===a.i.y[g]?a.i.y[0]:a.i.y[g],m=$.getBezierEasing(O,z,N,j).get,o.__fnct[g]=m)):o.__fnct?m=o.__fnct:(O=a.o.x,z=a.o.y,N=a.i.x,j=a.i.y,m=$.getBezierEasing(O,z,N,j).get,a.keyframeMetadata=m),f=m((t-F)/(E-F)))),b=n.s||a.e,B=1===a.h?a.s[g]:a.s[g]+(b[g]-a.s[g])*f,"multidimensional"===this.propType?i[g]=B:i=B}return e.lastIndex=d,i}function r(t){var e=t[0]*k,i=t[1]*k,s=t[2]*k,r=Math.cos(e/2),a=Math.cos(i/2),n=Math.cos(s/2),o=Math.sin(e/2),h=Math.sin(i/2),l=Math.sin(s/2);return[o*h*n+r*a*l,o*a*n+r*h*l,r*h*n-o*a*l,r*a*n-o*h*l]}function a(){var e=this.comp.renderedFrame-this.offsetTime,i=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(e===this._caching.lastFrame||this._caching.lastFrame!==t&&(this._caching.lastFrame>=s&&e>=s||this._caching.lastFrame<i&&e<i))){this._caching.lastFrame>=e&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var r=this.interpolateValue(e,this._caching);this.pv=r}return this._caching.lastFrame=e,this.pv}function n(t){var i;if("unidimensional"===this.propType)i=t*this.mult,e(this.v-i)>1e-5&&(this.v=i,this._mdf=!0);else for(var s=0,r=this.v.length;s<r;)i=t[s]*this.mult,e(this.v[s]-i)>1e-5&&(this.v[s]=i,this._mdf=!0),s+=1}function o(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t;this.lock=!0,this._mdf=this._isFirstFrame;var e=this.effectsSequence.length,i=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)i=this.effectsSequence[t](i);this.setVValue(i),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function h(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function p(t,e,i,s){this.propType="unidimensional",this.mult=i||1,this.data=e,this.v=i?e.k*i:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=s,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=o,this.setVValue=n,this.addEffect=h}function f(t,e,i,s){var r;this.propType="multidimensional",this.mult=i||1,this.data=e,this._mdf=!1,this.elem=t,this.container=s,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var a=e.k.length;for(this.v=l("float32",a),this.pv=l("float32",a),this.vel=l("float32",a),r=0;r<a;r+=1)this.v[r]=e.k[r]*this.mult,this.pv[r]=e.k[r];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=o,this.setVValue=n,this.addEffect=h}function u(e,i,r,l){this.propType="unidimensional",this.keyframes=i.k,this.keyframesMetadata=[],this.offsetTime=e.data.st,this.frameId=-1,this._caching={lastFrame:t,lastIndex:0,value:0,_lastKeyframeIndex:-1},this.k=!0,this.kf=!0,this.data=i,this.mult=r||1,this.elem=e,this.container=l,this.comp=e.comp,this.v=t,this.pv=t,this._isFirstFrame=!0,this.getValue=o,this.setVValue=n,this.interpolateValue=s,this.effectsSequence=[a.bind(this)],this.addEffect=h}function c(e,i,r,p){var f;this.propType="multidimensional";var u,c,m,d,g=i.k.length;for(f=0;f<g-1;f+=1)i.k[f].to&&i.k[f].s&&i.k[f+1]&&i.k[f+1].s&&(u=i.k[f].s,c=i.k[f+1].s,m=i.k[f].to,d=i.k[f].ti,(2===u.length&&(u[0]!==c[0]||u[1]!==c[1])&&rt.pointOnLine2D(u[0],u[1],c[0],c[1],u[0]+m[0],u[1]+m[1])&&rt.pointOnLine2D(u[0],u[1],c[0],c[1],c[0]+d[0],c[1]+d[1])||3===u.length&&(u[0]!==c[0]||u[1]!==c[1]||u[2]!==c[2])&&rt.pointOnLine3D(u[0],u[1],u[2],c[0],c[1],c[2],u[0]+m[0],u[1]+m[1],u[2]+m[2])&&rt.pointOnLine3D(u[0],u[1],u[2],c[0],c[1],c[2],c[0]+d[0],c[1]+d[1],c[2]+d[2]))&&(i.k[f].to=null,i.k[f].ti=null),u[0]===c[0]&&u[1]===c[1]&&0===m[0]&&0===m[1]&&0===d[0]&&0===d[1]&&(2===u.length||u[2]===c[2]&&0===m[2]&&0===d[2])&&(i.k[f].to=null,i.k[f].ti=null));this.effectsSequence=[a.bind(this)],this.data=i,this.keyframes=i.k,this.keyframesMetadata=[],this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=r||1,this.elem=e,this.container=p,this.comp=e.comp,this.getValue=o,this.setVValue=n,this.interpolateValue=s,this.frameId=-1;var y=i.k[0].s.length;for(this.v=l("float32",y),this.pv=l("float32",y),f=0;f<y;f+=1)this.v[f]=t,this.pv[f]=t;this._caching={lastFrame:t,lastIndex:0,value:l("float32",y)},this.addEffect=h}return{getProp:function(t,e,i,s,r){var a;if(e.k.length)if("number"==typeof e.k[0])a=new f(t,e,s,r);else switch(i){case 0:a=new u(t,e,s,r);break;case 1:a=new c(t,e,s,r)}else a=new p(t,e,s,r);return a.effectsSequence.length&&r.addDynamicProperty(a),a}}}();function nt(){}nt.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){var t;this._mdf=!1;var e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var ot=et(8,(function(){return l("float32",2)}));function ht(){this.c=!1,this._length=0,this._maxLength=8,this.v=p(this._maxLength),this.o=p(this._maxLength),this.i=p(this._maxLength)}ht.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var i=0;i<e;)this.v[i]=ot.newElement(),this.o[i]=ot.newElement(),this.i[i]=ot.newElement(),i+=1},ht.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},ht.prototype.doubleArrayLength=function(){this.v=this.v.concat(p(this._maxLength)),this.i=this.i.concat(p(this._maxLength)),this.o=this.o.concat(p(this._maxLength)),this._maxLength*=2},ht.prototype.setXYAt=function(t,e,i,s,r){var a;switch(this._length=Math.max(this._length,s+1),this._length>=this._maxLength&&this.doubleArrayLength(),i){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o;break;default:a=[]}(!a[s]||a[s]&&!r)&&(a[s]=ot.newElement()),a[s][0]=t,a[s][1]=e},ht.prototype.setTripleAt=function(t,e,i,s,r,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(i,s,"o",n,o),this.setXYAt(r,a,"i",n,o)},ht.prototype.reverse=function(){var t=new ht;t.setPathData(this.c,this._length);var e=this.v,i=this.o,s=this.i,r=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],s[0][0],s[0][1],i[0][0],i[0][1],0,!1),r=1);var a,n=this._length-1,o=this._length;for(a=r;a<o;a+=1)t.setTripleAt(e[n][0],e[n][1],s[n][0],s[n][1],i[n][0],i[n][1],a,!1),n-=1;return t};var lt,pt=((lt=et(4,(function(){return new ht}),(function(t){var e,i=t._length;for(e=0;e<i;e+=1)ot.release(t.v[e]),ot.release(t.i[e]),ot.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}))).clone=function(t){var e,i=lt.newElement(),s=void 0===t._length?t.v.length:t._length;for(i.setLength(s),i.c=t.c,e=0;e<s;e+=1)i.setTripleAt(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return i},lt);function ft(){this._length=0,this._maxLength=4,this.shapes=p(this._maxLength)}ft.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(p(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},ft.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)pt.release(this.shapes[t]);this._length=0};var ut,ct,mt,dt,gt=(ut={newShapeCollection:function(){return ct?dt[ct-=1]:new ft},release:function(t){var e,i=t._length;for(e=0;e<i;e+=1)pt.release(t.shapes[e]);t._length=0,ct===mt&&(dt=tt.double(dt),mt*=2),dt[ct]=t,ct+=1}},ct=0,dt=p(mt=4),ut),yt=function(){var t=-999999;function e(t,e,i){var s,r,a,n,o,h,l,p,f,u=i.lastIndex,c=this.keyframes;if(t<c[0].t-this.offsetTime)s=c[0].s[0],a=!0,u=0;else if(t>=c[c.length-1].t-this.offsetTime)s=c[c.length-1].s?c[c.length-1].s[0]:c[c.length-2].e[0],a=!0;else{for(var m,d,g,y=u,v=c.length-1,b=!0;b&&(m=c[y],!((d=c[y+1]).t-this.offsetTime>t));)y<v-1?y+=1:b=!1;if(g=this.keyframesMetadata[y]||{},u=y,!(a=1===m.h)){if(t>=d.t-this.offsetTime)p=1;else if(t<m.t-this.offsetTime)p=0;else{var _;g.__fnct?_=g.__fnct:(_=$.getBezierEasing(m.o.x,m.o.y,m.i.x,m.i.y).get,g.__fnct=_),p=_((t-(m.t-this.offsetTime))/(d.t-this.offsetTime-(m.t-this.offsetTime)))}r=d.s?d.s[0]:m.e[0]}s=m.s[0]}for(h=e._length,l=s.i[0].length,i.lastIndex=u,n=0;n<h;n+=1)for(o=0;o<l;o+=1)f=a?s.i[n][o]:s.i[n][o]+(r.i[n][o]-s.i[n][o])*p,e.i[n][o]=f,f=a?s.o[n][o]:s.o[n][o]+(r.o[n][o]-s.o[n][o])*p,e.o[n][o]=f,f=a?s.v[n][o]:s.v[n][o]+(r.v[n][o]-s.v[n][o])*p,e.v[n][o]=f}function i(){var e=this.comp.renderedFrame-this.offsetTime,i=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime,r=this._caching.lastFrame;return r!==t&&(r<i&&e<i||r>s&&e>s)||(this._caching.lastIndex=r<e?this._caching.lastIndex:0,this.interpolateShape(e,this.pv,this._caching)),this._caching.lastFrame=e,this.pv}function s(){this.paths=this.localShapeCollection}function r(t){(function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var i,s=t._length;for(i=0;i<s;i+=1)if(t.v[i][0]!==e.v[i][0]||t.v[i][1]!==e.v[i][1]||t.o[i][0]!==e.o[i][0]||t.o[i][1]!==e.o[i][1]||t.i[i][0]!==e.i[i][0]||t.i[i][1]!==e.i[i][1])return!1;return!0})(this.v,t)||(this.v=pt.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function n(){if(this.elem.globalData.frameId!==this.frameId)if(this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t,e;this.lock=!0,this._mdf=!1,t=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k;var i=this.effectsSequence.length;for(e=0;e<i;e+=1)t=this.effectsSequence[e](t);this.setVValue(t),this.lock=!1,this.frameId=this.elem.globalData.frameId}else this._mdf=!1}function o(t,e,i){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var r=3===i?e.pt.k:e.ks.k;this.v=pt.clone(r),this.pv=pt.clone(this.v),this.localShapeCollection=gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s,this.effectsSequence=[]}function h(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function l(e,r,a){this.propType="shape",this.comp=e.comp,this.elem=e,this.container=e,this.offsetTime=e.data.st,this.keyframes=3===a?r.pt.k:r.ks.k,this.keyframesMetadata=[],this.k=!0,this.kf=!0;var n=this.keyframes[0].s[0].i.length;this.v=pt.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,n),this.pv=pt.clone(this.v),this.localShapeCollection=gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=t,this.reset=s,this._caching={lastFrame:t,lastIndex:0},this.effectsSequence=[i.bind(this)]}o.prototype.interpolateShape=e,o.prototype.getValue=n,o.prototype.setVValue=r,o.prototype.addEffect=h,l.prototype.getValue=n,l.prototype.interpolateShape=e,l.prototype.setVValue=r,l.prototype.addEffect=h;var p=function(){var t=A;function e(t,e){this.v=pt.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=gt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=at.getProp(t,e.p,1,0,this),this.s=at.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}return e.prototype={reset:s,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var e=this.p.v[0],i=this.p.v[1],s=this.s.v[0]/2,r=this.s.v[1]/2,a=3!==this.d,n=this.v;n.v[0][0]=e,n.v[0][1]=i-r,n.v[1][0]=a?e+s:e-s,n.v[1][1]=i,n.v[2][0]=e,n.v[2][1]=i+r,n.v[3][0]=a?e-s:e+s,n.v[3][1]=i,n.i[0][0]=a?e-s*t:e+s*t,n.i[0][1]=i-r,n.i[1][0]=a?e+s:e-s,n.i[1][1]=i-r*t,n.i[2][0]=a?e+s*t:e-s*t,n.i[2][1]=i+r,n.i[3][0]=a?e-s:e+s,n.i[3][1]=i+r*t,n.o[0][0]=a?e+s*t:e-s*t,n.o[0][1]=i-r,n.o[1][0]=a?e+s:e-s,n.o[1][1]=i+r*t,n.o[2][0]=a?e-s*t:e+s*t,n.o[2][1]=i+r,n.o[3][0]=a?e-s:e+s,n.o[3][1]=i-r*t}},a([nt],e),e}(),f=function(){function t(t,e){this.v=pt.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=at.getProp(t,e.ir,0,0,this),this.is=at.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=at.getProp(t,e.pt,0,0,this),this.p=at.getProp(t,e.p,1,0,this),this.r=at.getProp(t,e.r,0,k,this),this.or=at.getProp(t,e.or,0,0,this),this.os=at.getProp(t,e.os,0,.01,this),this.localShapeCollection=gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}return t.prototype={reset:s,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){var t,e,i,s,r=2*Math.floor(this.pt.v),a=2*Math.PI/r,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,f=2*Math.PI*o/(2*r),u=2*Math.PI*h/(2*r),c=-Math.PI/2;c+=this.r.v;var m=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<r;t+=1){i=n?l:p,s=n?f:u;var d=(e=n?o:h)*Math.cos(c),g=e*Math.sin(c),y=0===d&&0===g?0:g/Math.sqrt(d*d+g*g),v=0===d&&0===g?0:-d/Math.sqrt(d*d+g*g);d+=+this.p.v[0],g+=+this.p.v[1],this.v.setTripleAt(d,g,d-y*s*i*m,g-v*s*i*m,d+y*s*i*m,g+v*s*i*m,t,!0),n=!n,c+=a*m}},convertPolygonToPath:function(){var t,e=Math.floor(this.pt.v),i=2*Math.PI/e,s=this.or.v,r=this.os.v,a=2*Math.PI*s/(4*e),n=.5*-Math.PI,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var h=s*Math.cos(n),l=s*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),f=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.setTripleAt(h,l,h-p*a*r*o,l-f*a*r*o,h+p*a*r*o,l+f*a*r*o,t,!0),n+=i*o}this.paths.length=0,this.paths[0]=this.v}},a([nt],t),t}(),u=function(){function t(t,e){this.v=pt.newElement(),this.v.c=!0,this.localShapeCollection=gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=at.getProp(t,e.p,1,0,this),this.s=at.getProp(t,e.s,1,0,this),this.r=at.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}return t.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],i=this.s.v[0]/2,s=this.s.v[1]/2,r=b(i,s,this.r.v),a=r*(1-A);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+i,e-s+r,t+i,e-s+r,t+i,e-s+a,0,!0),this.v.setTripleAt(t+i,e+s-r,t+i,e+s-a,t+i,e+s-r,1,!0),0!==r?(this.v.setTripleAt(t+i-r,e+s,t+i-r,e+s,t+i-a,e+s,2,!0),this.v.setTripleAt(t-i+r,e+s,t-i+a,e+s,t-i+r,e+s,3,!0),this.v.setTripleAt(t-i,e+s-r,t-i,e+s-r,t-i,e+s-a,4,!0),this.v.setTripleAt(t-i,e-s+r,t-i,e-s+a,t-i,e-s+r,5,!0),this.v.setTripleAt(t-i+r,e-s,t-i+r,e-s,t-i+a,e-s,6,!0),this.v.setTripleAt(t+i-r,e-s,t+i-a,e-s,t+i-r,e-s,7,!0)):(this.v.setTripleAt(t-i,e+s,t-i+a,e+s,t-i,e+s,2),this.v.setTripleAt(t-i,e-s,t-i,e-s+a,t-i,e-s,3))):(this.v.setTripleAt(t+i,e-s+r,t+i,e-s+a,t+i,e-s+r,0,!0),0!==r?(this.v.setTripleAt(t+i-r,e-s,t+i-r,e-s,t+i-a,e-s,1,!0),this.v.setTripleAt(t-i+r,e-s,t-i+a,e-s,t-i+r,e-s,2,!0),this.v.setTripleAt(t-i,e-s+r,t-i,e-s+r,t-i,e-s+a,3,!0),this.v.setTripleAt(t-i,e+s-r,t-i,e+s-a,t-i,e+s-r,4,!0),this.v.setTripleAt(t-i+r,e+s,t-i+r,e+s,t-i+a,e+s,5,!0),this.v.setTripleAt(t+i-r,e+s,t+i-a,e+s,t+i-r,e+s,6,!0),this.v.setTripleAt(t+i,e+s-r,t+i,e+s-r,t+i,e+s-a,7,!0)):(this.v.setTripleAt(t-i,e-s,t-i+a,e-s,t-i,e-s,1,!0),this.v.setTripleAt(t-i,e+s,t-i,e+s-a,t-i,e+s,2,!0),this.v.setTripleAt(t+i,e+s,t+i-a,e+s,t+i,e+s,3,!0)))},getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:s},a([nt],t),t}();var c={getShapeProp:function(t,e,i){var s;return 3===i||4===i?s=(3===i?e.pt:e.ks).k.length?new l(t,e,i):new o(t,e,i):5===i?s=new u(t,e):6===i?s=new p(t,e):7===i&&(s=new f(t,e)),s.k&&t.addDynamicProperty(s),s},getConstructorFunction:function(){return o},getKeyframedConstructorFunction:function(){return l}};return c}(),vt=function(){var t=Math.cos,e=Math.sin,i=Math.tan,s=Math.round;function r(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function a(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(s,-r,0,0,r,s,0,0,0,0,1,0,0,0,0,1)}function n(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(1,0,0,0,0,s,-r,0,0,r,s,0,0,0,0,1)}function o(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(s,0,r,0,0,1,0,0,-r,0,s,0,0,0,0,1)}function h(i){if(0===i)return this;var s=t(i),r=e(i);return this._t(s,-r,0,0,r,s,0,0,0,0,1,0,0,0,0,1)}function p(t,e){return this._t(1,e,t,1,0,0)}function f(t,e){return this.shear(i(t),i(e))}function u(s,r){var a=t(r),n=e(r);return this._t(a,n,0,0,-n,a,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,i(s),1,0,0,0,0,1,0,0,0,0,1)._t(a,-n,0,0,n,a,0,0,0,0,1,0,0,0,0,1)}function c(t,e,i){return i||0===i||(i=1),1===t&&1===e&&1===i?this:this._t(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1)}function m(t,e,i,s,r,a,n,o,h,l,p,f,u,c,m,d){return this.props[0]=t,this.props[1]=e,this.props[2]=i,this.props[3]=s,this.props[4]=r,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=f,this.props[12]=u,this.props[13]=c,this.props[14]=m,this.props[15]=d,this}function d(t,e,i){return i=i||0,0!==t||0!==e||0!==i?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,i,1):this}function g(t,e,i,s,r,a,n,o,h,l,p,f,u,c,m,d){var g=this.props;if(1===t&&0===e&&0===i&&0===s&&0===r&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===f)return g[12]=g[12]*t+g[15]*u,g[13]=g[13]*a+g[15]*c,g[14]=g[14]*p+g[15]*m,g[15]*=d,this._identityCalculated=!1,this;var y=g[0],v=g[1],b=g[2],_=g[3],P=g[4],k=g[5],A=g[6],x=g[7],S=g[8],D=g[9],w=g[10],C=g[11],T=g[12],E=g[13],F=g[14],M=g[15];return g[0]=y*t+v*r+b*h+_*u,g[1]=y*e+v*a+b*l+_*c,g[2]=y*i+v*n+b*p+_*m,g[3]=y*s+v*o+b*f+_*d,g[4]=P*t+k*r+A*h+x*u,g[5]=P*e+k*a+A*l+x*c,g[6]=P*i+k*n+A*p+x*m,g[7]=P*s+k*o+A*f+x*d,g[8]=S*t+D*r+w*h+C*u,g[9]=S*e+D*a+w*l+C*c,g[10]=S*i+D*n+w*p+C*m,g[11]=S*s+D*o+w*f+C*d,g[12]=T*t+E*r+F*h+M*u,g[13]=T*e+E*a+F*l+M*c,g[14]=T*i+E*n+F*p+M*m,g[15]=T*s+E*o+F*f+M*d,this._identityCalculated=!1,this}function y(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function v(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function b(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e];return t}function _(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function P(t,e,i){return{x:t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]}}function k(t,e,i){return t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12]}function A(t,e,i){return t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13]}function x(t,e,i){return t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]}function S(){var t=this.props[0]*this.props[5]-this.props[1]*this.props[4],e=this.props[5]/t,i=-this.props[1]/t,s=-this.props[4]/t,r=this.props[0]/t,a=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/t,n=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/t,o=new vt;return o.props[0]=e,o.props[1]=i,o.props[4]=s,o.props[5]=r,o.props[12]=a,o.props[13]=n,o}function D(t){return this.getInverseMatrix().applyToPointArray(t[0],t[1],t[2]||0)}function w(t){var e,i=t.length,s=[];for(e=0;e<i;e+=1)s[e]=D(t[e]);return s}function C(t,e,i){var s=l("float32",6);if(this.isIdentity())s[0]=t[0],s[1]=t[1],s[2]=e[0],s[3]=e[1],s[4]=i[0],s[5]=i[1];else{var r=this.props[0],a=this.props[1],n=this.props[4],o=this.props[5],h=this.props[12],p=this.props[13];s[0]=t[0]*r+t[1]*n+h,s[1]=t[0]*a+t[1]*o+p,s[2]=e[0]*r+e[1]*n+h,s[3]=e[0]*a+e[1]*o+p,s[4]=i[0]*r+i[1]*n+h,s[5]=i[0]*a+i[1]*o+p}return s}function T(t,e,i){return this.isIdentity()?[t,e,i]:[t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]]}function E(t,e){if(this.isIdentity())return t+","+e;var i=this.props;return Math.round(100*(t*i[0]+e*i[4]+i[12]))/100+","+Math.round(100*(t*i[1]+e*i[5]+i[13]))/100}function F(){for(var t=0,e=this.props,i="matrix3d(";t<16;)i+=s(1e4*e[t])/1e4,i+=15===t?")":",",t+=1;return i}function M(t){return t<1e-6&&t>0||t>-1e-6&&t<0?s(1e4*t)/1e4:t}function I(){var t=this.props;return"matrix("+M(t[0])+","+M(t[1])+","+M(t[4])+","+M(t[5])+","+M(t[12])+","+M(t[13])+")"}return function(){this.reset=r,this.rotate=a,this.rotateX=n,this.rotateY=o,this.rotateZ=h,this.skew=f,this.skewFromAxis=u,this.shear=p,this.scale=c,this.setTransform=m,this.translate=d,this.transform=g,this.applyToPoint=P,this.applyToX=k,this.applyToY=A,this.applyToZ=x,this.applyToPointArray=T,this.applyToTriplePoints=C,this.applyToPointStringified=E,this.toCSS=F,this.to2dCSS=I,this.clone=b,this.cloneFromProps=_,this.equals=v,this.inversePoints=w,this.inversePoint=D,this.getInverseMatrix=S,this._t=this.transform,this.isIdentity=y,this._identity=!0,this._identityCalculated=!1,this.props=l("float32",16),this.reset()}}();function bt(t){return bt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},bt(t)}var _t={};function Pt(){Q.searchAnimations()}_t.play=Q.play,_t.pause=Q.pause,_t.setLocationHref=function(e){t=e},_t.togglePause=Q.togglePause,_t.setSpeed=Q.setSpeed,_t.setDirection=Q.setDirection,_t.stop=Q.stop,_t.searchAnimations=Pt,_t.registerAnimation=Q.registerAnimation,_t.loadAnimation=function(t){return Q.loadAnimation(t)},_t.setSubframeRendering=function(t){!function(t){u=!!t}(t)},_t.resize=Q.resize,_t.goToAndStop=Q.goToAndStop,_t.destroy=Q.destroy,_t.setQuality=function(t){if("string"==typeof t)switch(t){case"high":j(200);break;default:case"medium":j(50);break;case"low":j(10)}else!isNaN(t)&&t>1&&j(t);B()>=50?x(!1):x(!0)},_t.inBrowser=function(){return"undefined"!=typeof navigator},_t.installPlugin=function(t,e){"expressions"===t&&(c=e)},_t.freeze=Q.freeze,_t.unfreeze=Q.unfreeze,_t.setVolume=Q.setVolume,_t.mute=Q.mute,_t.unmute=Q.unmute,_t.getRegisteredAnimations=Q.getRegisteredAnimations,_t.useWebWorker=function(t){e=!!t},_t.setIDPrefix=function(t){m=t},_t.__getFactory=function(t){switch(t){case"propertyFactory":return at;case"shapePropertyFactory":return yt;case"matrix":return vt;default:return null}},_t.version="5.9.6";var kt="",At=document.getElementsByTagName("script"),xt=At[At.length-1]||{src:""};kt=xt.src?xt.src.replace(/^[^\?]+\??/,""):"",function(t){for(var e=kt.split("&"),i=0;i<e.length;i+=1){var s=e[i].split("=");if(decodeURIComponent(s[0])==t)return decodeURIComponent(s[1])}}("renderer");var St=setInterval((function(){"complete"===document.readyState&&(clearInterval(St),Pt())}),100);try{"object"===("undefined"==typeof exports?"undefined":bt(exports))&&"undefined"!=typeof module||"function"==typeof define&&define.amd||(window.bodymovin=_t)}catch(t){}var Dt=function(){var t={},e={};return t.registerModifier=function(t,i){e[t]||(e[t]=i)},t.getModifier=function(t,i,s){return new e[t](i,s)},t}();function wt(){}function Ct(){}function Tt(){}wt.prototype.initModifierProperties=function(){},wt.prototype.addShapeToModifier=function(){},wt.prototype.addShape=function(t){if(!this.closed){t.sh.container.addDynamicProperty(t.sh);var e={shape:t.sh,data:t,localShapeCollection:gt.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},wt.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=i,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},wt.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},a([nt],wt),a([wt],Ct),Ct.prototype.initModifierProperties=function(t,e){this.s=at.getProp(t,e.s,0,.01,this),this.e=at.getProp(t,e.e,0,.01,this),this.o=at.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},Ct.prototype.addShapeToModifier=function(t){t.pathsData=[]},Ct.prototype.calculateShapeEdges=function(t,e,i,s,r){var a=[];e<=1?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;n<l;n+=1){var p,f;if(!((o=a[n]).e*r<s||o.s*r>s+i))p=o.s*r<=s?0:(o.s*r-s)/i,f=o.e*r>=s+i?1:(o.e*r-s)/i,h.push([p,f])}return h.length||h.push([0,0]),h},Ct.prototype.releasePathsData=function(t){var e,i=t.length;for(e=0;e<i;e+=1)st.release(t[e]);return t.length=0,t},Ct.prototype.processShapes=function(t){var e,i,s,r;if(this._mdf||t){var a=this.o.v%360/360;if(a<0&&(a+=1),(e=this.s.v>1?1+a:this.s.v<0?0+a:this.s.v+a)>(i=this.e.v>1?1+a:this.e.v<0?0+a:this.e.v+a)){var n=e;e=i,i=n}e=1e-4*Math.round(1e4*e),i=1e-4*Math.round(1e4*i),this.sValue=e,this.eValue=i}else e=this.sValue,i=this.eValue;var o,h,l,p,f,u=this.shapes.length,c=0;if(i===e)for(r=0;r<u;r+=1)this.shapes[r].localShapeCollection.releaseShapes(),this.shapes[r].shape._mdf=!0,this.shapes[r].shape.paths=this.shapes[r].localShapeCollection,this._mdf&&(this.shapes[r].pathsData.length=0);else if(1===i&&0===e||0===i&&1===e){if(this._mdf)for(r=0;r<u;r+=1)this.shapes[r].pathsData.length=0,this.shapes[r].shape._mdf=!0}else{var m,d,g=[];for(r=0;r<u;r+=1)if((m=this.shapes[r]).shape._mdf||this._mdf||t||2===this.m){if(h=(s=m.shape.paths)._length,f=0,!m.shape._mdf&&m.pathsData.length)f=m.totalShapeLength;else{for(l=this.releasePathsData(m.pathsData),o=0;o<h;o+=1)p=rt.getSegmentsLength(s.shapes[o]),l.push(p),f+=p.totalLength;m.totalShapeLength=f,m.pathsData=l}c+=f,m.shape._mdf=!0}else m.shape.paths=m.localShapeCollection;var y,v=e,b=i,_=0;for(r=u-1;r>=0;r-=1)if((m=this.shapes[r]).shape._mdf){for((d=m.localShapeCollection).releaseShapes(),2===this.m&&u>1?(y=this.calculateShapeEdges(e,i,m.totalShapeLength,_,c),_+=m.totalShapeLength):y=[[v,b]],h=y.length,o=0;o<h;o+=1){v=y[o][0],b=y[o][1],g.length=0,b<=1?g.push({s:m.totalShapeLength*v,e:m.totalShapeLength*b}):v>=1?g.push({s:m.totalShapeLength*(v-1),e:m.totalShapeLength*(b-1)}):(g.push({s:m.totalShapeLength*v,e:m.totalShapeLength}),g.push({s:0,e:m.totalShapeLength*(b-1)}));var P=this.addShapes(m,g[0]);if(g[0].s!==g[0].e){if(g.length>1)if(m.shape.paths.shapes[m.shape.paths._length-1].c){var k=P.pop();this.addPaths(P,d),P=this.addShapes(m,g[1],k)}else this.addPaths(P,d),P=this.addShapes(m,g[1]);this.addPaths(P,d)}}m.shape.paths=d}}},Ct.prototype.addPaths=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)e.addShape(t[i])},Ct.prototype.addSegment=function(t,e,i,s,r,a,n){r.setXYAt(e[0],e[1],"o",a),r.setXYAt(i[0],i[1],"i",a+1),n&&r.setXYAt(t[0],t[1],"v",a),r.setXYAt(s[0],s[1],"v",a+1)},Ct.prototype.addSegmentFromArray=function(t,e,i,s){e.setXYAt(t[1],t[5],"o",i),e.setXYAt(t[2],t[6],"i",i+1),s&&e.setXYAt(t[0],t[4],"v",i),e.setXYAt(t[3],t[7],"v",i+1)},Ct.prototype.addShapes=function(t,e,i){var s,r,a,n,o,h,l,p,f=t.pathsData,u=t.shape.paths.shapes,c=t.shape.paths._length,m=0,d=[],g=!0;for(i?(o=i._length,p=i._length):(i=pt.newElement(),o=0,p=0),d.push(i),s=0;s<c;s+=1){for(h=f[s].lengths,i.c=u[s].c,a=u[s].c?h.length:h.length+1,r=1;r<a;r+=1)if(m+(n=h[r-1]).addedLength<e.s)m+=n.addedLength,i.c=!1;else{if(m>e.e){i.c=!1;break}e.s<=m&&e.e>=m+n.addedLength?(this.addSegment(u[s].v[r-1],u[s].o[r-1],u[s].i[r],u[s].v[r],i,o,g),g=!1):(l=rt.getNewSegment(u[s].v[r-1],u[s].v[r],u[s].o[r-1],u[s].i[r],(e.s-m)/n.addedLength,(e.e-m)/n.addedLength,h[r-1]),this.addSegmentFromArray(l,i,o,g),g=!1,i.c=!1),m+=n.addedLength,o+=1}if(u[s].c&&h.length){if(n=h[r-1],m<=e.e){var y=h[r-1].addedLength;e.s<=m&&e.e>=m+y?(this.addSegment(u[s].v[r-1],u[s].o[r-1],u[s].i[0],u[s].v[0],i,o,g),g=!1):(l=rt.getNewSegment(u[s].v[r-1],u[s].v[0],u[s].o[r-1],u[s].i[0],(e.s-m)/y,(e.e-m)/y,h[r-1]),this.addSegmentFromArray(l,i,o,g),g=!1,i.c=!1)}else i.c=!1;m+=n.addedLength,o+=1}if(i._length&&(i.setXYAt(i.v[p][0],i.v[p][1],"i",p),i.setXYAt(i.v[i._length-1][0],i.v[i._length-1][1],"o",i._length-1)),m>e.e)break;s<c-1&&(i=pt.newElement(),g=!0,d.push(i),o=0)}return d},a([wt],Tt),Tt.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.amount=at.getProp(t,e.a,0,null,this),this._isAnimated=!!this.amount.effectsSequence.length},Tt.prototype.processPath=function(t,e){var i=e/100,s=[0,0],r=t._length,a=0;for(a=0;a<r;a+=1)s[0]+=t.v[a][0],s[1]+=t.v[a][1];s[0]/=r,s[1]/=r;var n,o,h,l,p,f,u=pt.newElement();for(u.c=t.c,a=0;a<r;a+=1)n=t.v[a][0]+(s[0]-t.v[a][0])*i,o=t.v[a][1]+(s[1]-t.v[a][1])*i,h=t.o[a][0]+(s[0]-t.o[a][0])*-i,l=t.o[a][1]+(s[1]-t.o[a][1])*-i,p=t.i[a][0]+(s[0]-t.i[a][0])*-i,f=t.i[a][1]+(s[1]-t.i[a][1])*-i,u.setTripleAt(n,o,h,l,p,f,a);return u},Tt.prototype.processShapes=function(t){var e,i,s,r,a,n,o=this.shapes.length,h=this.amount.v;if(0!==h)for(i=0;i<o;i+=1){if(n=(a=this.shapes[i]).localShapeCollection,a.shape._mdf||this._mdf||t)for(n.releaseShapes(),a.shape._mdf=!0,e=a.shape.paths.shapes,r=a.shape.paths._length,s=0;s<r;s+=1)n.addShape(this.processPath(e[s],h));a.shape.paths=a.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)};var Et=function(){var t=[0,0];function e(t,e,i){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new vt,this.pre=new vt,this.appliedTransformations=0,this.initDynamicPropertyContainer(i||t),e.p&&e.p.s?(this.px=at.getProp(t,e.p.x,0,0,this),this.py=at.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=at.getProp(t,e.p.z,0,0,this))):this.p=at.getProp(t,e.p||{k:[0,0,0]},1,0,this),e.rx){if(this.rx=at.getProp(t,e.rx,0,k,this),this.ry=at.getProp(t,e.ry,0,k,this),this.rz=at.getProp(t,e.rz,0,k,this),e.or.k[0].ti){var s,r=e.or.k.length;for(s=0;s<r;s+=1)e.or.k[s].to=null,e.or.k[s].ti=null}this.or=at.getProp(t,e.or,1,k,this),this.or.sh=!0}else this.r=at.getProp(t,e.r||{k:0},0,k,this);e.sk&&(this.sk=at.getProp(t,e.sk,0,k,this),this.sa=at.getProp(t,e.sa,0,k,this)),this.a=at.getProp(t,e.a||{k:[0,0,0]},1,0,this),this.s=at.getProp(t,e.s||{k:[100,100,100]},1,.01,this),e.o?this.o=at.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}return e.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])},getValue:function(e){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||e){var i;if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var s,r;if(i=this.elem.globalData.frameRate,this.p&&this.p.keyframes&&this.p.getValueAtTime)this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/i,0),r=this.p.getValueAtTime(this.p.keyframes[0].t/i,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),r=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/i,0)):(s=this.p.pv,r=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){s=[],r=[];var a=this.px,n=this.py;a._caching.lastFrame+a.offsetTime<=a.keyframes[0].t?(s[0]=a.getValueAtTime((a.keyframes[0].t+.01)/i,0),s[1]=n.getValueAtTime((n.keyframes[0].t+.01)/i,0),r[0]=a.getValueAtTime(a.keyframes[0].t/i,0),r[1]=n.getValueAtTime(n.keyframes[0].t/i,0)):a._caching.lastFrame+a.offsetTime>=a.keyframes[a.keyframes.length-1].t?(s[0]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/i,0),s[1]=n.getValueAtTime(n.keyframes[n.keyframes.length-1].t/i,0),r[0]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/i,0),r[1]=n.getValueAtTime((n.keyframes[n.keyframes.length-1].t-.01)/i,0)):(s=[a.pv,n.pv],r[0]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/i,a.offsetTime),r[1]=n.getValueAtTime((n._caching.lastFrame+n.offsetTime-.01)/i,n.offsetTime))}else s=r=t;this.v.rotate(-Math.atan2(s[1]-r[1],s[0]-r[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},a([nt],e),e.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},e.prototype._addDynamicProperty=nt.prototype.addDynamicProperty,{getTransformProperty:function(t,i,s){return new e(t,i,s)}}}();function Ft(){}function Mt(){}function It(t){for(var e=t.fStyle?t.fStyle.split(" "):[],i="normal",s="normal",r=e.length,a=0;a<r;a+=1)switch(e[a].toLowerCase()){case"italic":s="italic";break;case"bold":i="700";break;case"black":i="900";break;case"medium":i="500";break;case"regular":case"normal":i="400";break;case"light":case"thin":i="200"}return{style:s,weight:t.fWeight||i}}a([wt],Ft),Ft.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=at.getProp(t,e.c,0,null,this),this.o=at.getProp(t,e.o,0,null,this),this.tr=Et.getTransformProperty(t,e.tr,this),this.so=at.getProp(t,e.tr.so,0,.01,this),this.eo=at.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new vt,this.rMatrix=new vt,this.sMatrix=new vt,this.tMatrix=new vt,this.matrix=new vt},Ft.prototype.applyTransforms=function(t,e,i,s,r,a){var n=a?-1:1,o=s.s.v[0]+(1-s.s.v[0])*(1-r),h=s.s.v[1]+(1-s.s.v[1])*(1-r);t.translate(s.p.v[0]*n*r,s.p.v[1]*n*r,s.p.v[2]),e.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),e.rotate(-s.r.v*n*r),e.translate(s.a.v[0],s.a.v[1],s.a.v[2]),i.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),i.scale(a?1/o:o,a?1/h:h),i.translate(s.a.v[0],s.a.v[1],s.a.v[2])},Ft.prototype.init=function(t,e,i,s){for(this.elem=t,this.arr=e,this.pos=i,this.elemsData=s,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[i]);i>0;)i-=1,this._elements.unshift(e[i]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},Ft.prototype.resetElements=function(t){var e,i=t.length;for(e=0;e<i;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},Ft.prototype.cloneElements=function(t){var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},Ft.prototype.changeGroupRender=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)t[i]._render=e,"gr"===t[i].ty&&this.changeGroupRender(t[i].it,e)},Ft.prototype.processShapes=function(t){var e,i,s,r,a,n=!1;if(this._mdf||t){var o,h=Math.ceil(this.c.v);if(this._groups.length<h){for(;this._groups.length<h;){var l={it:this.cloneElements(this._elements),ty:"gr"};l.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,l),this._groups.splice(0,0,l),this._currentCopies+=1}this.elem.reloadShapes(),n=!0}for(a=0,s=0;s<=this._groups.length-1;s+=1){if(o=a<h,this._groups[s]._render=o,this.changeGroupRender(this._groups[s].it,o),!o){var p=this.elemsData[s].it,f=p[p.length-1];0!==f.transform.op.v?(f.transform.op._mdf=!0,f.transform.op.v=0):f.transform.op._mdf=!1}a+=1}this._currentCopies=h;var u=this.o.v,c=u%1,m=u>0?Math.floor(u):Math.ceil(u),d=this.pMatrix.props,g=this.rMatrix.props,y=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var v,b,_=0;if(u>0){for(;_<m;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),_+=1;c&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,c,!1),_+=c)}else if(u<0){for(;_>m;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),_-=1;c&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-c,!0),_-=c)}for(s=1===this.data.m?0:this._currentCopies-1,r=1===this.data.m?1:-1,a=this._currentCopies;a;){if(b=(i=(e=this.elemsData[s].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=1===this._currentCopies?this.so.v:this.so.v+(this.eo.v-this.so.v)*(s/(this._currentCopies-1)),0!==_){for((0!==s&&1===r||s!==this._currentCopies-1&&-1===r)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(g[0],g[1],g[2],g[3],g[4],g[5],g[6],g[7],g[8],g[9],g[10],g[11],g[12],g[13],g[14],g[15]),this.matrix.transform(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15]),this.matrix.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),v=0;v<b;v+=1)i[v]=this.matrix.props[v];this.matrix.reset()}else for(this.matrix.reset(),v=0;v<b;v+=1)i[v]=this.matrix.props[v];_+=1,a-=1,s+=r}}else for(a=this._currentCopies,s=0,r=1;a;)i=(e=this.elemsData[s].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,a-=1,s+=r;return n},Ft.prototype.addShape=function(){},a([wt],Mt),Mt.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=at.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},Mt.prototype.processPath=function(t,e){var i,s=pt.newElement();s.c=t.c;var r,a,n,o,h,l,p,f,u,c,m,d,g=t._length,y=0;for(i=0;i<g;i+=1)r=t.v[i],n=t.o[i],a=t.i[i],r[0]===n[0]&&r[1]===n[1]&&r[0]===a[0]&&r[1]===a[1]?0!==i&&i!==g-1||t.c?(o=0===i?t.v[g-1]:t.v[i-1],l=(h=Math.sqrt(Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)))?Math.min(h/2,e)/h:0,p=m=r[0]+(o[0]-r[0])*l,f=d=r[1]-(r[1]-o[1])*l,u=p-(p-r[0])*A,c=f-(f-r[1])*A,s.setTripleAt(p,f,u,c,m,d,y),y+=1,o=i===g-1?t.v[0]:t.v[i+1],l=(h=Math.sqrt(Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)))?Math.min(h/2,e)/h:0,p=u=r[0]+(o[0]-r[0])*l,f=c=r[1]+(o[1]-r[1])*l,m=p-(p-r[0])*A,d=f-(f-r[1])*A,s.setTripleAt(p,f,u,c,m,d,y),y+=1):(s.setTripleAt(r[0],r[1],n[0],n[1],a[0],a[1],y),y+=1):(s.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],y),y+=1);return s},Mt.prototype.processShapes=function(t){var e,i,s,r,a,n,o=this.shapes.length,h=this.rd.v;if(0!==h)for(i=0;i<o;i+=1){if(n=(a=this.shapes[i]).localShapeCollection,a.shape._mdf||this._mdf||t)for(n.releaseShapes(),a.shape._mdf=!0,e=a.shape.paths.shapes,r=a.shape.paths._length,s=0;s<r;s+=1)n.addShape(this.processPath(e[s],h));a.shape.paths=a.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)};var Lt=function(){var t={w:0,size:0,shapes:[],data:{shapes:[]}},e=[];e=e.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var i=["d83cdffb","d83cdffc","d83cdffd","d83cdffe","d83cdfff"],s=[65039,8205];function a(t,e){var i=r("span");i.setAttribute("aria-hidden",!0),i.style.fontFamily=e;var s=r("span");s.innerText="giItT1WQy@!-/#",i.style.position="absolute",i.style.left="-10000px",i.style.top="-10000px",i.style.fontSize="300px",i.style.fontVariant="normal",i.style.fontStyle="normal",i.style.fontWeight="normal",i.style.letterSpacing="0",i.appendChild(s),document.body.appendChild(i);var a=s.offsetWidth;return s.style.fontFamily=function(t){var e,i=t.split(","),s=i.length,r=[];for(e=0;e<s;e+=1)"sans-serif"!==i[e]&&"monospace"!==i[e]&&r.push(i[e]);return r.join(",")}(t)+", "+e,{node:s,w:a,parent:i}}function n(t,e){var i,s=document.body&&e?"svg":"canvas",r=It(t);if("svg"===s){var a=G("text");a.style.fontSize="100px",a.setAttribute("font-family",t.fFamily),a.setAttribute("font-style",r.style),a.setAttribute("font-weight",r.weight),a.textContent="1",t.fClass?(a.style.fontFamily="inherit",a.setAttribute("class",t.fClass)):a.style.fontFamily=t.fFamily,e.appendChild(a),i=a}else{var n=new OffscreenCanvas(500,500).getContext("2d");n.font=r.style+" "+r.weight+" 100px "+t.fFamily,i=n}return{measureText:function(t){return"svg"===s?(i.textContent=t,i.getComputedTextLength()):i.measureText(t).width}}}var o=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};o.isModifier=function(t,e){var s=t.toString(16)+e.toString(16);return-1!==i.indexOf(s)},o.isZeroWidthJoiner=function(t,e){return e?t===s[0]&&e===s[1]:t===s[1]},o.isCombinedCharacter=function(t){return-1!==e.indexOf(t)};var h={addChars:function(t){if(t){var e;this.chars||(this.chars=[]);var i,s,r=t.length,a=this.chars.length;for(e=0;e<r;e+=1){for(i=0,s=!1;i<a;)this.chars[i].style===t[e].style&&this.chars[i].fFamily===t[e].fFamily&&this.chars[i].ch===t[e].ch&&(s=!0),i+=1;s||(this.chars.push(t[e]),a+=1)}}},addFonts:function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);if(!document.body)return this.isLoaded=!0,t.list.forEach((function(t){t.helper=n(t),t.cache={}})),void(this.fonts=t.list);var i,s=t.list,o=s.length,h=o;for(i=0;i<o;i+=1){var l,p,f=!0;if(s[i].loaded=!1,s[i].monoCase=a(s[i].fFamily,"monospace"),s[i].sansCase=a(s[i].fFamily,"sans-serif"),s[i].fPath){if("p"===s[i].fOrigin||3===s[i].origin){if((l=document.querySelectorAll('style[f-forigin="p"][f-family="'+s[i].fFamily+'"], style[f-origin="3"][f-family="'+s[i].fFamily+'"]')).length>0&&(f=!1),f){var u=r("style");u.setAttribute("f-forigin",s[i].fOrigin),u.setAttribute("f-origin",s[i].origin),u.setAttribute("f-family",s[i].fFamily),u.type="text/css",u.innerText="@font-face {font-family: "+s[i].fFamily+"; font-style: normal; src: url('"+s[i].fPath+"');}",e.appendChild(u)}}else if("g"===s[i].fOrigin||1===s[i].origin){for(l=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),p=0;p<l.length;p+=1)-1!==l[p].href.indexOf(s[i].fPath)&&(f=!1);if(f){var c=r("link");c.setAttribute("f-forigin",s[i].fOrigin),c.setAttribute("f-origin",s[i].origin),c.type="text/css",c.rel="stylesheet",c.href=s[i].fPath,document.body.appendChild(c)}}else if("t"===s[i].fOrigin||2===s[i].origin){for(l=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),p=0;p<l.length;p+=1)s[i].fPath===l[p].src&&(f=!1);if(f){var m=r("link");m.setAttribute("f-forigin",s[i].fOrigin),m.setAttribute("f-origin",s[i].origin),m.setAttribute("rel","stylesheet"),m.setAttribute("href",s[i].fPath),e.appendChild(m)}}}else s[i].loaded=!0,h-=1;s[i].helper=n(s[i],e),s[i].cache={},this.fonts.push(s[i])}0===h?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},getCharData:function(e,i,s){for(var r=0,a=this.chars.length;r<a;){if(this.chars[r].ch===e&&this.chars[r].style===i&&this.chars[r].fFamily===s)return this.chars[r];r+=1}return("string"==typeof e&&13!==e.charCodeAt(0)||!e)&&console&&console.warn&&!this._warned&&(this._warned=!0,console.warn("Missing character from exported characters list: ",e,i,s)),t},getFontByName:function(t){for(var e=0,i=this.fonts.length;e<i;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},measureText:function(t,e,i){var s=this.getFontByName(e),r=t.charCodeAt(0);if(!s.cache[r+1]){var a=s.helper;if(" "===t){var n=a.measureText("|"+t+"|"),o=a.measureText("||");s.cache[r+1]=(n-o)/100}else s.cache[r+1]=a.measureText(t)/100}return s.cache[r+1]*i},checkLoadedFonts:function(){var t,e,i,s=this.fonts.length,r=s;for(t=0;t<s;t+=1)this.fonts[t].loaded?r-=1:"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(e=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,e.offsetWidth!==i?(r-=1,this.fonts[t].loaded=!0):(e=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,e.offsetWidth!==i&&(r-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==r&&Date.now()-this.initTime<5e3?setTimeout(this.checkLoadedFontsBinded,20):setTimeout(this.setIsLoadedBinded,10)},setIsLoaded:function(){this.isLoaded=!0}};return o.prototype=h,o}();function Rt(){}Rt.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},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}}};var Vt,Ot=function(){function t(t,e){this._mask=t,this._data=e}Object.defineProperty(t.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}}),Object.defineProperty(t.prototype,"maskOpacity",{get:function(){return this._mask.op.k&&this._mask.op.getValue(),100*this._mask.op.v}});return function(e){var i,s=p(e.viewData.length),r=e.viewData.length;for(i=0;i<r;i+=1)s[i]=new t(e.viewData[i],e.masksProperties[i]);return function(t){for(i=0;i<r;){if(e.masksProperties[i].nm===t)return s[i];i+=1}return null}}}(),zt=function(){var t={pv:0,v:0,mult:1},e={pv:[0,0,0],v:[0,0,0],mult:1};function i(t,e,i){Object.defineProperty(t,"velocity",{get:function(){return e.getVelocityAtTime(e.comp.currentFrame)}}),t.numKeys=e.keyframes?e.keyframes.length:0,t.key=function(s){if(!t.numKeys)return 0;var r="";r="s"in e.keyframes[s-1]?e.keyframes[s-1].s:"e"in e.keyframes[s-2]?e.keyframes[s-2].e:e.keyframes[s-2].s;var a="unidimensional"===i?new Number(r):Object.assign({},r);return a.time=e.keyframes[s-1].t/e.elem.comp.globalData.frameRate,a.value="unidimensional"===i?r[0]:r,a},t.valueAtTime=e.getValueAtTime,t.speedAtTime=e.getSpeedAtTime,t.velocityAtTime=e.getVelocityAtTime,t.propertyGroup=e.propertyGroup}function s(){return t}return function(r){return r?"unidimensional"===r.propType?function(e){e&&"pv"in e||(e=t);var s=1/e.mult,r=e.pv*s,a=new Number(r);return a.value=r,i(a,e,"unidimensional"),function(){return e.k&&e.getValue(),r=e.v*s,a.value!==r&&((a=new Number(r)).value=r,i(a,e,"unidimensional")),a}}(r):function(t){t&&"pv"in t||(t=e);var s=1/t.mult,r=t.data&&t.data.l||t.pv.length,a=l("float32",r),n=l("float32",r);return a.value=n,i(a,t,"multidimensional"),function(){t.k&&t.getValue();for(var e=0;e<r;e+=1)n[e]=t.v[e]*s,a[e]=n[e];return a}}(r):s}}(),Nt=function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"ADBE Rotate X":return e.xRotation;case"ADBE Rotate Y":return e.yRotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"ADBE Position_0":return e.xPosition;case"ADBE Position_1":return e.yPosition;case"ADBE Position_2":return e.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity;default:return null}}var i,s,r,a;return Object.defineProperty(e,"rotation",{get:zt(t.r||t.rz)}),Object.defineProperty(e,"zRotation",{get:zt(t.rz||t.r)}),Object.defineProperty(e,"xRotation",{get:zt(t.rx)}),Object.defineProperty(e,"yRotation",{get:zt(t.ry)}),Object.defineProperty(e,"scale",{get:zt(t.s)}),t.p?a=zt(t.p):(i=zt(t.px),s=zt(t.py),t.pz&&(r=zt(t.pz))),Object.defineProperty(e,"position",{get:function(){return t.p?a():[i(),s(),r?r():0]}}),Object.defineProperty(e,"xPosition",{get:zt(t.px)}),Object.defineProperty(e,"yPosition",{get:zt(t.py)}),Object.defineProperty(e,"zPosition",{get:zt(t.pz)}),Object.defineProperty(e,"anchorPoint",{get:zt(t.a)}),Object.defineProperty(e,"opacity",{get:zt(t.o)}),Object.defineProperty(e,"skew",{get:zt(t.sk)}),Object.defineProperty(e,"skewAxis",{get:zt(t.sa)}),Object.defineProperty(e,"orientation",{get:zt(t.or)}),e},jt=function(){function t(t){var e=new vt;void 0!==t?this._elem.finalTransform.mProp.getValueAtTime(t).clone(e):this._elem.finalTransform.mProp.applyToMatrix(e);return e}function e(t,e){var i=this.getMatrix(e);return i.props[12]=0,i.props[13]=0,i.props[14]=0,this.applyPoint(i,t)}function i(t,e){var i=this.getMatrix(e);return this.applyPoint(i,t)}function s(t,e){var i=this.getMatrix(e);return i.props[12]=0,i.props[13]=0,i.props[14]=0,this.invertPoint(i,t)}function r(t,e){var i=this.getMatrix(e);return this.invertPoint(i,t)}function a(t,e){if(this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(t)}return t.applyToPointArray(e[0],e[1],e[2]||0)}function o(t,e){if(this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(t)}return t.inversePoint(e)}function h(t){var e=new vt;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}function l(){return[1,1,1,1]}return function(p){var f;function u(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return u.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return f;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return u.effect;case"ADBE Text Properties":return u.textInterface;default:return null}}u.getMatrix=t,u.invertPoint=o,u.applyPoint=a,u.toWorld=i,u.toWorldVec=e,u.fromWorld=r,u.fromWorldVec=s,u.toComp=i,u.fromComp=h,u.sampleImage=l,u.sourceRectAtTime=p.sourceRectAtTime.bind(p),u._elem=p;var c=n(f=Nt(p.finalTransform.mProp),"anchorPoint");return Object.defineProperties(u,{hasParent:{get:function(){return p.hierarchy.length}},parent:{get:function(){return p.hierarchy[0].layerInterface}},rotation:n(f,"rotation"),scale:n(f,"scale"),position:n(f,"position"),opacity:n(f,"opacity"),anchorPoint:c,anchor_point:c,transform:{get:function(){return f}},active:{get:function(){return p.isInRange}}}),u.startTime=p.data.st,u.index=p.data.ind,u.source=p.data.refId,u.height=0===p.data.ty?p.data.h:100,u.width=0===p.data.ty?p.data.w:100,u.inPoint=p.data.ip/p.comp.globalData.frameRate,u.outPoint=p.data.op/p.comp.globalData.frameRate,u._name=p.data.nm,u.registerMaskInterface=function(t){u.mask=new Ot(t,p)},u.registerEffectsInterface=function(t){u.effect=t},u}}(),Bt=function(t,e){return function(i){return(i=void 0===i?1:i)<=0?t:e(i-1)}},Gt=function(t,e){var i={_name:t};return function(t){return(t=void 0===t?1:t)<=0?i:e(t-1)}},qt=function(){function t(i,s,r,a){function n(t){for(var e=i.ef,s=0,r=e.length;s<r;){if(t===e[s].nm||t===e[s].mn||t===e[s].ix)return 5===e[s].ty?l[s]:l[s]();s+=1}throw new Error}var o,h=Bt(n,r),l=[],p=i.ef.length;for(o=0;o<p;o+=1)5===i.ef[o].ty?l.push(t(i.ef[o],s.effectElements[o],s.effectElements[o].propertyGroup,a)):l.push(e(s.effectElements[o],i.ef[o].ty,a,h));return"ADBE Color Control"===i.mn&&Object.defineProperty(n,"color",{get:function(){return l[0]()}}),Object.defineProperties(n,{numProperties:{get:function(){return i.np}},_name:{value:i.nm},propertyGroup:{value:h}}),n.enabled=0!==i.en,n.active=n.enabled,n}function e(t,e,i,s){var r=zt(t.p);return t.p.setGroupProperty&&t.p.setGroupProperty(Gt("",s)),function(){return 10===e?i.comp.compInterface(t.p.v):r()}}return{createEffectsInterface:function(e,i){if(e.effectsManager){var s,r=[],a=e.data.ef,n=e.effectsManager.effectElements.length;for(s=0;s<n;s+=1)r.push(t(a[s],e.effectsManager.effectElements[s],i,e));var o=e.data.ef||[],h=function(t){for(s=0,n=o.length;s<n;){if(t===o[s].nm||t===o[s].mn||t===o[s].ix)return r[s];s+=1}return null};return Object.defineProperty(h,"numProperties",{get:function(){return o.length}}),h}return null}}}(),Wt=function(t){function e(e){for(var i=0,s=t.layers.length;i<s;){if(t.layers[i].nm===e||t.layers[i].ind===e)return t.elements[i].layerInterface;i+=1}return null}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t.data.h||t.globalData.compSize.h,e.width=t.data.w||t.globalData.compSize.w,e.pixelAspect=1,e.frameDuration=1/t.globalData.frameRate,e.displayStartTime=0,e.numLayers=t.layers.length,e},Xt=function(t,e,i){var s=e.sh;function r(t){return"Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t?r.path:null}var a=Bt(r,i);return s.setGroupProperty(Gt("Path",a)),Object.defineProperties(r,{path:{get:function(){return s.k&&s.getValue(),s}},shape:{get:function(){return s.k&&s.getValue(),s}},_name:{value:t.nm},ix:{value:t.ix},propertyIndex:{value:t.ix},mn:{value:t.mn},propertyGroup:{value:i}}),r},Yt=function(){function t(t,o,c){var m,d=[],g=t?t.length:0;for(m=0;m<g;m+=1)"gr"===t[m].ty?d.push(e(t[m],o[m],c)):"fl"===t[m].ty?d.push(i(t[m],o[m],c)):"st"===t[m].ty?d.push(a(t[m],o[m],c)):"tm"===t[m].ty?d.push(n(t[m],o[m],c)):"tr"===t[m].ty||("el"===t[m].ty?d.push(h(t[m],o[m],c)):"sr"===t[m].ty?d.push(l(t[m],o[m],c)):"sh"===t[m].ty?d.push(Xt(t[m],o[m],c)):"rc"===t[m].ty?d.push(p(t[m],o[m],c)):"rd"===t[m].ty?d.push(f(t[m],o[m],c)):"rp"===t[m].ty?d.push(u(t[m],o[m],c)):"gf"===t[m].ty?d.push(s(t[m],o[m],c)):d.push(r(t[m],o[m])));return d}function e(e,i,s){var r=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return r.content;default:return r.transform}};r.propertyGroup=Bt(r,s);var a=function(e,i,s){var r,a=function(t){for(var e=0,i=r.length;e<i;){if(r[e]._name===t||r[e].mn===t||r[e].propertyIndex===t||r[e].ix===t||r[e].ind===t)return r[e];e+=1}return"number"==typeof t?r[t-1]:null};a.propertyGroup=Bt(a,s),r=t(e.it,i.it,a.propertyGroup),a.numProperties=r.length;var n=o(e.it[e.it.length-1],i.it[i.it.length-1],a.propertyGroup);return a.transform=n,a.propertyIndex=e.cix,a._name=e.nm,a}(e,i,r.propertyGroup),n=o(e.it[e.it.length-1],i.it[i.it.length-1],r.propertyGroup);return r.content=a,r.transform=n,Object.defineProperty(r,"_name",{get:function(){return e.nm}}),r.numProperties=e.np,r.propertyIndex=e.ix,r.nm=e.nm,r.mn=e.mn,r}function i(t,e,i){function s(t){return"Color"===t||"color"===t?s.color:"Opacity"===t||"opacity"===t?s.opacity:null}return Object.defineProperties(s,{color:{get:zt(e.c)},opacity:{get:zt(e.o)},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(Gt("Color",i)),e.o.setGroupProperty(Gt("Opacity",i)),s}function s(t,e,i){function s(t){return"Start Point"===t||"start point"===t?s.startPoint:"End Point"===t||"end point"===t?s.endPoint:"Opacity"===t||"opacity"===t?s.opacity:null}return Object.defineProperties(s,{startPoint:{get:zt(e.s)},endPoint:{get:zt(e.e)},opacity:{get:zt(e.o)},type:{get:function(){return"a"}},_name:{value:t.nm},mn:{value:t.mn}}),e.s.setGroupProperty(Gt("Start Point",i)),e.e.setGroupProperty(Gt("End Point",i)),e.o.setGroupProperty(Gt("Opacity",i)),s}function r(){return function(){return null}}function a(t,e,i){var s,r=Bt(l,i),a=Bt(h,r);function n(i){Object.defineProperty(h,t.d[i].nm,{get:zt(e.d.dataProps[i].p)})}var o=t.d?t.d.length:0,h={};for(s=0;s<o;s+=1)n(s),e.d.dataProps[s].p.setGroupProperty(a);function l(t){return"Color"===t||"color"===t?l.color:"Opacity"===t||"opacity"===t?l.opacity:"Stroke Width"===t||"stroke width"===t?l.strokeWidth:null}return Object.defineProperties(l,{color:{get:zt(e.c)},opacity:{get:zt(e.o)},strokeWidth:{get:zt(e.w)},dash:{get:function(){return h}},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(Gt("Color",r)),e.o.setGroupProperty(Gt("Opacity",r)),e.w.setGroupProperty(Gt("Stroke Width",r)),l}function n(t,e,i){function s(e){return e===t.e.ix||"End"===e||"end"===e?s.end:e===t.s.ix?s.start:e===t.o.ix?s.offset:null}var r=Bt(s,i);return s.propertyIndex=t.ix,e.s.setGroupProperty(Gt("Start",r)),e.e.setGroupProperty(Gt("End",r)),e.o.setGroupProperty(Gt("Offset",r)),s.propertyIndex=t.ix,s.propertyGroup=i,Object.defineProperties(s,{start:{get:zt(e.s)},end:{get:zt(e.e)},offset:{get:zt(e.o)},_name:{value:t.nm}}),s.mn=t.mn,s}function o(t,e,i){function s(e){return t.a.ix===e||"Anchor Point"===e?s.anchorPoint:t.o.ix===e||"Opacity"===e?s.opacity:t.p.ix===e||"Position"===e?s.position:t.r.ix===e||"Rotation"===e||"ADBE Vector Rotation"===e?s.rotation:t.s.ix===e||"Scale"===e?s.scale:t.sk&&t.sk.ix===e||"Skew"===e?s.skew:t.sa&&t.sa.ix===e||"Skew Axis"===e?s.skewAxis:null}var r=Bt(s,i);return e.transform.mProps.o.setGroupProperty(Gt("Opacity",r)),e.transform.mProps.p.setGroupProperty(Gt("Position",r)),e.transform.mProps.a.setGroupProperty(Gt("Anchor Point",r)),e.transform.mProps.s.setGroupProperty(Gt("Scale",r)),e.transform.mProps.r.setGroupProperty(Gt("Rotation",r)),e.transform.mProps.sk&&(e.transform.mProps.sk.setGroupProperty(Gt("Skew",r)),e.transform.mProps.sa.setGroupProperty(Gt("Skew Angle",r))),e.transform.op.setGroupProperty(Gt("Opacity",r)),Object.defineProperties(s,{opacity:{get:zt(e.transform.mProps.o)},position:{get:zt(e.transform.mProps.p)},anchorPoint:{get:zt(e.transform.mProps.a)},scale:{get:zt(e.transform.mProps.s)},rotation:{get:zt(e.transform.mProps.r)},skew:{get:zt(e.transform.mProps.sk)},skewAxis:{get:zt(e.transform.mProps.sa)},_name:{value:t.nm}}),s.ty="tr",s.mn=t.mn,s.propertyGroup=i,s}function h(t,e,i){function s(e){return t.p.ix===e?s.position:t.s.ix===e?s.size:null}var r=Bt(s,i);s.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.s.setGroupProperty(Gt("Size",r)),a.p.setGroupProperty(Gt("Position",r)),Object.defineProperties(s,{size:{get:zt(a.s)},position:{get:zt(a.p)},_name:{value:t.nm}}),s.mn=t.mn,s}function l(t,e,i){function s(e){return t.p.ix===e?s.position:t.r.ix===e?s.rotation:t.pt.ix===e?s.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?s.outerRadius:t.os.ix===e?s.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?s.innerRoundness:null:s.innerRadius}var r=Bt(s,i),a="tm"===e.sh.ty?e.sh.prop:e.sh;return s.propertyIndex=t.ix,a.or.setGroupProperty(Gt("Outer Radius",r)),a.os.setGroupProperty(Gt("Outer Roundness",r)),a.pt.setGroupProperty(Gt("Points",r)),a.p.setGroupProperty(Gt("Position",r)),a.r.setGroupProperty(Gt("Rotation",r)),t.ir&&(a.ir.setGroupProperty(Gt("Inner Radius",r)),a.is.setGroupProperty(Gt("Inner Roundness",r))),Object.defineProperties(s,{position:{get:zt(a.p)},rotation:{get:zt(a.r)},points:{get:zt(a.pt)},outerRadius:{get:zt(a.or)},outerRoundness:{get:zt(a.os)},innerRadius:{get:zt(a.ir)},innerRoundness:{get:zt(a.is)},_name:{value:t.nm}}),s.mn=t.mn,s}function p(t,e,i){function s(e){return t.p.ix===e?s.position:t.r.ix===e?s.roundness:t.s.ix===e||"Size"===e||"ADBE Vector Rect Size"===e?s.size:null}var r=Bt(s,i),a="tm"===e.sh.ty?e.sh.prop:e.sh;return s.propertyIndex=t.ix,a.p.setGroupProperty(Gt("Position",r)),a.s.setGroupProperty(Gt("Size",r)),a.r.setGroupProperty(Gt("Rotation",r)),Object.defineProperties(s,{position:{get:zt(a.p)},roundness:{get:zt(a.r)},size:{get:zt(a.s)},_name:{value:t.nm}}),s.mn=t.mn,s}function f(t,e,i){function s(e){return t.r.ix===e||"Round Corners 1"===e?s.radius:null}var r=Bt(s,i),a=e;return s.propertyIndex=t.ix,a.rd.setGroupProperty(Gt("Radius",r)),Object.defineProperties(s,{radius:{get:zt(a.rd)},_name:{value:t.nm}}),s.mn=t.mn,s}function u(t,e,i){function s(e){return t.c.ix===e||"Copies"===e?s.copies:t.o.ix===e||"Offset"===e?s.offset:null}var r=Bt(s,i),a=e;return s.propertyIndex=t.ix,a.c.setGroupProperty(Gt("Copies",r)),a.o.setGroupProperty(Gt("Offset",r)),Object.defineProperties(s,{copies:{get:zt(a.c)},offset:{get:zt(a.o)},_name:{value:t.nm}}),s.mn=t.mn,s}return function(e,i,s){var r;function a(t){if("number"==typeof t)return 0===(t=void 0===t?1:t)?s:r[t-1];for(var e=0,i=r.length;e<i;){if(r[e]._name===t)return r[e];e+=1}return null}return a.propertyGroup=Bt(a,(function(){return s})),r=t(e,i,a.propertyGroup),a.numProperties=r.length,a._name="Contents",a}}(),Ht=function(t){var e,i;function s(t){return"ADBE Text Document"===t?s.sourceText:null}return Object.defineProperty(s,"sourceText",{get:function(){t.textProperty.getValue();var s=t.textProperty.currentData.t;return s!==e&&(t.textProperty.currentData.t=e,(i=new String(s)).value=s||new String(s)),i}}),s},Kt=(Vt={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},function(t){return Vt[t]||""});function Jt(t,e,i){this.p=at.getProp(e,t.v,0,0,i)}function Ut(t,e,i){this.p=at.getProp(e,t.v,0,0,i)}function Zt(t,e,i){this.p=at.getProp(e,t.v,1,0,i)}function Qt(t,e,i){this.p=at.getProp(e,t.v,1,0,i)}function $t(t,e,i){this.p=at.getProp(e,t.v,0,0,i)}function te(t,e,i){this.p=at.getProp(e,t.v,0,0,i)}function ee(t,e,i){this.p=at.getProp(e,t.v,0,0,i)}function ie(){this.p={}}function se(t,e){var i,s=t.ef||[];this.effectElements=[];var r,a=s.length;for(i=0;i<a;i+=1)r=new re(s[i],e),this.effectElements.push(r)}function re(t,e){this.init(t,e)}function ae(){}function ne(){}function oe(t){return oe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},oe(t)}a([nt],re),re.prototype.getValue=re.prototype.iterateDynamicProperties,re.prototype.init=function(t,e){var i;this.data=t,this.effectElements=[],this.initDynamicPropertyContainer(e);var s,r=this.data.ef.length,a=this.data.ef;for(i=0;i<r;i+=1){switch(s=null,a[i].ty){case 0:s=new Jt(a[i],e,this);break;case 1:s=new Ut(a[i],e,this);break;case 2:s=new Zt(a[i],e,this);break;case 3:s=new Qt(a[i],e,this);break;case 4:case 7:s=new ee(a[i],e,this);break;case 10:s=new $t(a[i],e,this);break;case 11:s=new te(a[i],e,this);break;case 5:s=new se(a[i],e,this);break;default:s=new ie(a[i],e,this)}s&&this.effectElements.push(s)}},ae.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){this.layerInterface=jt(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var t=qt.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=Wt(this):4===this.data.ty?(this.layerInterface.shapeInterface=Yt(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=Ht(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var t=Kt(this.data.bm);(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,i){this.globalData=e,this.comp=i,this.data=t,this.layerId=I(),this.data.sr||(this.data.sr=1),this.effectsManager=new se(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},ne.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var i,s=this.dynamicProperties.length;for(i=0;i<s;i+=1)(e||this._isParent&&"transform"===this.dynamicProperties[i].propType)&&(this.dynamicProperties[i].getValue(),this.dynamicProperties[i]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}};var he,le=(he=function(t){function e(t){return"Outline"===t?e.outlineInterface():null}return e._name="Outline",e.outlineInterface=function(t){var e="",i=t.getFootageData();function s(t){if(i[t])return e=t,"object"===oe(i=i[t])?s:i;var r=t.indexOf(e);if(-1!==r){var a=parseInt(t.substr(r+e.length),10);return"object"===oe(i=i[a])?s:i}return""}return function(){return e="",i=t.getFootageData(),s}}(t),e},function(t){function e(t){return"Data"===t?e.dataInterface:null}return e._name="Data",e.dataInterface=he(t),e});function pe(t,e,i){this.initFrame(),this.initRenderable(),this.assetData=e.getAssetData(t.refId),this.footageData=e.imageLoader.getAsset(this.assetData),this.initBaseData(t,e,i)}function fe(t,e,i){this.initFrame(),this.initRenderable(),this.assetData=e.getAssetData(t.refId),this.initBaseData(t,e,i),this._isPlaying=!1,this._canPlay=!1;var s=this.globalData.getAssetsPath(this.assetData);this.audio=this.globalData.audioController.createAudio(s),this._currentTime=0,this.globalData.audioController.addAudio(this),this._volumeMultiplier=1,this._volume=1,this._previousVolume=null,this.tm=t.tm?at.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0},this.lv=at.getProp(this,t.au&&t.au.lv?t.au.lv:{k:[100]},1,.01,this)}function ue(){}function ce(){}function me(t,e,i){this.data=t,this.element=e,this.globalData=i,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var r,a,n=this.globalData.defs,o=this.masksProperties?this.masksProperties.length:0;this.viewData=p(o),this.solidPath="";var h,l,f,u,c,m,d=this.masksProperties,g=0,y=[],v=I(),b="clipPath",_="clip-path";for(r=0;r<o;r+=1)if(("a"!==d[r].mode&&"n"!==d[r].mode||d[r].inv||100!==d[r].o.k||d[r].o.x)&&(b="mask",_="mask"),"s"!==d[r].mode&&"i"!==d[r].mode||0!==g?f=null:((f=G("rect")).setAttribute("fill","#ffffff"),f.setAttribute("width",this.element.comp.data.w||0),f.setAttribute("height",this.element.comp.data.h||0),y.push(f)),a=G("path"),"n"===d[r].mode)this.viewData[r]={op:at.getProp(this.element,d[r].o,0,.01,this.element),prop:yt.getShapeProp(this.element,d[r],3),elem:a,lastPath:""},n.appendChild(a);else{var P;if(g+=1,a.setAttribute("fill","s"===d[r].mode?"#000000":"#ffffff"),a.setAttribute("clip-rule","nonzero"),0!==d[r].x.k?(b="mask",_="mask",m=at.getProp(this.element,d[r].x,0,null,this.element),P=I(),(u=G("filter")).setAttribute("id",P),(c=G("feMorphology")).setAttribute("operator","erode"),c.setAttribute("in","SourceGraphic"),c.setAttribute("radius","0"),u.appendChild(c),n.appendChild(u),a.setAttribute("stroke","s"===d[r].mode?"#000000":"#ffffff")):(c=null,m=null),this.storedData[r]={elem:a,x:m,expan:c,lastPath:"",lastOperator:"",filterId:P,lastRadius:0},"i"===d[r].mode){l=y.length;var k=G("g");for(h=0;h<l;h+=1)k.appendChild(y[h]);var A=G("mask");A.setAttribute("mask-type","alpha"),A.setAttribute("id",v+"_"+g),A.appendChild(a),n.appendChild(A),k.setAttribute("mask","url("+s()+"#"+v+"_"+g+")"),y.length=0,y.push(k)}else y.push(a);d[r].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[r]={elem:a,lastPath:"",op:at.getProp(this.element,d[r].o,0,.01,this.element),prop:yt.getShapeProp(this.element,d[r],3),invRect:f},this.viewData[r].prop.k||this.drawPath(d[r],this.viewData[r].prop.v,this.viewData[r])}for(this.maskElement=G(b),o=y.length,r=0;r<o;r+=1)this.maskElement.appendChild(y[r]);g>0&&(this.maskElement.setAttribute("id",v),this.element.maskedElement.setAttribute(_,"url("+s()+"#"+v+")"),n.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}pe.prototype.prepareFrame=function(){},a([Rt,ae,ne],pe),pe.prototype.getBaseElement=function(){return null},pe.prototype.renderFrame=function(){},pe.prototype.destroy=function(){},pe.prototype.initExpressions=function(){this.layerInterface=le(this)},pe.prototype.getFootageData=function(){return this.footageData},fe.prototype.prepareFrame=function(t){if(this.prepareRenderableFrame(t,!0),this.prepareProperties(t,!0),this.tm._placeholder)this._currentTime=t/this.data.sr;else{var e=this.tm.v;this._currentTime=e}this._volume=this.lv.v[0];var i=this._volume*this._volumeMultiplier;this._previousVolume!==i&&(this._previousVolume=i,this.audio.volume(i))},a([Rt,ae,ne],fe),fe.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek())>.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},fe.prototype.show=function(){},fe.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},fe.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},fe.prototype.resume=function(){this._canPlay=!0},fe.prototype.setRate=function(t){this.audio.rate(t)},fe.prototype.volume=function(t){this._volumeMultiplier=t,this._previousVolume=t*this._volume,this.audio.volume(this._previousVolume)},fe.prototype.getBaseElement=function(){return null},fe.prototype.destroy=function(){},fe.prototype.sourceRectAtTime=function(){},fe.prototype.initExpressions=function(){},ue.prototype.checkLayers=function(t){var e,i,s=this.layers.length;for(this.completeLayers=!0,e=s-1;e>=0;e-=1)this.elements[e]||(i=this.layers[e]).ip-i.st<=t-this.layers[e].st&&i.op-i.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},ue.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:default:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 6:return this.createAudio(t);case 13:return this.createCamera(t);case 15:return this.createFootage(t)}},ue.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},ue.prototype.createAudio=function(t){return new fe(t,this.globalData,this)},ue.prototype.createFootage=function(t){return new pe(t,this.globalData,this)},ue.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},ue.prototype.includeLayers=function(t){var e;this.completeLayers=!1;var i,s=t.length,r=this.layers.length;for(e=0;e<s;e+=1)for(i=0;i<r;){if(this.layers[i].id===t[e].id){this.layers[i]=t[e];break}i+=1}},ue.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},ue.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},ue.prototype.buildElementParenting=function(t,e,i){for(var s=this.elements,r=this.layers,a=0,n=r.length;a<n;)r[a].ind==e&&(s[a]&&!0!==s[a]?(i.push(s[a]),s[a].setAsParent(),void 0!==r[a].parent?this.buildElementParenting(t,r[a].parent,i):t.setHierarchy(i)):(this.buildItem(a),this.addPendingElement(t))),a+=1},ue.prototype.addPendingElement=function(t){this.pendingElements.push(t)},ue.prototype.searchExtraCompositions=function(t){var e,i=t.length;for(e=0;e<i;e+=1)if(t[e].xt){var s=this.createComp(t[e]);s.initExpressions(),this.globalData.projectInterface.registerComposition(s)}},ue.prototype.getElementByPath=function(t){var e,i=t.shift();if("number"==typeof i)e=this.elements[i];else{var s,r=this.elements.length;for(s=0;s<r;s+=1)if(this.elements[s].data.nm===i){e=this.elements[s];break}}return 0===t.length?e:e.getElementByPath(t)},ue.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new Lt,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.audioController=this.animationItem.audioController,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}},ce.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?Et.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new vt},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,i=0,s=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;i<s;){if(this.hierarchy[i].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}i+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),i=0;i<s;i+=1)t=this.hierarchy[i].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var i,s=!0,r=this.comp;s;)r.finalTransform?(r.data.hasMask&&e.splice(0,0,r.finalTransform),r=r.comp):s=!1;var a,n=e.length;for(i=0;i<n;i+=1)a=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},mHelper:new vt},me.prototype.getMaskProperty=function(t){return this.viewData[t].prop},me.prototype.renderFrame=function(t){var e,i=this.element.finalTransform.mat,r=this.masksProperties.length;for(e=0;e<r;e+=1)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp._mdf||t)&&this.viewData[e].invRect.setAttribute("transform",i.getInverseMatrix().to2dCSS()),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var a=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+s()+"#"+this.storedData[e].filterId+")")),a.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}},me.prototype.getMaskelement=function(){return this.maskElement},me.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+" "},me.prototype.drawPath=function(t,e,i){var s,r,a=" M"+e.v[0][0]+","+e.v[0][1];for(r=e._length,s=1;s<r;s+=1)a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[s][0]+","+e.i[s][1]+" "+e.v[s][0]+","+e.v[s][1];if(e.c&&r>1&&(a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),i.lastPath!==a){var n="";i.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),i.elem.setAttribute("d",n)),i.lastPath=a}},me.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};var de=function(){var t={};return t.createFilter=function(t,e){var i=G("filter");i.setAttribute("id",t),!0!==e&&(i.setAttribute("filterUnits","objectBoundingBox"),i.setAttribute("x","0%"),i.setAttribute("y","0%"),i.setAttribute("width","100%"),i.setAttribute("height","100%"));return i},t.createAlphaToLuminanceFilter=function(){var t=G("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t},t}(),ge=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),ye={},ve="filter_result_";function be(t){var e,i,r="SourceGraphic",a=t.data.ef?t.data.ef.length:0,n=I(),o=de.createFilter(n,!0),h=0;for(this.filters=[],e=0;e<a;e+=1){i=null;var l=t.data.ef[e].ty;if(ye[l])i=new(0,ye[l].effect)(o,t.effectsManager.effectElements[e],t,ve+h,r),r=ve+h,ye[l].countsAsEffect&&(h+=1);i&&this.filters.push(i)}h&&(t.globalData.defs.appendChild(o),t.layerElement.setAttribute("filter","url("+s()+"#"+n+")")),this.filters.length&&t.addRenderableComponent(this)}function _e(){}function Pe(){}function ke(){}function Ae(t,e,i){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,i),this.sourceRect={top:0,left:0,width:this.assetData.w,height:this.assetData.h}}function xe(t,e){this.elem=t,this.pos=e}function Se(){}be.prototype.renderFrame=function(t){var e,i=this.filters.length;for(e=0;e<i;e+=1)this.filters[e].renderFrame(t)},_e.prototype={initRendererElement:function(){this.layerElement=G("g")},createContainerElements:function(){this.matteElement=G("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t,e,i,r=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var a=G("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),a.appendChild(this.layerElement),r=a,this.globalData.defs.appendChild(a),ge.maskType||1!=this.data.td||(a.setAttribute("mask-type","luminance"),t=I(),e=de.createFilter(t),this.globalData.defs.appendChild(e),e.appendChild(de.createAlphaToLuminanceFilter()),(i=G("g")).appendChild(this.layerElement),r=i,a.appendChild(i),i.setAttribute("filter","url("+s()+"#"+t+")"))}else if(2==this.data.td){var n=G("mask");n.setAttribute("id",this.layerId),n.setAttribute("mask-type","alpha");var o=G("g");n.appendChild(o),t=I(),e=de.createFilter(t);var h=G("feComponentTransfer");h.setAttribute("in","SourceGraphic"),e.appendChild(h);var l=G("feFuncA");l.setAttribute("type","table"),l.setAttribute("tableValues","1.0 0.0"),h.appendChild(l),this.globalData.defs.appendChild(e);var p=G("rect");p.setAttribute("width",this.comp.data.w),p.setAttribute("height",this.comp.data.h),p.setAttribute("x","0"),p.setAttribute("y","0"),p.setAttribute("fill","#ffffff"),p.setAttribute("opacity","0"),o.setAttribute("filter","url("+s()+"#"+t+")"),o.appendChild(p),o.appendChild(this.layerElement),r=o,ge.maskType||(n.setAttribute("mask-type","luminance"),e.appendChild(de.createAlphaToLuminanceFilter()),i=G("g"),o.appendChild(p),i.appendChild(this.layerElement),r=i,o.appendChild(i)),this.globalData.defs.appendChild(n)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),r=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var f=G("clipPath"),u=G("path");u.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var c=I();if(f.setAttribute("id",c),f.appendChild(u),this.globalData.defs.appendChild(f),this.checkMasks()){var m=G("g");m.setAttribute("clip-path","url("+s()+"#"+c+")"),m.appendChild(this.layerElement),this.transformedElement=m,r?r.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+s()+"#"+c+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new me(this.data,this,this.globalData),this.renderableEffectsManager=new be(this)},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+s()+"#"+t+")")}},Pe.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},a([Rt,o({initElement:function(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initTransform(t,e,i),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],ke),a([ae,ce,_e,Pe,ne,ke],Ae),Ae.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=G("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},Ae.prototype.sourceRectAtTime=function(){return this.sourceRect},Se.prototype={addShapeToModifiers:function(t){var e,i=this.shapeModifiers.length;for(e=0;e<i;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;t>=0&&!this.shapeModifiers[t].processShapes(this._isFirstFrame);t-=1);}},searchProcessedElement:function(t){for(var e=this.processedElements,i=0,s=e.length;i<s;){if(e[i].elem===t)return e[i].pos;i+=1}return 0},addProcessedElement:function(t,e){for(var i=this.processedElements,s=i.length;s;)if(i[s-=1].elem===t)return void(i[s].pos=e);i.push(new xe(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}};var De={1:"butt",2:"round",3:"square"},we={1:"miter",2:"round",3:"bevel"};function Ce(t,e,i){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=i,this.lvl=e,this._isAnimated=!!i.k;for(var s=0,r=t.length;s<r;){if(t[s].mProps.dynamicProperties.length){this._isAnimated=!0;break}s+=1}}function Te(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this._mdf=!1,this.closed=!0===t.hd,this.pElem=G("path"),this.msElem=null}function Ee(t,e,i,s){var r;this.elem=t,this.frameId=-1,this.dataProps=p(e.length),this.renderer=i,this.k=!1,this.dashStr="",this.dashArray=l("float32",e.length?e.length-1:0),this.dashoffset=l("float32",1),this.initDynamicPropertyContainer(s);var a,n=e.length||0;for(r=0;r<n;r+=1)a=at.getProp(t,e[r].v,0,0,this),this.k=a.k||this.k,this.dataProps[r]={n:e[r].n,p:a};this.k||this.getValue(!0),this._isAnimated=this.k}function Fe(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=at.getProp(t,e.o,0,.01,this),this.w=at.getProp(t,e.w,0,null,this),this.d=new Ee(t,e.d||{},"svg",this),this.c=at.getProp(t,e.c,1,255,this),this.style=i,this._isAnimated=!!this._isAnimated}function Me(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=at.getProp(t,e.o,0,.01,this),this.c=at.getProp(t,e.c,1,255,this),this.style=i}function Ie(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.style=i}function Le(t,e,i){this.data=e,this.c=l("uint8c",4*e.p);var s=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=l("float32",s),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=s,this.initDynamicPropertyContainer(i),this.prop=at.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}function Re(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.initGradientData(t,e,i)}function Ve(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.w=at.getProp(t,e.w,0,null,this),this.d=new Ee(t,e.d||{},"svg",this),this.initGradientData(t,e,i),this._isAnimated=!!this._isAnimated}function Oe(){this.it=[],this.prevViewData=[],this.gr=G("g")}function ze(t,e,i){this.transform={mProps:t,op:e,container:i},this.elements=[],this._isAnimated=this.transform.mProps.dynamicProperties.length||this.transform.op.effectsSequence.length}Ce.prototype.setAsAnimated=function(){this._isAnimated=!0},Te.prototype.reset=function(){this.d="",this._mdf=!1},Ee.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,i=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<i;e+=1)"o"!==this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},a([nt],Ee),a([nt],Fe),a([nt],Me),a([nt],Ie),Le.prototype.comparePoints=function(t,e){for(var i=0,s=this.o.length/2;i<s;){if(Math.abs(t[4*i]-t[4*e+2*i])>.01)return!1;i+=1}return!0},Le.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},Le.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,i,s,r=4*this.data.p;for(e=0;e<r;e+=1)i=e%4==0?100:255,s=Math.round(this.prop.v[e]*i),this.c[e]!==s&&(this.c[e]=s,this._cmdf=!t);if(this.o.length)for(r=this.prop.v.length,e=4*this.data.p;e<r;e+=1)i=e%2==0?100:1,s=e%2==0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==s&&(this.o[e-4*this.data.p]=s,this._omdf=!t);this._mdf=!t}},a([nt],Le),Re.prototype.initGradientData=function(t,e,i){this.o=at.getProp(t,e.o,0,.01,this),this.s=at.getProp(t,e.s,1,null,this),this.e=at.getProp(t,e.e,1,null,this),this.h=at.getProp(t,e.h||{k:0},0,.01,this),this.a=at.getProp(t,e.a||{k:0},0,k,this),this.g=new Le(t,e.g,this),this.style=i,this.stops=[],this.setGradientData(i.pElem,e),this.setGradientOpacity(e,i),this._isAnimated=!!this._isAnimated},Re.prototype.setGradientData=function(t,e){var i=I(),r=G(1===e.t?"linearGradient":"radialGradient");r.setAttribute("id",i),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse");var a,n,o,h=[];for(o=4*e.g.p,n=0;n<o;n+=4)a=G("stop"),r.appendChild(a),h.push(a);t.setAttribute("gf"===e.ty?"fill":"stroke","url("+s()+"#"+i+")"),this.gf=r,this.cst=h},Re.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var i,r,a,n=G("mask"),o=G("path");n.appendChild(o);var h=I(),l=I();n.setAttribute("id",l);var p=G(1===t.t?"linearGradient":"radialGradient");p.setAttribute("id",h),p.setAttribute("spreadMethod","pad"),p.setAttribute("gradientUnits","userSpaceOnUse"),a=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=this.stops;for(r=4*t.g.p;r<a;r+=2)(i=G("stop")).setAttribute("stop-color","rgb(255,255,255)"),p.appendChild(i),f.push(i);o.setAttribute("gf"===t.ty?"fill":"stroke","url("+s()+"#"+h+")"),"gs"===t.ty&&(o.setAttribute("stroke-linecap",De[t.lc||2]),o.setAttribute("stroke-linejoin",we[t.lj||2]),1===t.lj&&o.setAttribute("stroke-miterlimit",t.ml)),this.of=p,this.ms=n,this.ost=f,this.maskId=l,e.msElem=o}},a([nt],Re),a([Re,nt],Ve);var Ne=function(t,e,i,s){if(0===e)return"";var r,a=t.o,n=t.i,o=t.v,h=" M"+s.applyToPointStringified(o[0][0],o[0][1]);for(r=1;r<e;r+=1)h+=" C"+s.applyToPointStringified(a[r-1][0],a[r-1][1])+" "+s.applyToPointStringified(n[r][0],n[r][1])+" "+s.applyToPointStringified(o[r][0],o[r][1]);return i&&e&&(h+=" C"+s.applyToPointStringified(a[r-1][0],a[r-1][1])+" "+s.applyToPointStringified(n[0][0],n[0][1])+" "+s.applyToPointStringified(o[0][0],o[0][1]),h+="z"),h},je=function(){var t=new vt,e=new vt;function i(t,e,i){(i||e.transform.op._mdf)&&e.transform.container.setAttribute("opacity",e.transform.op.v),(i||e.transform.mProps._mdf)&&e.transform.container.setAttribute("transform",e.transform.mProps.v.to2dCSS())}function s(){}function r(i,s,r){var a,n,o,h,l,p,f,u,c,m,d,g=s.styles.length,y=s.lvl;for(p=0;p<g;p+=1){if(h=s.sh._mdf||r,s.styles[p].lvl<y){for(u=e.reset(),m=y-s.styles[p].lvl,d=s.transformers.length-1;!h&&m>0;)h=s.transformers[d].mProps._mdf||h,m-=1,d-=1;if(h)for(m=y-s.styles[p].lvl,d=s.transformers.length-1;m>0;)c=s.transformers[d].mProps.v.props,u.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),m-=1,d-=1}else u=t;if(n=(f=s.sh.paths)._length,h){for(o="",a=0;a<n;a+=1)(l=f.shapes[a])&&l._length&&(o+=Ne(l,l._length,l.c,u));s.caches[p]=o}else o=s.caches[p];s.styles[p].d+=!0===i.hd?"":o,s.styles[p]._mdf=h||s.styles[p]._mdf}}function a(t,e,i){var s=e.style;(e.c._mdf||i)&&s.pElem.setAttribute("fill","rgb("+v(e.c.v[0])+","+v(e.c.v[1])+","+v(e.c.v[2])+")"),(e.o._mdf||i)&&s.pElem.setAttribute("fill-opacity",e.o.v)}function n(t,e,i){o(t,e,i),h(t,e,i)}function o(t,e,i){var s,r,a,n,o,h=e.gf,l=e.g._hasOpacity,p=e.s.v,f=e.e.v;if(e.o._mdf||i){var u="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(u,e.o.v)}if(e.s._mdf||i){var c=1===t.t?"x1":"cx",m="x1"===c?"y1":"cy";h.setAttribute(c,p[0]),h.setAttribute(m,p[1]),l&&!e.g._collapsable&&(e.of.setAttribute(c,p[0]),e.of.setAttribute(m,p[1]))}if(e.g._cmdf||i){s=e.cst;var d=e.g.c;for(a=s.length,r=0;r<a;r+=1)(n=s[r]).setAttribute("offset",d[4*r]+"%"),n.setAttribute("stop-color","rgb("+d[4*r+1]+","+d[4*r+2]+","+d[4*r+3]+")")}if(l&&(e.g._omdf||i)){var g=e.g.o;for(a=(s=e.g._collapsable?e.cst:e.ost).length,r=0;r<a;r+=1)n=s[r],e.g._collapsable||n.setAttribute("offset",g[2*r]+"%"),n.setAttribute("stop-opacity",g[2*r+1])}if(1===t.t)(e.e._mdf||i)&&(h.setAttribute("x2",f[0]),h.setAttribute("y2",f[1]),l&&!e.g._collapsable&&(e.of.setAttribute("x2",f[0]),e.of.setAttribute("y2",f[1])));else if((e.s._mdf||e.e._mdf||i)&&(o=Math.sqrt(Math.pow(p[0]-f[0],2)+Math.pow(p[1]-f[1],2)),h.setAttribute("r",o),l&&!e.g._collapsable&&e.of.setAttribute("r",o)),e.e._mdf||e.h._mdf||e.a._mdf||i){o||(o=Math.sqrt(Math.pow(p[0]-f[0],2)+Math.pow(p[1]-f[1],2)));var y=Math.atan2(f[1]-p[1],f[0]-p[0]),v=e.h.v;v>=1?v=.99:v<=-1&&(v=-.99);var b=o*v,_=Math.cos(y+e.a.v)*b+p[0],P=Math.sin(y+e.a.v)*b+p[1];h.setAttribute("fx",_),h.setAttribute("fy",P),l&&!e.g._collapsable&&(e.of.setAttribute("fx",_),e.of.setAttribute("fy",P))}}function h(t,e,i){var s=e.style,r=e.d;r&&(r._mdf||i)&&r.dashStr&&(s.pElem.setAttribute("stroke-dasharray",r.dashStr),s.pElem.setAttribute("stroke-dashoffset",r.dashoffset[0])),e.c&&(e.c._mdf||i)&&s.pElem.setAttribute("stroke","rgb("+v(e.c.v[0])+","+v(e.c.v[1])+","+v(e.c.v[2])+")"),(e.o._mdf||i)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w._mdf||i)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))}return{createRenderFunction:function(t){switch(t.ty){case"fl":return a;case"gf":return o;case"gs":return n;case"st":return h;case"sh":case"el":case"rc":case"sr":return r;case"tr":return i;case"no":return s;default:return null}}}}();function Be(t,e,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,i),this.prevViewData=[]}function Ge(t,e,i,s,r,a){this.o=t,this.sw=e,this.sc=i,this.fc=s,this.m=r,this.p=a,this._mdf={o:!0,sw:!!e,sc:!!i,fc:!!s,m:!0,p:!0}}function qe(t,e){this._frameId=i,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}a([ae,ce,_e,Se,Pe,ne,ke],Be),Be.prototype.initSecondaryElement=function(){},Be.prototype.identityMatrix=new vt,Be.prototype.buildExpressionInterface=function(){},Be.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},Be.prototype.filterUniqueShapes=function(){var t,e,i,s,r=this.shapes.length,a=this.stylesList.length,n=[],o=!1;for(i=0;i<a;i+=1){for(s=this.stylesList[i],o=!1,n.length=0,t=0;t<r;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(s)&&(n.push(e),o=e._isAnimated||o);n.length>1&&o&&this.setShapesAsAnimated(n)}},Be.prototype.setShapesAsAnimated=function(t){var e,i=t.length;for(e=0;e<i;e+=1)t[e].setAsAnimated()},Be.prototype.createStyleElement=function(t,e){var i,r=new Te(t,e),a=r.pElem;if("st"===t.ty)i=new Fe(this,t,r);else if("fl"===t.ty)i=new Me(this,t,r);else if("gf"===t.ty||"gs"===t.ty){i=new("gf"===t.ty?Re:Ve)(this,t,r),this.globalData.defs.appendChild(i.gf),i.maskId&&(this.globalData.defs.appendChild(i.ms),this.globalData.defs.appendChild(i.of),a.setAttribute("mask","url("+s()+"#"+i.maskId+")"))}else"no"===t.ty&&(i=new Ie(this,t,r));return"st"!==t.ty&&"gs"!==t.ty||(a.setAttribute("stroke-linecap",De[t.lc||2]),a.setAttribute("stroke-linejoin",we[t.lj||2]),a.setAttribute("fill-opacity","0"),1===t.lj&&a.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&a.setAttribute("fill-rule","evenodd"),t.ln&&a.setAttribute("id",t.ln),t.cl&&a.setAttribute("class",t.cl),t.bm&&(a.style["mix-blend-mode"]=Kt(t.bm)),this.stylesList.push(r),this.addToAnimatedContents(t,i),i},Be.prototype.createGroupElement=function(t){var e=new Oe;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),t.bm&&(e.gr.style["mix-blend-mode"]=Kt(t.bm)),e},Be.prototype.createTransformElement=function(t,e){var i=Et.getTransformProperty(this,t,this),s=new ze(i,i.o,e);return this.addToAnimatedContents(t,s),s},Be.prototype.createShapeElement=function(t,e,i){var s=4;"rc"===t.ty?s=5:"el"===t.ty?s=6:"sr"===t.ty&&(s=7);var r=new Ce(e,i,yt.getShapeProp(this,t,s,this));return this.shapes.push(r),this.addShapeToModifiers(r),this.addToAnimatedContents(t,r),r},Be.prototype.addToAnimatedContents=function(t,e){for(var i=0,s=this.animatedContents.length;i<s;){if(this.animatedContents[i].element===e)return;i+=1}this.animatedContents.push({fn:je.createRenderFunction(t),element:e,data:t})},Be.prototype.setElementStyles=function(t){var e,i=t.styles,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||i.push(this.stylesList[e])},Be.prototype.reloadShapes=function(){var t;this._isFirstFrame=!0;var e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},Be.prototype.searchShapes=function(t,e,i,s,r,a,n){var o,h,l,p,f,u,c=[].concat(a),m=t.length-1,d=[],g=[];for(o=m;o>=0;o-=1){if((u=this.searchProcessedElement(t[o]))?e[o]=i[u-1]:t[o]._render=n,"fl"===t[o].ty||"st"===t[o].ty||"gf"===t[o].ty||"gs"===t[o].ty||"no"===t[o].ty)u?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],r),t[o]._render&&e[o].style.pElem.parentNode!==s&&s.appendChild(e[o].style.pElem),d.push(e[o].style);else if("gr"===t[o].ty){if(u)for(l=e[o].it.length,h=0;h<l;h+=1)e[o].prevViewData[h]=e[o].it[h];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,r+1,c,n),t[o]._render&&e[o].gr.parentNode!==s&&s.appendChild(e[o].gr)}else"tr"===t[o].ty?(u||(e[o]=this.createTransformElement(t[o],s)),p=e[o].transform,c.push(p)):"sh"===t[o].ty||"rc"===t[o].ty||"el"===t[o].ty||"sr"===t[o].ty?(u||(e[o]=this.createShapeElement(t[o],c,r)),this.setElementStyles(e[o])):"tm"===t[o].ty||"rd"===t[o].ty||"ms"===t[o].ty||"pb"===t[o].ty?(u?(f=e[o]).closed=!1:((f=Dt.getModifier(t[o].ty)).init(this,t[o]),e[o]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"===t[o].ty&&(u?(f=e[o]).closed=!0:(f=Dt.getModifier(t[o].ty),e[o]=f,f.init(this,t,o,e),this.shapeModifiers.push(f),n=!1),g.push(f));this.addProcessedElement(t[o],o+1)}for(m=d.length,o=0;o<m;o+=1)d[o].closed=!0;for(m=g.length,o=0;o<m;o+=1)g[o].closed=!0},Be.prototype.renderInnerContent=function(){var t;this.renderModifiers();var e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},Be.prototype.renderShape=function(){var t,e,i=this.animatedContents.length;for(t=0;t<i;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},Be.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},Ge.prototype.update=function(t,e,i,s,r,a){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1,this._mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this._mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this._mdf.sw=!0,n=!0),this.sc!==i&&(this.sc=i,this._mdf.sc=!0,n=!0),this.fc!==s&&(this.fc=s,this._mdf.fc=!0,n=!0),this.m!==r&&(this.m=r,this._mdf.m=!0,n=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,this._mdf.p=!0,n=!0),n},qe.prototype.defaultBoxWidth=[0,0],qe.prototype.copyData=function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},qe.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},qe.prototype.searchProperty=function(){return this.searchKeyframes()},qe.prototype.searchKeyframes=function(){return this.kf=this.data.d.k.length>1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},qe.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},qe.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,i=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{var s;this.lock=!0,this._mdf=!1;var r=this.effectsSequence.length,a=t||this.data.d.k[this.keysIndex].s;for(s=0;s<r;s+=1)a=i!==this.keysIndex?this.effectsSequence[s](a,a.t):this.effectsSequence[s](this.currentData,a.t);e!==a&&this.setCurrentData(a),this.v=this.currentData,this.pv=this.v,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},qe.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,i=0,s=t.length;i<=s-1&&!(i===s-1||t[i+1].t>e);)i+=1;return this.keysIndex!==i&&(this.keysIndex=i),this.data.d.k[this.keysIndex].s},qe.prototype.buildFinalText=function(t){for(var e,i,s=[],r=0,a=t.length,n=!1;r<a;)e=t.charCodeAt(r),Lt.isCombinedCharacter(e)?s[s.length-1]+=t.charAt(r):e>=55296&&e<=56319?(i=t.charCodeAt(r+1))>=56320&&i<=57343?(n||Lt.isModifier(e,i)?(s[s.length-1]+=t.substr(r,2),n=!1):s.push(t.substr(r,2)),r+=1):s.push(t.charAt(r)):e>56319?(i=t.charCodeAt(r+1),Lt.isZeroWidthJoiner(e,i)?(n=!0,s[s.length-1]+=t.substr(r,2),r+=1):s.push(t.charAt(r))):Lt.isZeroWidthJoiner(e)?(s[s.length-1]+=t.charAt(r),n=!0):s.push(t.charAt(r)),r+=1;return s},qe.prototype.completeTextData=function(t){t.__complete=!0;var e,i,s,r,a,n,o,h=this.elem.globalData.fontManager,l=this.data,p=[],f=0,u=l.m.g,c=0,m=0,d=0,g=[],y=0,v=0,b=h.getFontByName(t.f),_=0,P=It(b);t.fWeight=P.weight,t.fStyle=P.style,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),i=t.finalText.length,t.finalLineHeight=t.lh;var k,A=t.tr/1e3*t.finalSize;if(t.sz)for(var x,S,D=!0,w=t.sz[0],C=t.sz[1];D;){x=0,y=0,i=(S=this.buildFinalText(t.t)).length,A=t.tr/1e3*t.finalSize;var T=-1;for(e=0;e<i;e+=1)k=S[e].charCodeAt(0),s=!1," "===S[e]?T=e:13!==k&&3!==k||(y=0,s=!0,x+=t.finalLineHeight||1.2*t.finalSize),h.chars?(o=h.getCharData(S[e],b.fStyle,b.fFamily),_=s?0:o.w*t.finalSize/100):_=h.measureText(S[e],t.f,t.finalSize),y+_>w&&" "!==S[e]?(-1===T?i+=1:e=T,x+=t.finalLineHeight||1.2*t.finalSize,S.splice(e,T===e?1:0,"\r"),T=-1,y=0):(y+=_,y+=A);x+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&C<x?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=S,i=t.finalText.length,D=!1)}y=-A,_=0;var E,F=0;for(e=0;e<i;e+=1)if(s=!1,13===(k=(E=t.finalText[e]).charCodeAt(0))||3===k?(F=0,g.push(y),v=y>v?y:v,y=-2*A,r="",s=!0,d+=1):r=E,h.chars?(o=h.getCharData(E,b.fStyle,h.getFontByName(t.f).fFamily),_=s?0:o.w*t.finalSize/100):_=h.measureText(r,t.f,t.finalSize)," "===E?F+=_+A:(y+=_+A+F,F=0),p.push({l:_,an:_,add:c,n:s,anIndexes:[],val:r,line:d,animatorJustifyOffset:0}),2==u){if(c+=_,""===r||" "===r||e===i-1){for(""!==r&&" "!==r||(c-=_);m<=e;)p[m].an=c,p[m].ind=f,p[m].extra=_,m+=1;f+=1,c=0}}else if(3==u){if(c+=_,""===r||e===i-1){for(""===r&&(c-=_);m<=e;)p[m].an=c,p[m].ind=f,p[m].extra=_,m+=1;c=0,f+=1}}else p[f].ind=f,p[f].extra=0,f+=1;if(t.l=p,v=y>v?y:v,g.push(y),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=g;var M,I,L,R,V=l.a;n=V.length;var O=[];for(a=0;a<n;a+=1){for((M=V[a]).a.sc&&(t.strokeColorAnim=!0),M.a.sw&&(t.strokeWidthAnim=!0),(M.a.fc||M.a.fh||M.a.fs||M.a.fb)&&(t.fillColorAnim=!0),R=0,L=M.s.b,e=0;e<i;e+=1)(I=p[e]).anIndexes[a]=R,(1==L&&""!==I.val||2==L&&""!==I.val&&" "!==I.val||3==L&&(I.n||" "==I.val||e==i-1)||4==L&&(I.n||e==i-1))&&(1===M.s.rn&&O.push(R),R+=1);l.a[a].s.totalChars=R;var z,N=-1;if(1===M.s.rn)for(e=0;e<i;e+=1)N!=(I=p[e]).anIndexes[a]&&(N=I.anIndexes[a],z=O.splice(Math.floor(Math.random()*O.length),1)[0]),I.anIndexes[a]=z}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=b.ascent*t.finalSize/100},qe.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var i=this.copyData({},this.data.d.k[e].s);i=this.copyData(i,t),this.data.d.k[e].s=i,this.recalculate(e),this.elem.addDynamicProperty(this)},qe.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},qe.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},qe.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var We=function(){var t=Math.max,e=Math.min,i=Math.floor;function s(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=at.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?at.getProp(t,e.e,0,0,this):{v:100},this.o=at.getProp(t,e.o||{k:0},0,0,this),this.xe=at.getProp(t,e.xe||{k:0},0,0,this),this.ne=at.getProp(t,e.ne||{k:0},0,0,this),this.sm=at.getProp(t,e.sm||{k:100},0,0,this),this.a=at.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}return s.prototype={getMult:function(s){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var r=0,a=0,n=1,o=1;this.ne.v>0?r=this.ne.v/100:a=-this.ne.v/100,this.xe.v>0?n=1-this.xe.v/100:o=1+this.xe.v/100;var h=$.getBezierEasing(r,a,n,o).get,l=0,p=this.finalS,f=this.finalE,u=this.data.sh;if(2===u)l=h(l=f===p?s>=f?1:0:t(0,e(.5/(f-p)+(s-p)/(f-p),1)));else if(3===u)l=h(l=f===p?s>=f?0:1:1-t(0,e(.5/(f-p)+(s-p)/(f-p),1)));else if(4===u)f===p?l=0:(l=t(0,e(.5/(f-p)+(s-p)/(f-p),1)))<.5?l*=2:l=1-2*(l-.5),l=h(l);else if(5===u){if(f===p)l=0;else{var c=f-p,m=-c/2+(s=e(t(0,s+.5-p),f-p)),d=c/2;l=Math.sqrt(1-m*m/(d*d))}l=h(l)}else 6===u?(f===p?l=0:(s=e(t(0,s+.5-p),f-p),l=(1+Math.cos(Math.PI+2*Math.PI*s/(f-p)))/2),l=h(l)):(s>=i(p)&&(l=t(0,e(s-p<0?e(f,1)-(p-s):f-s,1))),l=h(l));if(100!==this.sm.v){var g=.01*this.sm.v;0===g&&(g=1e-8);var y=.5-.5*g;l<y?l=0:(l=(l-y)/g)>1&&(l=1)}return l*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,i=this.o.v/e,s=this.s.v/e+i,r=this.e.v/e+i;if(s>r){var a=s;s=r,r=a}this.finalS=s,this.finalE=r}},a([nt],s),{getTextSelectorProp:function(t,e,i){return new s(t,e,i)}}}();function Xe(t,e,i){var s={propType:!1},r=at.getProp,a=e.a;this.a={r:a.r?r(t,a.r,0,k,i):s,rx:a.rx?r(t,a.rx,0,k,i):s,ry:a.ry?r(t,a.ry,0,k,i):s,sk:a.sk?r(t,a.sk,0,k,i):s,sa:a.sa?r(t,a.sa,0,k,i):s,s:a.s?r(t,a.s,1,.01,i):s,a:a.a?r(t,a.a,1,0,i):s,o:a.o?r(t,a.o,0,.01,i):s,p:a.p?r(t,a.p,1,0,i):s,sw:a.sw?r(t,a.sw,0,0,i):s,sc:a.sc?r(t,a.sc,1,0,i):s,fc:a.fc?r(t,a.fc,1,0,i):s,fh:a.fh?r(t,a.fh,0,0,i):s,fs:a.fs?r(t,a.fs,0,.01,i):s,fb:a.fb?r(t,a.fb,0,.01,i):s,t:a.t?r(t,a.t,0,0,i):s},this.s=We.getTextSelectorProp(t,e.s,i),this.s.t=e.s.t}function Ye(t,e,i){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=i,this._animatorsData=p(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(i)}function He(){}Ye.prototype.searchProperties=function(){var t,e,i=this._textData.a.length,s=at.getProp;for(t=0;t<i;t+=1)e=this._textData.a[t],this._animatorsData[t]=new Xe(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={a:s(this._elem,this._textData.p.a,0,0,this),f:s(this._elem,this._textData.p.f,0,0,this),l:s(this._elem,this._textData.p.l,0,0,this),r:s(this._elem,this._textData.p.r,0,0,this),p:s(this._elem,this._textData.p.p,0,0,this),m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=s(this._elem,this._textData.m.a,1,0,this)},Ye.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var i,s,r,a,n,o,h,l,p,f,u,c,m,d,g,y,v,b,_,P=this._moreOptions.alignment.v,k=this._animatorsData,A=this._textData,x=this.mHelper,S=this._renderType,D=this.renderedLetters.length,w=t.l;if(this._hasMaskedPath){if(_=this._pathData.m,!this._pathData.n||this._pathData._mdf){var C,T=_.v;for(this._pathData.r.v&&(T=T.reverse()),n={tLength:0,segments:[]},a=T._length-1,y=0,r=0;r<a;r+=1)C=rt.buildBezierData(T.v[r],T.v[r+1],[T.o[r][0]-T.v[r][0],T.o[r][1]-T.v[r][1]],[T.i[r+1][0]-T.v[r+1][0],T.i[r+1][1]-T.v[r+1][1]]),n.tLength+=C.segmentLength,n.segments.push(C),y+=C.segmentLength;r=a,_.v.c&&(C=rt.buildBezierData(T.v[r],T.v[0],[T.o[r][0]-T.v[r][0],T.o[r][1]-T.v[r][1]],[T.i[0][0]-T.v[0][0],T.i[0][1]-T.v[0][1]]),n.tLength+=C.segmentLength,n.segments.push(C),y+=C.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,o=this._pathData.f.v,u=0,f=1,l=0,p=!0,d=n.segments,o<0&&_.v.c)for(n.tLength<Math.abs(o)&&(o=-Math.abs(o)%n.tLength),f=(m=d[u=d.length-1].points).length-1;o<0;)o+=m[f].partialLength,(f-=1)<0&&(f=(m=d[u-=1].points).length-1);c=(m=d[u].points)[f-1],g=(h=m[f]).partialLength}a=w.length,i=0,s=0;var E,F,M,I,L,R=1.2*t.finalSize*.714,N=!0;M=k.length;var j,B,G,q,W,X,Y,H,K,J,U,Z,Q=-1,$=o,tt=u,et=f,it=-1,st="",at=this.defaultPropsArray;if(2===t.j||1===t.j){var nt=0,ot=0,ht=2===t.j?-.5:-1,lt=0,pt=!0;for(r=0;r<a;r+=1)if(w[r].n){for(nt&&(nt+=ot);lt<r;)w[lt].animatorJustifyOffset=nt,lt+=1;nt=0,pt=!0}else{for(F=0;F<M;F+=1)(E=k[F].a).t.propType&&(pt&&2===t.j&&(ot+=E.t.v*ht),(L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars)).length?nt+=E.t.v*L[0]*ht:nt+=E.t.v*L*ht);pt=!1}for(nt&&(nt+=ot);lt<r;)w[lt].animatorJustifyOffset=nt,lt+=1}for(r=0;r<a;r+=1){if(x.reset(),q=1,w[r].n)i=0,s+=t.yOffset,s+=N?1:0,o=$,N=!1,this._hasMaskedPath&&(f=et,c=(m=d[u=tt].points)[f-1],g=(h=m[f]).partialLength,l=0),st="",U="",K="",Z="",at=this.defaultPropsArray;else{if(this._hasMaskedPath){if(it!==w[r].line){switch(t.j){case 1:o+=y-t.lineWidths[w[r].line];break;case 2:o+=(y-t.lineWidths[w[r].line])/2}it=w[r].line}Q!==w[r].ind&&(w[Q]&&(o+=w[Q].extra),o+=w[r].an/2,Q=w[r].ind),o+=P[0]*w[r].an*.005;var ft=0;for(F=0;F<M;F+=1)(E=k[F].a).p.propType&&((L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars)).length?ft+=E.p.v[0]*L[0]:ft+=E.p.v[0]*L),E.a.propType&&((L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars)).length?ft+=E.a.v[0]*L[0]:ft+=E.a.v[0]*L);for(p=!0,this._pathData.a.v&&(o=.5*w[0].an+(y-this._pathData.f.v-.5*w[0].an-.5*w[w.length-1].an)*Q/(a-1),o+=this._pathData.f.v);p;)l+g>=o+ft||!m?(v=(o+ft-l)/h.partialLength,B=c.point[0]+(h.point[0]-c.point[0])*v,G=c.point[1]+(h.point[1]-c.point[1])*v,x.translate(-P[0]*w[r].an*.005,-P[1]*R*.01),p=!1):m&&(l+=h.partialLength,(f+=1)>=m.length&&(f=0,d[u+=1]?m=d[u].points:_.v.c?(f=0,m=d[u=0].points):(l-=h.partialLength,m=null)),m&&(c=h,g=(h=m[f]).partialLength));j=w[r].an/2-w[r].add,x.translate(-j,0,0)}else j=w[r].an/2-w[r].add,x.translate(-j,0,0),x.translate(-P[0]*w[r].an*.005,-P[1]*R*.01,0);for(F=0;F<M;F+=1)(E=k[F].a).t.propType&&(L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars),0===i&&0===t.j||(this._hasMaskedPath?L.length?o+=E.t.v*L[0]:o+=E.t.v*L:L.length?i+=E.t.v*L[0]:i+=E.t.v*L));for(t.strokeWidthAnim&&(X=t.sw||0),t.strokeColorAnim&&(W=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(Y=[t.fc[0],t.fc[1],t.fc[2]]),F=0;F<M;F+=1)(E=k[F].a).a.propType&&((L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars)).length?x.translate(-E.a.v[0]*L[0],-E.a.v[1]*L[1],E.a.v[2]*L[2]):x.translate(-E.a.v[0]*L,-E.a.v[1]*L,E.a.v[2]*L));for(F=0;F<M;F+=1)(E=k[F].a).s.propType&&((L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars)).length?x.scale(1+(E.s.v[0]-1)*L[0],1+(E.s.v[1]-1)*L[1],1):x.scale(1+(E.s.v[0]-1)*L,1+(E.s.v[1]-1)*L,1));for(F=0;F<M;F+=1){if(E=k[F].a,L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars),E.sk.propType&&(L.length?x.skewFromAxis(-E.sk.v*L[0],E.sa.v*L[1]):x.skewFromAxis(-E.sk.v*L,E.sa.v*L)),E.r.propType&&(L.length?x.rotateZ(-E.r.v*L[2]):x.rotateZ(-E.r.v*L)),E.ry.propType&&(L.length?x.rotateY(E.ry.v*L[1]):x.rotateY(E.ry.v*L)),E.rx.propType&&(L.length?x.rotateX(E.rx.v*L[0]):x.rotateX(E.rx.v*L)),E.o.propType&&(L.length?q+=(E.o.v*L[0]-q)*L[0]:q+=(E.o.v*L-q)*L),t.strokeWidthAnim&&E.sw.propType&&(L.length?X+=E.sw.v*L[0]:X+=E.sw.v*L),t.strokeColorAnim&&E.sc.propType)for(H=0;H<3;H+=1)L.length?W[H]+=(E.sc.v[H]-W[H])*L[0]:W[H]+=(E.sc.v[H]-W[H])*L;if(t.fillColorAnim&&t.fc){if(E.fc.propType)for(H=0;H<3;H+=1)L.length?Y[H]+=(E.fc.v[H]-Y[H])*L[0]:Y[H]+=(E.fc.v[H]-Y[H])*L;E.fh.propType&&(Y=L.length?z(Y,E.fh.v*L[0]):z(Y,E.fh.v*L)),E.fs.propType&&(Y=L.length?V(Y,E.fs.v*L[0]):V(Y,E.fs.v*L)),E.fb.propType&&(Y=L.length?O(Y,E.fb.v*L[0]):O(Y,E.fb.v*L))}}for(F=0;F<M;F+=1)(E=k[F].a).p.propType&&(L=k[F].s.getMult(w[r].anIndexes[F],A.a[F].s.totalChars),this._hasMaskedPath?L.length?x.translate(0,E.p.v[1]*L[0],-E.p.v[2]*L[1]):x.translate(0,E.p.v[1]*L,-E.p.v[2]*L):L.length?x.translate(E.p.v[0]*L[0],E.p.v[1]*L[1],-E.p.v[2]*L[2]):x.translate(E.p.v[0]*L,E.p.v[1]*L,-E.p.v[2]*L));if(t.strokeWidthAnim&&(K=X<0?0:X),t.strokeColorAnim&&(J="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),t.fillColorAnim&&t.fc&&(U="rgb("+Math.round(255*Y[0])+","+Math.round(255*Y[1])+","+Math.round(255*Y[2])+")"),this._hasMaskedPath){if(x.translate(0,-t.ls),x.translate(0,P[1]*R*.01+s,0),this._pathData.p.v){b=(h.point[1]-c.point[1])/(h.point[0]-c.point[0]);var ut=180*Math.atan(b)/Math.PI;h.point[0]<c.point[0]&&(ut+=180),x.rotate(-ut*Math.PI/180)}x.translate(B,G,0),o-=P[0]*w[r].an*.005,w[r+1]&&Q!==w[r+1].ind&&(o+=w[r].an/2,o+=.001*t.tr*t.finalSize)}else{switch(x.translate(i,s,0),t.ps&&x.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:x.translate(w[r].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[w[r].line]),0,0);break;case 2:x.translate(w[r].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[w[r].line])/2,0,0)}x.translate(0,-t.ls),x.translate(j,0,0),x.translate(P[0]*w[r].an*.005,P[1]*R*.01,0),i+=w[r].l+.001*t.tr*t.finalSize}"html"===S?st=x.toCSS():"svg"===S?st=x.to2dCSS():at=[x.props[0],x.props[1],x.props[2],x.props[3],x.props[4],x.props[5],x.props[6],x.props[7],x.props[8],x.props[9],x.props[10],x.props[11],x.props[12],x.props[13],x.props[14],x.props[15]],Z=q}D<=r?(I=new Ge(Z,K,J,U,st,at),this.renderedLetters.push(I),D+=1,this.lettersChangedFlag=!0):(I=this.renderedLetters[r],this.lettersChangedFlag=I.update(Z,K,J,U,st,at)||this.lettersChangedFlag)}}},Ye.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},Ye.prototype.mHelper=new vt,Ye.prototype.defaultPropsArray=[],a([nt],Ye),He.prototype.initElement=function(t,e,i){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,i),this.textProperty=new qe(this,t.t,this.dynamicProperties),this.textAnimator=new Ye(t.t,this.renderType,this),this.initTransform(t,e,i),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},He.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},He.prototype.createPathShape=function(t,e){var i,s,r=e.length,a="";for(i=0;i<r;i+=1)"sh"===e[i].ty&&(s=e[i].ks.k,a+=Ne(s,s.i.length,!0,t));return a},He.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},He.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},He.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},He.prototype.applyTextPropertiesToMatrix=function(t,e,i,s,r){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[i]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[i])/2,0,0)}e.translate(s,r,0)},He.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},He.prototype.emptyProp=new Ge,He.prototype.destroy=function(){};var Ke,Je={shapes:[]};function Ue(t,e,i){this.textSpans=[],this.renderType="svg",this.initElement(t,e,i)}function Ze(t,e,i){this.initElement(t,e,i)}function Qe(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initFrame(),this.initTransform(t,e,i),this.initHierarchy()}function $e(){}function ti(){}function ei(t,e,i){this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?p(this.layers.length):[],this.initElement(t,e,i),this.tm=t.tm?at.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function ii(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=G("svg");var i="";if(e&&e.title){var s=G("title"),r=I();s.setAttribute("id",r),s.textContent=e.title,this.svgElement.appendChild(s),i+=r}if(e&&e.description){var a=G("desc"),n=I();a.setAttribute("id",n),a.textContent=e.description,this.svgElement.appendChild(a),i+=" "+n}i&&this.svgElement.setAttribute("aria-labelledby",i);var o=G("defs");this.svgElement.appendChild(o);var h=G("g");this.svgElement.appendChild(h),this.layerElement=h,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",contentVisibility:e&&e.contentVisibility||"visible",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!(e&&!1===e.hideOnTransparent),viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||"",id:e&&e.id||"",focusable:e&&e.focusable,filterSize:{width:e&&e.filterSize&&e.filterSize.width||"100%",height:e&&e.filterSize&&e.filterSize.height||"100%",x:e&&e.filterSize&&e.filterSize.x||"0%",y:e&&e.filterSize&&e.filterSize.y||"0%"},width:e&&e.width,height:e&&e.height},this.globalData={_mdf:!1,frameNum:-1,defs:o,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}return a([ae,ce,_e,Pe,ne,ke,He],Ue),Ue.prototype.createContent=function(){this.data.singleShape&&!this.globalData.fontManager.chars&&(this.textContainer=G("text"))},Ue.prototype.buildTextContents=function(t){for(var e=0,i=t.length,s=[],r="";e<i;)t[e]===String.fromCharCode(13)||t[e]===String.fromCharCode(3)?(s.push(r),r=""):r+=t[e],e+=1;return s.push(r),s},Ue.prototype.buildShapeData=function(t,e){if(t.shapes&&t.shapes.length){var i=t.shapes[0];if(i.it){var s=i.it[i.it.length-1];s.s&&(s.s.k[0]=e,s.s.k[1]=e)}}return t},Ue.prototype.buildNewText=function(){var t,e;this.addDynamicProperty(this);var i=this.textProperty.currentData;this.renderedLetters=p(i?i.l.length:0),i.fc?this.layerElement.setAttribute("fill",this.buildColor(i.fc)):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),i.sc&&(this.layerElement.setAttribute("stroke",this.buildColor(i.sc)),this.layerElement.setAttribute("stroke-width",i.sw)),this.layerElement.setAttribute("font-size",i.finalSize);var s=this.globalData.fontManager.getFontByName(i.f);if(s.fClass)this.layerElement.setAttribute("class",s.fClass);else{this.layerElement.setAttribute("font-family",s.fFamily);var r=i.fWeight,a=i.fStyle;this.layerElement.setAttribute("font-style",a),this.layerElement.setAttribute("font-weight",r)}this.layerElement.setAttribute("aria-label",i.t);var n,o=i.l||[],h=!!this.globalData.fontManager.chars;e=o.length;var l=this.mHelper,f=this.data.singleShape,u=0,c=0,m=!0,d=.001*i.tr*i.finalSize;if(!f||h||i.sz){var g,y=this.textSpans.length;for(t=0;t<e;t+=1){if(this.textSpans[t]||(this.textSpans[t]={span:null,childSpan:null,glyph:null}),!h||!f||0===t){if(n=y>t?this.textSpans[t].span:G(h?"g":"text"),y<=t){if(n.setAttribute("stroke-linecap","butt"),n.setAttribute("stroke-linejoin","round"),n.setAttribute("stroke-miterlimit","4"),this.textSpans[t].span=n,h){var v=G("g");n.appendChild(v),this.textSpans[t].childSpan=v}this.textSpans[t].span=n,this.layerElement.appendChild(n)}n.style.display="inherit"}if(l.reset(),f&&(o[t].n&&(u=-d,c+=i.yOffset,c+=m?1:0,m=!1),this.applyTextPropertiesToMatrix(i,l,o[t].line,u,c),u+=o[t].l||0,u+=d),h){var b;if(1===(g=this.globalData.fontManager.getCharData(i.finalText[t],s.fStyle,this.globalData.fontManager.getFontByName(i.f).fFamily)).t)b=new ei(g.data,this.globalData,this);else{var _=Je;g.data&&g.data.shapes&&(_=this.buildShapeData(g.data,i.finalSize)),b=new Be(_,this.globalData,this)}if(this.textSpans[t].glyph){var P=this.textSpans[t].glyph;this.textSpans[t].childSpan.removeChild(P.layerElement),P.destroy()}this.textSpans[t].glyph=b,b._debug=!0,b.prepareFrame(0),b.renderFrame(),this.textSpans[t].childSpan.appendChild(b.layerElement),1===g.t&&this.textSpans[t].childSpan.setAttribute("transform","scale("+i.finalSize/100+","+i.finalSize/100+")")}else f&&n.setAttribute("transform","translate("+l.props[12]+","+l.props[13]+")"),n.textContent=o[t].val,n.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}f&&n&&n.setAttribute("d","")}else{var k=this.textContainer,A="start";switch(i.j){case 1:A="end";break;case 2:A="middle";break;default:A="start"}k.setAttribute("text-anchor",A),k.setAttribute("letter-spacing",d);var x=this.buildTextContents(i.finalText);for(e=x.length,c=i.ps?i.ps[1]+i.ascent:0,t=0;t<e;t+=1)(n=this.textSpans[t].span||G("tspan")).textContent=x[t],n.setAttribute("x",0),n.setAttribute("y",c),n.style.display="inherit",k.appendChild(n),this.textSpans[t]||(this.textSpans[t]={span:null,glyph:null}),this.textSpans[t].span=n,c+=i.finalLineHeight;this.layerElement.appendChild(k)}for(;t<this.textSpans.length;)this.textSpans[t].span.style.display="none",t+=1;this._sizeChanged=!0},Ue.prototype.sourceRectAtTime=function(){if(this.prepareFrame(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var t=this.layerElement.getBBox();this.bbox={top:t.y,left:t.x,width:t.width,height:t.height}}return this.bbox},Ue.prototype.getValue=function(){var t,e,i=this.textSpans.length;for(this.renderedFrame=this.comp.renderedFrame,t=0;t<i;t+=1)(e=this.textSpans[t].glyph)&&(e.prepareFrame(this.comp.renderedFrame-this.data.st),e._mdf&&(this._mdf=!0))},Ue.prototype.renderInnerContent=function(){if((!this.data.singleShape||this._mdf)&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){var t,e;this._sizeChanged=!0;var i,s,r,a=this.textAnimator.renderedLetters,n=this.textProperty.currentData.l;for(e=n.length,t=0;t<e;t+=1)n[t].n||(i=a[t],s=this.textSpans[t].span,(r=this.textSpans[t].glyph)&&r.renderFrame(),i._mdf.m&&s.setAttribute("transform",i.m),i._mdf.o&&s.setAttribute("opacity",i.o),i._mdf.sw&&s.setAttribute("stroke-width",i.sw),i._mdf.sc&&s.setAttribute("stroke",i.sc),i._mdf.fc&&s.setAttribute("fill",i.fc))}},a([Ae],Ze),Ze.prototype.createContent=function(){var t=G("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},Qe.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},Qe.prototype.renderFrame=function(){},Qe.prototype.getBaseElement=function(){return null},Qe.prototype.destroy=function(){},Qe.prototype.sourceRectAtTime=function(){},Qe.prototype.hide=function(){},a([ae,ce,Pe,ne],Qe),a([ue],$e),$e.prototype.createNull=function(t){return new Qe(t,this.globalData,this)},$e.prototype.createShape=function(t){return new Be(t,this.globalData,this)},$e.prototype.createText=function(t){return new Ue(t,this.globalData,this)},$e.prototype.createImage=function(t){return new Ae(t,this.globalData,this)},$e.prototype.createSolid=function(t){return new Ze(t,this.globalData,this)},$e.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)",this.svgElement.style.contentVisibility=this.renderConfig.contentVisibility),this.renderConfig.width&&this.svgElement.setAttribute("width",this.renderConfig.width),this.renderConfig.height&&this.svgElement.setAttribute("height",this.renderConfig.height),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.svgElement.setAttribute("id",this.renderConfig.id),void 0!==this.renderConfig.focusable&&this.svgElement.setAttribute("focusable",this.renderConfig.focusable),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var i=G("clipPath"),r=G("rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var a=I();i.setAttribute("id",a),i.appendChild(r),this.layerElement.setAttribute("clip-path","url("+s()+"#"+a+")"),e.appendChild(i),this.layers=t.layers,this.elements=p(t.layers.length)},$e.prototype.destroy=function(){var t;this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.layerElement=null,this.globalData.defs=null;var e=this.layers?this.layers.length:0;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},$e.prototype.updateContainerSize=function(){},$e.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!==this.layers[t].ty){e[t]=!0;var i=this.createItem(this.layers[t]);e[t]=i,N()&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(i),i.initExpressions()),this.appendElementInPos(i,t),this.layers[t].tt&&(this.elements[t-1]&&!0!==this.elements[t-1]?i.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(i)))}},$e.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,i=this.elements.length;e<i;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},$e.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){var e;null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var i=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=i-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<i;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},$e.prototype.appendElementInPos=function(t,e){var i=t.getBaseElement();if(i){for(var s,r=0;r<e;)this.elements[r]&&!0!==this.elements[r]&&this.elements[r].getBaseElement()&&(s=this.elements[r].getBaseElement()),r+=1;s?this.layerElement.insertBefore(i,s):this.layerElement.appendChild(i)}},$e.prototype.hide=function(){this.layerElement.style.display="none"},$e.prototype.show=function(){this.layerElement.style.display="block"},a([ae,ce,Pe,ne,ke],ti),ti.prototype.initElement=function(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initTransform(t,e,i),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},ti.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var i,s=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),i=s-1;i>=0;i-=1)(this.completeLayers||this.elements[i])&&(this.elements[i].prepareFrame(this.renderedFrame-this.layers[i].st),this.elements[i]._mdf&&(this._mdf=!0))}},ti.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},ti.prototype.setElements=function(t){this.elements=t},ti.prototype.getElements=function(){return this.elements},ti.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},ti.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},a([$e,ti,_e],ei),ei.prototype.createComp=function(t){return new ei(t,this.globalData,this)},a([$e],ii),ii.prototype.createComp=function(t){return new ei(t,this.globalData,this)},Ke=ii,J["svg"]=Ke,Dt.registerModifier("tm",Ct),Dt.registerModifier("pb",Tt),Dt.registerModifier("rp",Ft),Dt.registerModifier("rd",Mt),_t}));
