semi-spacing fix
diff --git a/.eslintrc.json b/.eslintrc.json
index d71aa88..a8c5099 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -19,7 +19,6 @@
         "no-param-reassign": "off",
         "keyword-spacing": "off",
         "max-len": "off",
-        "semi-spacing": "off",
         "one-var-declaration-per-line": "off",
         "one-var": "off",
         "padded-blocks": "off",
diff --git a/player/js/3rd_party/howler.js b/player/js/3rd_party/howler.js
index c519ffb..41f7190 100644
--- a/player/js/3rd_party/howler.js
+++ b/player/js/3rd_party/howler.js
@@ -1,4 +1,4 @@
 /*! howler.js v2.2.0 | (c) 2013-2020, James Simpson of GoldFire Studios | MIT License | howlerjs.com */
-!function () { 'use strict';var e = function () { this.init() };e.prototype = {init:function () { var e = this || n;return e._counter = 1e3, e._html5AudioPool = [], e.html5PoolSize = 10, e._codecs = {}, e._howls = [], e._muted = !1, e._volume = 1, e._canPlayEvent = 'canplaythrough', e._navigator = 'undefined' != typeof window && window.navigator ? window.navigator : null, e.masterGain = null, e.noAudio = !1, e.usingWebAudio = !0, e.autoSuspend = !0, e.ctx = null, e.autoUnlock = !0, e._setup(), e }, volume:function (e) { var o = this || n;if(e = parseFloat(e), o.ctx || _(), void 0 !== e && e >= 0 && e <= 1) { if(o._volume = e, o._muted)return o;o.usingWebAudio && o.masterGain.gain.setValueAtTime(e, n.ctx.currentTime);for(var t = 0;t < o._howls.length;t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0;a < r.length;a++) { var u = o._howls[t]._soundById(r[a]);u && u._node && (u._node.volume = u._volume * e) }return o }return o._volume }, mute:function (e) { var o = this || n;o.ctx || _(), o._muted = e, o.usingWebAudio && o.masterGain.gain.setValueAtTime(e ? 0 : o._volume, n.ctx.currentTime);for(var t = 0;t < o._howls.length;t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0;a < r.length;a++) { var u = o._howls[t]._soundById(r[a]);u && u._node && (u._node.muted = !!e || u._muted) }return o }, stop:function () { for(var e = this || n, o = 0;o < e._howls.length;o++)e._howls[o].stop();return e }, unload:function () { for(var e = this || n, o = e._howls.length - 1;o >= 0;o--)e._howls[o].unload();return e.usingWebAudio && e.ctx && void 0 !== e.ctx.close && (e.ctx.close(), e.ctx = null, _()), e }, codecs:function (e) { return(this || n)._codecs[e.replace(/^x-/, '')] }, _setup:function () { var e = this || n;if(e.state = e.ctx ? e.ctx.state || 'suspended' : 'suspended', e._autoSuspend(), !e.usingWebAudio)if('undefined' != typeof Audio)try{ var o = new Audio;void 0 === o.oncanplaythrough && (e._canPlayEvent = 'canplay') }catch(n) { e.noAudio = !0 }else e.noAudio = !0;try{ var o = new Audio;o.muted && (e.noAudio = !0) }catch(e) {}return e.noAudio || e._setupCodecs(), e }, _setupCodecs:function () { var e = this || n, o = null;try{ o = 'undefined' != typeof Audio ? new Audio : null }catch(n) { return e }if(!o || 'function' != typeof o.canPlayType)return e;var t = o.canPlayType('audio/mpeg;').replace(/^no$/, ''), r = e._navigator && e._navigator.userAgent.match(/OPR\/([0-6].)/g), a = r && parseInt(r[0].split('/')[1], 10) < 33;return e._codecs = {mp3:!(a || !t && !o.canPlayType('audio/mp3;').replace(/^no$/, '')), mpeg:!!t, opus:!!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, ''), ogg:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), oga:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), wav:!!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ''), aac:!!o.canPlayType('audio/aac;').replace(/^no$/, ''), caf:!!o.canPlayType('audio/x-caf;').replace(/^no$/, ''), m4a:!!(o.canPlayType('audio/x-m4a;') || o.canPlayType('audio/m4a;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), m4b:!!(o.canPlayType('audio/x-m4b;') || o.canPlayType('audio/m4b;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), mp4:!!(o.canPlayType('audio/x-mp4;') || o.canPlayType('audio/mp4;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), weba:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), webm:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), dolby:!!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/, ''), flac:!!(o.canPlayType('audio/x-flac;') || o.canPlayType('audio/flac;')).replace(/^no$/, '')}, e }, _unlockAudio:function () { var e = this || n;if(!e._audioUnlocked && e.ctx) { e._audioUnlocked = !1, e.autoUnlock = !1, e._mobileUnloaded || 44100 === e.ctx.sampleRate || (e._mobileUnloaded = !0, e.unload()), e._scratchBuffer = e.ctx.createBuffer(1, 1, 22050);var o = function (n) { for(;e._html5AudioPool.length < e.html5PoolSize;)try{ var t = new Audio;t._unlocked = !0, e._releaseHtml5Audio(t) }catch(n) { e.noAudio = !0;break }for(var r = 0;r < e._howls.length;r++)if(!e._howls[r]._webAudio)for(var a = e._howls[r]._getSoundIds(), u = 0;u < a.length;u++) { var i = e._howls[r]._soundById(a[u]);i && i._node && !i._node._unlocked && (i._node._unlocked = !0, i._node.load()) }e._autoResume();var d = e.ctx.createBufferSource();d.buffer = e._scratchBuffer, d.connect(e.ctx.destination), void 0 === d.start ? d.noteOn(0) : d.start(0), 'function' == typeof e.ctx.resume && e.ctx.resume(), d.onended = function () { d.disconnect(0), e._audioUnlocked = !0, document.removeEventListener('touchstart', o, !0), document.removeEventListener('touchend', o, !0), document.removeEventListener('click', o, !0);for(var n = 0;n < e._howls.length;n++)e._howls[n]._emit('unlock') } };return document.addEventListener('touchstart', o, !0), document.addEventListener('touchend', o, !0), document.addEventListener('click', o, !0), e } }, _obtainHtml5Audio:function () { var e = this || n;if(e._html5AudioPool.length)return e._html5AudioPool.pop();var o = (new Audio).play();return o && 'undefined' != typeof Promise && (o instanceof Promise || 'function' == typeof o.then) && o.catch(function () { console.warn('HTML5 Audio pool exhausted, returning potentially locked audio object.') }), new Audio }, _releaseHtml5Audio:function (e) { var o = this || n;return e._unlocked && o._html5AudioPool.push(e), o }, _autoSuspend:function () { var e = this;if(e.autoSuspend && e.ctx && void 0 !== e.ctx.suspend && n.usingWebAudio) { for(var o = 0;o < e._howls.length;o++)if(e._howls[o]._webAudio)for(var t = 0;t < e._howls[o]._sounds.length;t++)if(!e._howls[o]._sounds[t]._paused)return e;return e._suspendTimer && clearTimeout(e._suspendTimer), e._suspendTimer = setTimeout(function () { if(e.autoSuspend) { e._suspendTimer = null, e.state = 'suspending';var n = function () { e.state = 'suspended', e._resumeAfterSuspend && (delete e._resumeAfterSuspend, e._autoResume()) };e.ctx.suspend().then(n, n) } }, 3e4), e } }, _autoResume:function () { var e = this;if(e.ctx && void 0 !== e.ctx.resume && n.usingWebAudio)return'running' === e.state && 'interrupted' !== e.ctx.state && e._suspendTimer ? (clearTimeout(e._suspendTimer), e._suspendTimer = null) : 'suspended' === e.state || 'running' === e.state && 'interrupted' === e.ctx.state ? (e.ctx.resume().then(function () { e.state = 'running';for(var n = 0;n < e._howls.length;n++)e._howls[n]._emit('resume') }), e._suspendTimer && (clearTimeout(e._suspendTimer), e._suspendTimer = null)) : 'suspending' === e.state && (e._resumeAfterSuspend = !0), e }};var n = new e, o = function (e) { var n = this;if(!e.src || 0 === e.src.length)return void console.error('An array of source files must be passed with any new Howl.');n.init(e) };o.prototype = {init:function (e) { var o = this;return n.ctx || _(), o._autoplay = e.autoplay || !1, o._format = 'string' != typeof e.format ? e.format : [e.format], o._html5 = e.html5 || !1, o._muted = e.mute || !1, o._loop = e.loop || !1, o._pool = e.pool || 5, o._preload = 'boolean' != typeof e.preload && 'metadata' !== e.preload || e.preload, o._rate = e.rate || 1, o._sprite = e.sprite || {}, o._src = 'string' != typeof e.src ? e.src : [e.src], o._volume = void 0 !== e.volume ? e.volume : 1, o._xhr = {method:e.xhr && e.xhr.method ? e.xhr.method : 'GET', headers:e.xhr && e.xhr.headers ? e.xhr.headers : null, withCredentials:!(!e.xhr || !e.xhr.withCredentials) && e.xhr.withCredentials}, o._duration = 0, o._state = 'unloaded', o._sounds = [], o._endTimers = {}, o._queue = [], o._playLock = !1, o._onend = e.onend ? [{fn:e.onend}] : [], o._onfade = e.onfade ? [{fn:e.onfade}] : [], o._onload = e.onload ? [{fn:e.onload}] : [], o._onloaderror = e.onloaderror ? [{fn:e.onloaderror}] : [], o._onplayerror = e.onplayerror ? [{fn:e.onplayerror}] : [], o._onpause = e.onpause ? [{fn:e.onpause}] : [], o._onplay = e.onplay ? [{fn:e.onplay}] : [], o._onstop = e.onstop ? [{fn:e.onstop}] : [], o._onmute = e.onmute ? [{fn:e.onmute}] : [], o._onvolume = e.onvolume ? [{fn:e.onvolume}] : [], o._onrate = e.onrate ? [{fn:e.onrate}] : [], o._onseek = e.onseek ? [{fn:e.onseek}] : [], o._onunlock = e.onunlock ? [{fn:e.onunlock}] : [], o._onresume = [], o._webAudio = n.usingWebAudio && !o._html5, void 0 !== n.ctx && n.ctx && n.autoUnlock && n._unlockAudio(), n._howls.push(o), o._autoplay && o._queue.push({event:'play', action:function () { o.play() }}), o._preload && 'none' !== o._preload && o.load(), o }, load:function () { var e = this, o = null;if(n.noAudio)return void e._emit('loaderror', null, 'No audio support.');'string' == typeof e._src && (e._src = [e._src]);for(var r = 0;r < e._src.length;r++) { var u, i;if(e._format && e._format[r])u = e._format[r];else{ if('string' != typeof(i = e._src[r])) { e._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.');continue }u = /^data:audio\/([^;,]+);/i.exec(i), u || (u = /\.([^.]+)$/.exec(i.split('?', 1)[0])), u && (u = u[1].toLowerCase()) }if(u || console.warn('No file extension was found. Consider using the "format" property or specify an extension.'), u && n.codecs(u)) { o = e._src[r];break } }return o ? (e._src = o, e._state = 'loading', 'https:' === window.location.protocol && 'http:' === o.slice(0, 5) && (e._html5 = !0, e._webAudio = !1), new t(e), e._webAudio && a(e), e) : void e._emit('loaderror', null, 'No codec support for selected audio sources.') }, play:function (e, o) { var t = this, r = null;if('number' == typeof e)r = e, e = null;else{ if('string' == typeof e && 'loaded' === t._state && !t._sprite[e])return null;if(void 0 === e && (e = '__default', !t._playLock)) { for(var a = 0, u = 0;u < t._sounds.length;u++)t._sounds[u]._paused && !t._sounds[u]._ended && (a++, r = t._sounds[u]._id);1 === a ? e = null : r = null } }var i = r ? t._soundById(r) : t._inactiveSound();if(!i)return null;if(r && !e && (e = i._sprite || '__default'), 'loaded' !== t._state) { i._sprite = e, i._ended = !1;var d = i._id;return t._queue.push({event:'play', action:function () { t.play(d) }}), d }if(r && !i._paused)return o || t._loadQueue('play'), i._id;t._webAudio && n._autoResume();var _ = Math.max(0, i._seek > 0 ? i._seek : t._sprite[e][0] / 1e3), s = Math.max(0, (t._sprite[e][0] + t._sprite[e][1]) / 1e3 - _), l = 1e3 * s / Math.abs(i._rate), c = t._sprite[e][0] / 1e3, f = (t._sprite[e][0] + t._sprite[e][1]) / 1e3;i._sprite = e, i._ended = !1;var p = function () { i._paused = !1, i._seek = _, i._start = c, i._stop = f, i._loop = !(!i._loop && !t._sprite[e][2]) };if(_ >= f)return void t._ended(i);var m = i._node;if(t._webAudio) { var v = function () { t._playLock = !1, p(), t._refreshBuffer(i);var e = i._muted || t._muted ? 0 : i._volume;m.gain.setValueAtTime(e, n.ctx.currentTime), i._playStart = n.ctx.currentTime, void 0 === m.bufferSource.start ? i._loop ? m.bufferSource.noteGrainOn(0, _, 86400) : m.bufferSource.noteGrainOn(0, _, s) : i._loop ? m.bufferSource.start(0, _, 86400) : m.bufferSource.start(0, _, s), l !== 1 / 0 && (t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l)), o || setTimeout(function () { t._emit('play', i._id), t._loadQueue() }, 0) };'running' === n.state && 'interrupted' !== n.ctx.state ? v() : (t._playLock = !0, t.once('resume', v), t._clearTimer(i._id)) }else{ var h = function () { m.currentTime = _, m.muted = i._muted || t._muted || n._muted || m.muted, m.volume = i._volume * n.volume(), m.playbackRate = i._rate;try{ var r = m.play();if(r && 'undefined' != typeof Promise && (r instanceof Promise || 'function' == typeof r.then) ? (t._playLock = !0, p(), r.then(function () { t._playLock = !1, m._unlocked = !0, o || (t._emit('play', i._id), t._loadQueue()) }).catch(function () { t._playLock = !1, t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'), i._ended = !0, i._paused = !0 })) : o || (t._playLock = !1, p(), t._emit('play', i._id), t._loadQueue()), m.playbackRate = i._rate, m.paused)return void t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.');'__default' !== e || i._loop ? t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l) : (t._endTimers[i._id] = function () { t._ended(i), m.removeEventListener('ended', t._endTimers[i._id], !1) }, m.addEventListener('ended', t._endTimers[i._id], !1)) }catch(e) { t._emit('playerror', i._id, e) } };'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA' === m.src && (m.src = t._src, m.load());var y = window && window.ejecta || !m.readyState && n._navigator.isCocoonJS;if(m.readyState >= 3 || y)h();else{ t._playLock = !0;var g = function () { h(), m.removeEventListener(n._canPlayEvent, g, !1) };m.addEventListener(n._canPlayEvent, g, !1), t._clearTimer(i._id) } }return i._id }, pause:function (e) { var n = this;if('loaded' !== n._state || n._playLock)return n._queue.push({event:'pause', action:function () { n.pause(e) }}), n;for(var o = n._getSoundIds(e), t = 0;t < o.length;t++) { n._clearTimer(o[t]);var r = n._soundById(o[t]);if(r && !r._paused && (r._seek = n.seek(o[t]), r._rateSeek = 0, r._paused = !0, n._stopFade(o[t]), r._node))if(n._webAudio) { if(!r._node.bufferSource)continue;void 0 === r._node.bufferSource.stop ? r._node.bufferSource.noteOff(0) : r._node.bufferSource.stop(0), n._cleanBuffer(r._node) }else isNaN(r._node.duration) && r._node.duration !== 1 / 0 || r._node.pause();arguments[1] || n._emit('pause', r ? r._id : null) }return n }, stop:function (e, n) { var o = this;if('loaded' !== o._state || o._playLock)return o._queue.push({event:'stop', action:function () { o.stop(e) }}), o;for(var t = o._getSoundIds(e), r = 0;r < t.length;r++) { o._clearTimer(t[r]);var a = o._soundById(t[r]);a && (a._seek = a._start || 0, a._rateSeek = 0, a._paused = !0, a._ended = !0, o._stopFade(t[r]), a._node && (o._webAudio ? a._node.bufferSource && (void 0 === a._node.bufferSource.stop ? a._node.bufferSource.noteOff(0) : a._node.bufferSource.stop(0), o._cleanBuffer(a._node)) : isNaN(a._node.duration) && a._node.duration !== 1 / 0 || (a._node.currentTime = a._start || 0, a._node.pause(), a._node.duration === 1 / 0 && o._clearSound(a._node))), n || o._emit('stop', a._id)) }return o }, mute:function (e, o) { var t = this;if('loaded' !== t._state || t._playLock)return t._queue.push({event:'mute', action:function () { t.mute(e, o) }}), t;if(void 0 === o) { if('boolean' != typeof e)return t._muted;t._muted = e }for(var r = t._getSoundIds(o), a = 0;a < r.length;a++) { var u = t._soundById(r[a]);u && (u._muted = e, u._interval && t._stopFade(u._id), t._webAudio && u._node ? u._node.gain.setValueAtTime(e ? 0 : u._volume, n.ctx.currentTime) : u._node && (u._node.muted = !!n._muted || e), t._emit('mute', u._id)) }return t }, volume:function () { var e, o, t = this, r = arguments;if(0 === r.length)return t._volume;if(1 === r.length || 2 === r.length && void 0 === r[1]) { t._getSoundIds().indexOf(r[0]) >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else r.length >= 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10));var a;if(!(void 0 !== e && e >= 0 && e <= 1))return a = o ? t._soundById(o) : t._sounds[0], a ? a._volume : 0;if('loaded' !== t._state || t._playLock)return t._queue.push({event:'volume', action:function () { t.volume.apply(t, r) }}), t;void 0 === o && (t._volume = e), o = t._getSoundIds(o);for(var u = 0;u < o.length;u++)(a = t._soundById(o[u])) && (a._volume = e, r[2] || t._stopFade(o[u]), t._webAudio && a._node && !a._muted ? a._node.gain.setValueAtTime(e, n.ctx.currentTime) : a._node && !a._muted && (a._node.volume = e * n.volume()), t._emit('volume', a._id));return t }, fade:function (e, o, t, r) { var a = this;if('loaded' !== a._state || a._playLock)return a._queue.push({event:'fade', action:function () { a.fade(e, o, t, r) }}), a;e = Math.min(Math.max(0, parseFloat(e)), 1), o = Math.min(Math.max(0, parseFloat(o)), 1), t = parseFloat(t), a.volume(e, r);for(var u = a._getSoundIds(r), i = 0;i < u.length;i++) { var d = a._soundById(u[i]);if(d) { if(r || a._stopFade(u[i]), a._webAudio && !d._muted) { var _ = n.ctx.currentTime, s = _ + t / 1e3;d._volume = e, d._node.gain.setValueAtTime(e, _), d._node.gain.linearRampToValueAtTime(o, s) }a._startFadeInterval(d, e, o, t, u[i], void 0 === r) } }return a }, _startFadeInterval:function (e, n, o, t, r, a) { var u = this, i = n, d = o - n, _ = Math.abs(d / .01), s = Math.max(4, _ > 0 ? t / _ : t), l = Date.now();e._fadeTo = o, e._interval = setInterval(function () { var r = (Date.now() - l) / t;l = Date.now(), i += d * r, i = d < 0 ? Math.max(o, i) : Math.min(o, i), i = Math.round(100 * i) / 100, u._webAudio ? e._volume = i : u.volume(i, e._id, !0), a && (u._volume = i), (o < n && i <= o || o > n && i >= o) && (clearInterval(e._interval), e._interval = null, e._fadeTo = null, u.volume(o, e._id), u._emit('fade', e._id)) }, s) }, _stopFade:function (e) { var o = this, t = o._soundById(e);return t && t._interval && (o._webAudio && t._node.gain.cancelScheduledValues(n.ctx.currentTime), clearInterval(t._interval), t._interval = null, o.volume(t._fadeTo, e), t._fadeTo = null, o._emit('fade', e)), o }, loop:function () { var e, n, o, t = this, r = arguments;if(0 === r.length)return t._loop;if(1 === r.length) { if('boolean' != typeof r[0])return!!(o = t._soundById(parseInt(r[0], 10))) && o._loop;e = r[0], t._loop = e }else 2 === r.length && (e = r[0], n = parseInt(r[1], 10));for(var a = t._getSoundIds(n), u = 0;u < a.length;u++)(o = t._soundById(a[u])) && (o._loop = e, t._webAudio && o._node && o._node.bufferSource && (o._node.bufferSource.loop = e, e && (o._node.bufferSource.loopStart = o._start || 0, o._node.bufferSource.loopEnd = o._stop)));return t }, rate:function () { var e, o, t = this, r = arguments;if(0 === r.length)o = t._sounds[0]._id;else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]);u >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10));var i;if('number' != typeof e)return i = t._soundById(o), i ? i._rate : t._rate;if('loaded' !== t._state || t._playLock)return t._queue.push({event:'rate', action:function () { t.rate.apply(t, r) }}), t;void 0 === o && (t._rate = e), o = t._getSoundIds(o);for(var d = 0;d < o.length;d++)if(i = t._soundById(o[d])) { t.playing(o[d]) && (i._rateSeek = t.seek(o[d]), i._playStart = t._webAudio ? n.ctx.currentTime : i._playStart), i._rate = e, t._webAudio && i._node && i._node.bufferSource ? i._node.bufferSource.playbackRate.setValueAtTime(e, n.ctx.currentTime) : i._node && (i._node.playbackRate = e);var _ = t.seek(o[d]), s = (t._sprite[i._sprite][0] + t._sprite[i._sprite][1]) / 1e3 - _, l = 1e3 * s / Math.abs(i._rate);!t._endTimers[o[d]] && i._paused || (t._clearTimer(o[d]), t._endTimers[o[d]] = setTimeout(t._ended.bind(t, i), l)), t._emit('rate', i._id) }return t }, seek:function () { var e, o, t = this, r = arguments;if(0 === r.length)o = t._sounds[0]._id;else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]);u >= 0 ? o = parseInt(r[0], 10) : t._sounds.length && (o = t._sounds[0]._id, e = parseFloat(r[0])) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10));if(void 0 === o)return t;if('loaded' !== t._state || t._playLock)return t._queue.push({event:'seek', action:function () { t.seek.apply(t, r) }}), t;var i = t._soundById(o);if(i) { if(!('number' == typeof e && e >= 0)) { if(t._webAudio) { var d = t.playing(o) ? n.ctx.currentTime - i._playStart : 0, _ = i._rateSeek ? i._rateSeek - i._seek : 0;return i._seek + (_ + d * Math.abs(i._rate)) }return i._node.currentTime }var s = t.playing(o);s && t.pause(o, !0), i._seek = e, i._ended = !1, t._clearTimer(o), t._webAudio || !i._node || isNaN(i._node.duration) || (i._node.currentTime = e);var l = function () { t._emit('seek', o), s && t.play(o, !0) };if(s && !t._webAudio) { var c = function () { t._playLock ? setTimeout(c, 0) : l() };setTimeout(c, 0) }else l() }return t }, playing:function (e) { var n = this;if('number' == typeof e) { var o = n._soundById(e);return!!o && !o._paused }for(var t = 0;t < n._sounds.length;t++)if(!n._sounds[t]._paused)return!0;return!1 }, duration:function (e) { var n = this, o = n._duration, t = n._soundById(e);return t && (o = n._sprite[t._sprite][1] / 1e3), o }, state:function () { return this._state }, unload:function () { for(var e = this, o = e._sounds, t = 0;t < o.length;t++)o[t]._paused || e.stop(o[t]._id), e._webAudio || (e._clearSound(o[t]._node), o[t]._node.removeEventListener('error', o[t]._errorFn, !1), o[t]._node.removeEventListener(n._canPlayEvent, o[t]._loadFn, !1), n._releaseHtml5Audio(o[t]._node)), delete o[t]._node, e._clearTimer(o[t]._id);var a = n._howls.indexOf(e);a >= 0 && n._howls.splice(a, 1);var u = !0;for(t = 0;t < n._howls.length;t++)if(n._howls[t]._src === e._src || e._src.indexOf(n._howls[t]._src) >= 0) { u = !1;break }return r && u && delete r[e._src], n.noAudio = !1, e._state = 'unloaded', e._sounds = [], e = null, null }, on:function (e, n, o, t) { var r = this, a = r['_on' + e];return'function' == typeof n && a.push(t ? {id:o, fn:n, once:t} : {id:o, fn:n}), r }, off:function (e, n, o) { var t = this, r = t['_on' + e], a = 0;if('number' == typeof n && (o = n, n = null), n || o)for(a = 0;a < r.length;a++) { var u = o === r[a].id;if(n === r[a].fn && u || !n && u) { r.splice(a, 1);break } }else if(e)t['_on' + e] = [];else{ var i = Object.keys(t);for(a = 0;a < i.length;a++)0 === i[a].indexOf('_on') && Array.isArray(t[i[a]]) && (t[i[a]] = []) }return t }, once:function (e, n, o) { var t = this;return t.on(e, n, o, 1), t }, _emit:function (e, n, o) { for(var t = this, r = t['_on' + e], a = r.length - 1;a >= 0;a--)r[a].id && r[a].id !== n && 'load' !== e || (setTimeout(function (e) { e.call(this, n, o) }.bind(t, r[a].fn), 0), r[a].once && t.off(e, r[a].fn, r[a].id));return t._loadQueue(e), t }, _loadQueue:function (e) { var n = this;if(n._queue.length > 0) { var o = n._queue[0];o.event === e && (n._queue.shift(), n._loadQueue()), e || o.action() }return n }, _ended:function (e) { var o = this, t = e._sprite;if(!o._webAudio && e._node && !e._node.paused && !e._node.ended && e._node.currentTime < e._stop)return setTimeout(o._ended.bind(o, e), 100), o;var r = !(!e._loop && !o._sprite[t][2]);if(o._emit('end', e._id), !o._webAudio && r && o.stop(e._id, !0).play(e._id), o._webAudio && r) { o._emit('play', e._id), e._seek = e._start || 0, e._rateSeek = 0, e._playStart = n.ctx.currentTime;var a = 1e3 * (e._stop - e._start) / Math.abs(e._rate);o._endTimers[e._id] = setTimeout(o._ended.bind(o, e), a) }return o._webAudio && !r && (e._paused = !0, e._ended = !0, e._seek = e._start || 0, e._rateSeek = 0, o._clearTimer(e._id), o._cleanBuffer(e._node), n._autoSuspend()), o._webAudio || r || o.stop(e._id, !0), o }, _clearTimer:function (e) { var n = this;if(n._endTimers[e]) { if('function' != typeof n._endTimers[e])clearTimeout(n._endTimers[e]);else{ var o = n._soundById(e);o && o._node && o._node.removeEventListener('ended', n._endTimers[e], !1) }delete n._endTimers[e] }return n }, _soundById:function (e) { for(var n = this, o = 0;o < n._sounds.length;o++)if(e === n._sounds[o]._id)return n._sounds[o];return null }, _inactiveSound:function () { var e = this;e._drain();for(var n = 0;n < e._sounds.length;n++)if(e._sounds[n]._ended)return e._sounds[n].reset();return new t(e) }, _drain:function () { var e = this, n = e._pool, o = 0, t = 0;if(!(e._sounds.length < n)) { for(t = 0;t < e._sounds.length;t++)e._sounds[t]._ended && o++;for(t = e._sounds.length - 1;t >= 0;t--) { if(o <= n)return;e._sounds[t]._ended && (e._webAudio && e._sounds[t]._node && e._sounds[t]._node.disconnect(0), e._sounds.splice(t, 1), o--) } } }, _getSoundIds:function (e) { var n = this;if(void 0 === e) { for(var o = [], t = 0;t < n._sounds.length;t++)o.push(n._sounds[t]._id);return o }return[e] }, _refreshBuffer:function (e) { var o = this;return e._node.bufferSource = n.ctx.createBufferSource(), e._node.bufferSource.buffer = r[o._src], e._panner ? e._node.bufferSource.connect(e._panner) : e._node.bufferSource.connect(e._node), e._node.bufferSource.loop = e._loop, e._loop && (e._node.bufferSource.loopStart = e._start || 0, e._node.bufferSource.loopEnd = e._stop || 0), e._node.bufferSource.playbackRate.setValueAtTime(e._rate, n.ctx.currentTime), o }, _cleanBuffer:function (e) { var o = this, t = n._navigator && n._navigator.vendor.indexOf('Apple') >= 0;if(n._scratchBuffer && e.bufferSource && (e.bufferSource.onended = null, e.bufferSource.disconnect(0), t))try{ e.bufferSource.buffer = n._scratchBuffer }catch(e) {}return e.bufferSource = null, o }, _clearSound:function (e) { /MSIE |Trident\//.test(n._navigator && n._navigator.userAgent) || (e.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') }};var t = function (e) { this._parent = e, this.init() };t.prototype = {init:function () { var e = this, o = e._parent;return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, o._sounds.push(e), e.create(), e }, create:function () { var e = this, o = e._parent, t = n._muted || e._muted || e._parent._muted ? 0 : e._volume;return o._webAudio ? (e._node = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), e._node.gain.setValueAtTime(t, n.ctx.currentTime), e._node.paused = !0, e._node.connect(n.masterGain)) : n.noAudio || (e._node = n._obtainHtml5Audio(), e._errorFn = e._errorListener.bind(e), e._node.addEventListener('error', e._errorFn, !1), e._loadFn = e._loadListener.bind(e), e._node.addEventListener(n._canPlayEvent, e._loadFn, !1), e._node.src = o._src, e._node.preload = !0 === o._preload ? 'auto' : o._preload, e._node.volume = t * n.volume(), e._node.load()), e }, reset:function () { var e = this, o = e._parent;return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._rateSeek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, e }, _errorListener:function () { var e = this;e._parent._emit('loaderror', e._id, e._node.error ? e._node.error.code : 0), e._node.removeEventListener('error', e._errorFn, !1) }, _loadListener:function () { var e = this, o = e._parent;o._duration = Math.ceil(10 * e._node.duration) / 10, 0 === Object.keys(o._sprite).length && (o._sprite = {__default:[0, 1e3 * o._duration]}), 'loaded' !== o._state && (o._state = 'loaded', o._emit('load'), o._loadQueue()), e._node.removeEventListener(n._canPlayEvent, e._loadFn, !1) }};var r = {}, a = function (e) { var n = e._src;if(r[n])return e._duration = r[n].duration, void d(e);if(/^data:[^;]+;base64,/.test(n)) { for(var o = atob(n.split(',')[1]), t = new Uint8Array(o.length), a = 0;a < o.length;++a)t[a] = o.charCodeAt(a);i(t.buffer, e) }else{ var _ = new XMLHttpRequest;_.open(e._xhr.method, n, !0), _.withCredentials = e._xhr.withCredentials, _.responseType = 'arraybuffer', e._xhr.headers && Object.keys(e._xhr.headers).forEach(function (n) { _.setRequestHeader(n, e._xhr.headers[n]) }), _.onload = function () { var n = (_.status + '')[0];if('0' !== n && '2' !== n && '3' !== n)return void e._emit('loaderror', null, 'Failed loading audio file with status: ' + _.status + '.');i(_.response, e) }, _.onerror = function () { e._webAudio && (e._html5 = !0, e._webAudio = !1, e._sounds = [], delete r[n], e.load()) }, u(_) } }, u = function (e) { try{ e.send() }catch(n) { e.onerror() } }, i = function (e, o) { var t = function () { o._emit('loaderror', null, 'Decoding audio data failed.') }, a = function (e) { e && o._sounds.length > 0 ? (r[o._src] = e, d(o, e)) : t() };'undefined' != typeof Promise && 1 === n.ctx.decodeAudioData.length ? n.ctx.decodeAudioData(e).then(a).catch(t) : n.ctx.decodeAudioData(e, a, t) }, d = function (e, n) { n && !e._duration && (e._duration = n.duration), 0 === Object.keys(e._sprite).length && (e._sprite = {__default:[0, 1e3 * e._duration]}), 'loaded' !== e._state && (e._state = 'loaded', e._emit('load'), e._loadQueue()) }, _ = function () { if(n.usingWebAudio) { try{ 'undefined' != typeof AudioContext ? n.ctx = new AudioContext : 'undefined' != typeof webkitAudioContext ? n.ctx = new webkitAudioContext : n.usingWebAudio = !1 }catch(e) { n.usingWebAudio = !1 }n.ctx || (n.usingWebAudio = !1);var e = /iP(hone|od|ad)/.test(n._navigator && n._navigator.platform), o = n._navigator && n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/), t = o ? parseInt(o[1], 10) : null;if(e && t && t < 9) { var r = /safari/.test(n._navigator && n._navigator.userAgent.toLowerCase());n._navigator && !r && (n.usingWebAudio = !1) }n.usingWebAudio && (n.masterGain = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), n.masterGain.gain.setValueAtTime(n._muted ? 0 : n._volume, n.ctx.currentTime), n.masterGain.connect(n.ctx.destination)), n._setup() } };'function' == typeof define && define.amd && define([], function () { return{Howler:n, Howl:o} }), 'undefined' != typeof exports && (exports.Howler = n, exports.Howl = o), 'undefined' != typeof global ? (global.HowlerGlobal = e, global.Howler = n, global.Howl = o, global.Sound = t) : 'undefined' != typeof window && (window.HowlerGlobal = e, window.Howler = n, window.Howl = o, window.Sound = t) }();
+!function () { 'use strict'; var e = function () { this.init() }; e.prototype = {init:function () { var e = this || n; return e._counter = 1e3, e._html5AudioPool = [], e.html5PoolSize = 10, e._codecs = {}, e._howls = [], e._muted = !1, e._volume = 1, e._canPlayEvent = 'canplaythrough', e._navigator = 'undefined' != typeof window && window.navigator ? window.navigator : null, e.masterGain = null, e.noAudio = !1, e.usingWebAudio = !0, e.autoSuspend = !0, e.ctx = null, e.autoUnlock = !0, e._setup(), e }, volume:function (e) { var o = this || n; if(e = parseFloat(e), o.ctx || _(), void 0 !== e && e >= 0 && e <= 1) { if(o._volume = e, o._muted)return o; o.usingWebAudio && o.masterGain.gain.setValueAtTime(e, n.ctx.currentTime); for(var t = 0; t < o._howls.length; t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.volume = u._volume * e) }return o }return o._volume }, mute:function (e) { var o = this || n; o.ctx || _(), o._muted = e, o.usingWebAudio && o.masterGain.gain.setValueAtTime(e ? 0 : o._volume, n.ctx.currentTime); for(var t = 0; t < o._howls.length; t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.muted = !!e || u._muted) }return o }, stop:function () { for(var e = this || n, o = 0; o < e._howls.length; o++)e._howls[o].stop(); return e }, unload:function () { for(var e = this || n, o = e._howls.length - 1; o >= 0; o--)e._howls[o].unload(); return e.usingWebAudio && e.ctx && void 0 !== e.ctx.close && (e.ctx.close(), e.ctx = null, _()), e }, codecs:function (e) { return(this || n)._codecs[e.replace(/^x-/, '')] }, _setup:function () { var e = this || n; if(e.state = e.ctx ? e.ctx.state || 'suspended' : 'suspended', e._autoSuspend(), !e.usingWebAudio)if('undefined' != typeof Audio)try{ var o = new Audio; void 0 === o.oncanplaythrough && (e._canPlayEvent = 'canplay') }catch(n) { e.noAudio = !0 }else e.noAudio = !0; try{ var o = new Audio; o.muted && (e.noAudio = !0) }catch(e) {}return e.noAudio || e._setupCodecs(), e }, _setupCodecs:function () { var e = this || n, o = null; try{ o = 'undefined' != typeof Audio ? new Audio : null }catch(n) { return e }if(!o || 'function' != typeof o.canPlayType)return e; var t = o.canPlayType('audio/mpeg;').replace(/^no$/, ''), r = e._navigator && e._navigator.userAgent.match(/OPR\/([0-6].)/g), a = r && parseInt(r[0].split('/')[1], 10) < 33; return e._codecs = {mp3:!(a || !t && !o.canPlayType('audio/mp3;').replace(/^no$/, '')), mpeg:!!t, opus:!!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, ''), ogg:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), oga:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), wav:!!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ''), aac:!!o.canPlayType('audio/aac;').replace(/^no$/, ''), caf:!!o.canPlayType('audio/x-caf;').replace(/^no$/, ''), m4a:!!(o.canPlayType('audio/x-m4a;') || o.canPlayType('audio/m4a;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), m4b:!!(o.canPlayType('audio/x-m4b;') || o.canPlayType('audio/m4b;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), mp4:!!(o.canPlayType('audio/x-mp4;') || o.canPlayType('audio/mp4;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), weba:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), webm:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), dolby:!!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/, ''), flac:!!(o.canPlayType('audio/x-flac;') || o.canPlayType('audio/flac;')).replace(/^no$/, '')}, e }, _unlockAudio:function () { var e = this || n; if(!e._audioUnlocked && e.ctx) { e._audioUnlocked = !1, e.autoUnlock = !1, e._mobileUnloaded || 44100 === e.ctx.sampleRate || (e._mobileUnloaded = !0, e.unload()), e._scratchBuffer = e.ctx.createBuffer(1, 1, 22050); var o = function (n) { for(;e._html5AudioPool.length < e.html5PoolSize;)try{ var t = new Audio; t._unlocked = !0, e._releaseHtml5Audio(t) }catch(n) { e.noAudio = !0; break }for(var r = 0; r < e._howls.length; r++)if(!e._howls[r]._webAudio)for(var a = e._howls[r]._getSoundIds(), u = 0; u < a.length; u++) { var i = e._howls[r]._soundById(a[u]); i && i._node && !i._node._unlocked && (i._node._unlocked = !0, i._node.load()) }e._autoResume(); var d = e.ctx.createBufferSource(); d.buffer = e._scratchBuffer, d.connect(e.ctx.destination), void 0 === d.start ? d.noteOn(0) : d.start(0), 'function' == typeof e.ctx.resume && e.ctx.resume(), d.onended = function () { d.disconnect(0), e._audioUnlocked = !0, document.removeEventListener('touchstart', o, !0), document.removeEventListener('touchend', o, !0), document.removeEventListener('click', o, !0); for(var n = 0; n < e._howls.length; n++)e._howls[n]._emit('unlock') } }; return document.addEventListener('touchstart', o, !0), document.addEventListener('touchend', o, !0), document.addEventListener('click', o, !0), e } }, _obtainHtml5Audio:function () { var e = this || n; if(e._html5AudioPool.length)return e._html5AudioPool.pop(); var o = (new Audio).play(); return o && 'undefined' != typeof Promise && (o instanceof Promise || 'function' == typeof o.then) && o.catch(function () { console.warn('HTML5 Audio pool exhausted, returning potentially locked audio object.') }), new Audio }, _releaseHtml5Audio:function (e) { var o = this || n; return e._unlocked && o._html5AudioPool.push(e), o }, _autoSuspend:function () { var e = this; if(e.autoSuspend && e.ctx && void 0 !== e.ctx.suspend && n.usingWebAudio) { for(var o = 0; o < e._howls.length; o++)if(e._howls[o]._webAudio)for(var t = 0; t < e._howls[o]._sounds.length; t++)if(!e._howls[o]._sounds[t]._paused)return e; return e._suspendTimer && clearTimeout(e._suspendTimer), e._suspendTimer = setTimeout(function () { if(e.autoSuspend) { e._suspendTimer = null, e.state = 'suspending'; var n = function () { e.state = 'suspended', e._resumeAfterSuspend && (delete e._resumeAfterSuspend, e._autoResume()) }; e.ctx.suspend().then(n, n) } }, 3e4), e } }, _autoResume:function () { var e = this; if(e.ctx && void 0 !== e.ctx.resume && n.usingWebAudio)return'running' === e.state && 'interrupted' !== e.ctx.state && e._suspendTimer ? (clearTimeout(e._suspendTimer), e._suspendTimer = null) : 'suspended' === e.state || 'running' === e.state && 'interrupted' === e.ctx.state ? (e.ctx.resume().then(function () { e.state = 'running'; for(var n = 0; n < e._howls.length; n++)e._howls[n]._emit('resume') }), e._suspendTimer && (clearTimeout(e._suspendTimer), e._suspendTimer = null)) : 'suspending' === e.state && (e._resumeAfterSuspend = !0), e }}; var n = new e, o = function (e) { var n = this; if(!e.src || 0 === e.src.length)return void console.error('An array of source files must be passed with any new Howl.'); n.init(e) }; o.prototype = {init:function (e) { var o = this; return n.ctx || _(), o._autoplay = e.autoplay || !1, o._format = 'string' != typeof e.format ? e.format : [e.format], o._html5 = e.html5 || !1, o._muted = e.mute || !1, o._loop = e.loop || !1, o._pool = e.pool || 5, o._preload = 'boolean' != typeof e.preload && 'metadata' !== e.preload || e.preload, o._rate = e.rate || 1, o._sprite = e.sprite || {}, o._src = 'string' != typeof e.src ? e.src : [e.src], o._volume = void 0 !== e.volume ? e.volume : 1, o._xhr = {method:e.xhr && e.xhr.method ? e.xhr.method : 'GET', headers:e.xhr && e.xhr.headers ? e.xhr.headers : null, withCredentials:!(!e.xhr || !e.xhr.withCredentials) && e.xhr.withCredentials}, o._duration = 0, o._state = 'unloaded', o._sounds = [], o._endTimers = {}, o._queue = [], o._playLock = !1, o._onend = e.onend ? [{fn:e.onend}] : [], o._onfade = e.onfade ? [{fn:e.onfade}] : [], o._onload = e.onload ? [{fn:e.onload}] : [], o._onloaderror = e.onloaderror ? [{fn:e.onloaderror}] : [], o._onplayerror = e.onplayerror ? [{fn:e.onplayerror}] : [], o._onpause = e.onpause ? [{fn:e.onpause}] : [], o._onplay = e.onplay ? [{fn:e.onplay}] : [], o._onstop = e.onstop ? [{fn:e.onstop}] : [], o._onmute = e.onmute ? [{fn:e.onmute}] : [], o._onvolume = e.onvolume ? [{fn:e.onvolume}] : [], o._onrate = e.onrate ? [{fn:e.onrate}] : [], o._onseek = e.onseek ? [{fn:e.onseek}] : [], o._onunlock = e.onunlock ? [{fn:e.onunlock}] : [], o._onresume = [], o._webAudio = n.usingWebAudio && !o._html5, void 0 !== n.ctx && n.ctx && n.autoUnlock && n._unlockAudio(), n._howls.push(o), o._autoplay && o._queue.push({event:'play', action:function () { o.play() }}), o._preload && 'none' !== o._preload && o.load(), o }, load:function () { var e = this, o = null; if(n.noAudio)return void e._emit('loaderror', null, 'No audio support.'); 'string' == typeof e._src && (e._src = [e._src]); for(var r = 0; r < e._src.length; r++) { var u, i; if(e._format && e._format[r])u = e._format[r]; else{ if('string' != typeof(i = e._src[r])) { e._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.'); continue }u = /^data:audio\/([^;,]+);/i.exec(i), u || (u = /\.([^.]+)$/.exec(i.split('?', 1)[0])), u && (u = u[1].toLowerCase()) }if(u || console.warn('No file extension was found. Consider using the "format" property or specify an extension.'), u && n.codecs(u)) { o = e._src[r]; break } }return o ? (e._src = o, e._state = 'loading', 'https:' === window.location.protocol && 'http:' === o.slice(0, 5) && (e._html5 = !0, e._webAudio = !1), new t(e), e._webAudio && a(e), e) : void e._emit('loaderror', null, 'No codec support for selected audio sources.') }, play:function (e, o) { var t = this, r = null; if('number' == typeof e)r = e, e = null; else{ if('string' == typeof e && 'loaded' === t._state && !t._sprite[e])return null; if(void 0 === e && (e = '__default', !t._playLock)) { for(var a = 0, u = 0; u < t._sounds.length; u++)t._sounds[u]._paused && !t._sounds[u]._ended && (a++, r = t._sounds[u]._id); 1 === a ? e = null : r = null } }var i = r ? t._soundById(r) : t._inactiveSound(); if(!i)return null; if(r && !e && (e = i._sprite || '__default'), 'loaded' !== t._state) { i._sprite = e, i._ended = !1; var d = i._id; return t._queue.push({event:'play', action:function () { t.play(d) }}), d }if(r && !i._paused)return o || t._loadQueue('play'), i._id; t._webAudio && n._autoResume(); var _ = Math.max(0, i._seek > 0 ? i._seek : t._sprite[e][0] / 1e3), s = Math.max(0, (t._sprite[e][0] + t._sprite[e][1]) / 1e3 - _), l = 1e3 * s / Math.abs(i._rate), c = t._sprite[e][0] / 1e3, f = (t._sprite[e][0] + t._sprite[e][1]) / 1e3; i._sprite = e, i._ended = !1; var p = function () { i._paused = !1, i._seek = _, i._start = c, i._stop = f, i._loop = !(!i._loop && !t._sprite[e][2]) }; if(_ >= f)return void t._ended(i); var m = i._node; if(t._webAudio) { var v = function () { t._playLock = !1, p(), t._refreshBuffer(i); var e = i._muted || t._muted ? 0 : i._volume; m.gain.setValueAtTime(e, n.ctx.currentTime), i._playStart = n.ctx.currentTime, void 0 === m.bufferSource.start ? i._loop ? m.bufferSource.noteGrainOn(0, _, 86400) : m.bufferSource.noteGrainOn(0, _, s) : i._loop ? m.bufferSource.start(0, _, 86400) : m.bufferSource.start(0, _, s), l !== 1 / 0 && (t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l)), o || setTimeout(function () { t._emit('play', i._id), t._loadQueue() }, 0) }; 'running' === n.state && 'interrupted' !== n.ctx.state ? v() : (t._playLock = !0, t.once('resume', v), t._clearTimer(i._id)) }else{ var h = function () { m.currentTime = _, m.muted = i._muted || t._muted || n._muted || m.muted, m.volume = i._volume * n.volume(), m.playbackRate = i._rate; try{ var r = m.play(); if(r && 'undefined' != typeof Promise && (r instanceof Promise || 'function' == typeof r.then) ? (t._playLock = !0, p(), r.then(function () { t._playLock = !1, m._unlocked = !0, o || (t._emit('play', i._id), t._loadQueue()) }).catch(function () { t._playLock = !1, t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'), i._ended = !0, i._paused = !0 })) : o || (t._playLock = !1, p(), t._emit('play', i._id), t._loadQueue()), m.playbackRate = i._rate, m.paused)return void t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'); '__default' !== e || i._loop ? t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l) : (t._endTimers[i._id] = function () { t._ended(i), m.removeEventListener('ended', t._endTimers[i._id], !1) }, m.addEventListener('ended', t._endTimers[i._id], !1)) }catch(e) { t._emit('playerror', i._id, e) } }; 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA' === m.src && (m.src = t._src, m.load()); var y = window && window.ejecta || !m.readyState && n._navigator.isCocoonJS; if(m.readyState >= 3 || y)h(); else{ t._playLock = !0; var g = function () { h(), m.removeEventListener(n._canPlayEvent, g, !1) }; m.addEventListener(n._canPlayEvent, g, !1), t._clearTimer(i._id) } }return i._id }, pause:function (e) { var n = this; if('loaded' !== n._state || n._playLock)return n._queue.push({event:'pause', action:function () { n.pause(e) }}), n; for(var o = n._getSoundIds(e), t = 0; t < o.length; t++) { n._clearTimer(o[t]); var r = n._soundById(o[t]); if(r && !r._paused && (r._seek = n.seek(o[t]), r._rateSeek = 0, r._paused = !0, n._stopFade(o[t]), r._node))if(n._webAudio) { if(!r._node.bufferSource)continue; void 0 === r._node.bufferSource.stop ? r._node.bufferSource.noteOff(0) : r._node.bufferSource.stop(0), n._cleanBuffer(r._node) }else isNaN(r._node.duration) && r._node.duration !== 1 / 0 || r._node.pause(); arguments[1] || n._emit('pause', r ? r._id : null) }return n }, stop:function (e, n) { var o = this; if('loaded' !== o._state || o._playLock)return o._queue.push({event:'stop', action:function () { o.stop(e) }}), o; for(var t = o._getSoundIds(e), r = 0; r < t.length; r++) { o._clearTimer(t[r]); var a = o._soundById(t[r]); a && (a._seek = a._start || 0, a._rateSeek = 0, a._paused = !0, a._ended = !0, o._stopFade(t[r]), a._node && (o._webAudio ? a._node.bufferSource && (void 0 === a._node.bufferSource.stop ? a._node.bufferSource.noteOff(0) : a._node.bufferSource.stop(0), o._cleanBuffer(a._node)) : isNaN(a._node.duration) && a._node.duration !== 1 / 0 || (a._node.currentTime = a._start || 0, a._node.pause(), a._node.duration === 1 / 0 && o._clearSound(a._node))), n || o._emit('stop', a._id)) }return o }, mute:function (e, o) { var t = this; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'mute', action:function () { t.mute(e, o) }}), t; if(void 0 === o) { if('boolean' != typeof e)return t._muted; t._muted = e }for(var r = t._getSoundIds(o), a = 0; a < r.length; a++) { var u = t._soundById(r[a]); u && (u._muted = e, u._interval && t._stopFade(u._id), t._webAudio && u._node ? u._node.gain.setValueAtTime(e ? 0 : u._volume, n.ctx.currentTime) : u._node && (u._node.muted = !!n._muted || e), t._emit('mute', u._id)) }return t }, volume:function () { var e, o, t = this, r = arguments; if(0 === r.length)return t._volume; if(1 === r.length || 2 === r.length && void 0 === r[1]) { t._getSoundIds().indexOf(r[0]) >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else r.length >= 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var a; if(!(void 0 !== e && e >= 0 && e <= 1))return a = o ? t._soundById(o) : t._sounds[0], a ? a._volume : 0; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'volume', action:function () { t.volume.apply(t, r) }}), t; void 0 === o && (t._volume = e), o = t._getSoundIds(o); for(var u = 0; u < o.length; u++)(a = t._soundById(o[u])) && (a._volume = e, r[2] || t._stopFade(o[u]), t._webAudio && a._node && !a._muted ? a._node.gain.setValueAtTime(e, n.ctx.currentTime) : a._node && !a._muted && (a._node.volume = e * n.volume()), t._emit('volume', a._id)); return t }, fade:function (e, o, t, r) { var a = this; if('loaded' !== a._state || a._playLock)return a._queue.push({event:'fade', action:function () { a.fade(e, o, t, r) }}), a; e = Math.min(Math.max(0, parseFloat(e)), 1), o = Math.min(Math.max(0, parseFloat(o)), 1), t = parseFloat(t), a.volume(e, r); for(var u = a._getSoundIds(r), i = 0; i < u.length; i++) { var d = a._soundById(u[i]); if(d) { if(r || a._stopFade(u[i]), a._webAudio && !d._muted) { var _ = n.ctx.currentTime, s = _ + t / 1e3; d._volume = e, d._node.gain.setValueAtTime(e, _), d._node.gain.linearRampToValueAtTime(o, s) }a._startFadeInterval(d, e, o, t, u[i], void 0 === r) } }return a }, _startFadeInterval:function (e, n, o, t, r, a) { var u = this, i = n, d = o - n, _ = Math.abs(d / .01), s = Math.max(4, _ > 0 ? t / _ : t), l = Date.now(); e._fadeTo = o, e._interval = setInterval(function () { var r = (Date.now() - l) / t; l = Date.now(), i += d * r, i = d < 0 ? Math.max(o, i) : Math.min(o, i), i = Math.round(100 * i) / 100, u._webAudio ? e._volume = i : u.volume(i, e._id, !0), a && (u._volume = i), (o < n && i <= o || o > n && i >= o) && (clearInterval(e._interval), e._interval = null, e._fadeTo = null, u.volume(o, e._id), u._emit('fade', e._id)) }, s) }, _stopFade:function (e) { var o = this, t = o._soundById(e); return t && t._interval && (o._webAudio && t._node.gain.cancelScheduledValues(n.ctx.currentTime), clearInterval(t._interval), t._interval = null, o.volume(t._fadeTo, e), t._fadeTo = null, o._emit('fade', e)), o }, loop:function () { var e, n, o, t = this, r = arguments; if(0 === r.length)return t._loop; if(1 === r.length) { if('boolean' != typeof r[0])return!!(o = t._soundById(parseInt(r[0], 10))) && o._loop; e = r[0], t._loop = e }else 2 === r.length && (e = r[0], n = parseInt(r[1], 10)); for(var a = t._getSoundIds(n), u = 0; u < a.length; u++)(o = t._soundById(a[u])) && (o._loop = e, t._webAudio && o._node && o._node.bufferSource && (o._node.bufferSource.loop = e, e && (o._node.bufferSource.loopStart = o._start || 0, o._node.bufferSource.loopEnd = o._stop))); return t }, rate:function () { var e, o, t = this, r = arguments; if(0 === r.length)o = t._sounds[0]._id; else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var i; if('number' != typeof e)return i = t._soundById(o), i ? i._rate : t._rate; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'rate', action:function () { t.rate.apply(t, r) }}), t; void 0 === o && (t._rate = e), o = t._getSoundIds(o); for(var d = 0; d < o.length; d++)if(i = t._soundById(o[d])) { t.playing(o[d]) && (i._rateSeek = t.seek(o[d]), i._playStart = t._webAudio ? n.ctx.currentTime : i._playStart), i._rate = e, t._webAudio && i._node && i._node.bufferSource ? i._node.bufferSource.playbackRate.setValueAtTime(e, n.ctx.currentTime) : i._node && (i._node.playbackRate = e); var _ = t.seek(o[d]), s = (t._sprite[i._sprite][0] + t._sprite[i._sprite][1]) / 1e3 - _, l = 1e3 * s / Math.abs(i._rate); !t._endTimers[o[d]] && i._paused || (t._clearTimer(o[d]), t._endTimers[o[d]] = setTimeout(t._ended.bind(t, i), l)), t._emit('rate', i._id) }return t }, seek:function () { var e, o, t = this, r = arguments; if(0 === r.length)o = t._sounds[0]._id; else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : t._sounds.length && (o = t._sounds[0]._id, e = parseFloat(r[0])) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); if(void 0 === o)return t; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'seek', action:function () { t.seek.apply(t, r) }}), t; var i = t._soundById(o); if(i) { if(!('number' == typeof e && e >= 0)) { if(t._webAudio) { var d = t.playing(o) ? n.ctx.currentTime - i._playStart : 0, _ = i._rateSeek ? i._rateSeek - i._seek : 0; return i._seek + (_ + d * Math.abs(i._rate)) }return i._node.currentTime }var s = t.playing(o); s && t.pause(o, !0), i._seek = e, i._ended = !1, t._clearTimer(o), t._webAudio || !i._node || isNaN(i._node.duration) || (i._node.currentTime = e); var l = function () { t._emit('seek', o), s && t.play(o, !0) }; if(s && !t._webAudio) { var c = function () { t._playLock ? setTimeout(c, 0) : l() }; setTimeout(c, 0) }else l() }return t }, playing:function (e) { var n = this; if('number' == typeof e) { var o = n._soundById(e); return!!o && !o._paused }for(var t = 0; t < n._sounds.length; t++)if(!n._sounds[t]._paused)return!0; return!1 }, duration:function (e) { var n = this, o = n._duration, t = n._soundById(e); return t && (o = n._sprite[t._sprite][1] / 1e3), o }, state:function () { return this._state }, unload:function () { for(var e = this, o = e._sounds, t = 0; t < o.length; t++)o[t]._paused || e.stop(o[t]._id), e._webAudio || (e._clearSound(o[t]._node), o[t]._node.removeEventListener('error', o[t]._errorFn, !1), o[t]._node.removeEventListener(n._canPlayEvent, o[t]._loadFn, !1), n._releaseHtml5Audio(o[t]._node)), delete o[t]._node, e._clearTimer(o[t]._id); var a = n._howls.indexOf(e); a >= 0 && n._howls.splice(a, 1); var u = !0; for(t = 0; t < n._howls.length; t++)if(n._howls[t]._src === e._src || e._src.indexOf(n._howls[t]._src) >= 0) { u = !1; break }return r && u && delete r[e._src], n.noAudio = !1, e._state = 'unloaded', e._sounds = [], e = null, null }, on:function (e, n, o, t) { var r = this, a = r['_on' + e]; return'function' == typeof n && a.push(t ? {id:o, fn:n, once:t} : {id:o, fn:n}), r }, off:function (e, n, o) { var t = this, r = t['_on' + e], a = 0; if('number' == typeof n && (o = n, n = null), n || o)for(a = 0; a < r.length; a++) { var u = o === r[a].id; if(n === r[a].fn && u || !n && u) { r.splice(a, 1); break } }else if(e)t['_on' + e] = []; else{ var i = Object.keys(t); for(a = 0; a < i.length; a++)0 === i[a].indexOf('_on') && Array.isArray(t[i[a]]) && (t[i[a]] = []) }return t }, once:function (e, n, o) { var t = this; return t.on(e, n, o, 1), t }, _emit:function (e, n, o) { for(var t = this, r = t['_on' + e], a = r.length - 1; a >= 0; a--)r[a].id && r[a].id !== n && 'load' !== e || (setTimeout(function (e) { e.call(this, n, o) }.bind(t, r[a].fn), 0), r[a].once && t.off(e, r[a].fn, r[a].id)); return t._loadQueue(e), t }, _loadQueue:function (e) { var n = this; if(n._queue.length > 0) { var o = n._queue[0]; o.event === e && (n._queue.shift(), n._loadQueue()), e || o.action() }return n }, _ended:function (e) { var o = this, t = e._sprite; if(!o._webAudio && e._node && !e._node.paused && !e._node.ended && e._node.currentTime < e._stop)return setTimeout(o._ended.bind(o, e), 100), o; var r = !(!e._loop && !o._sprite[t][2]); if(o._emit('end', e._id), !o._webAudio && r && o.stop(e._id, !0).play(e._id), o._webAudio && r) { o._emit('play', e._id), e._seek = e._start || 0, e._rateSeek = 0, e._playStart = n.ctx.currentTime; var a = 1e3 * (e._stop - e._start) / Math.abs(e._rate); o._endTimers[e._id] = setTimeout(o._ended.bind(o, e), a) }return o._webAudio && !r && (e._paused = !0, e._ended = !0, e._seek = e._start || 0, e._rateSeek = 0, o._clearTimer(e._id), o._cleanBuffer(e._node), n._autoSuspend()), o._webAudio || r || o.stop(e._id, !0), o }, _clearTimer:function (e) { var n = this; if(n._endTimers[e]) { if('function' != typeof n._endTimers[e])clearTimeout(n._endTimers[e]); else{ var o = n._soundById(e); o && o._node && o._node.removeEventListener('ended', n._endTimers[e], !1) }delete n._endTimers[e] }return n }, _soundById:function (e) { for(var n = this, o = 0; o < n._sounds.length; o++)if(e === n._sounds[o]._id)return n._sounds[o]; return null }, _inactiveSound:function () { var e = this; e._drain(); for(var n = 0; n < e._sounds.length; n++)if(e._sounds[n]._ended)return e._sounds[n].reset(); return new t(e) }, _drain:function () { var e = this, n = e._pool, o = 0, t = 0; if(!(e._sounds.length < n)) { for(t = 0; t < e._sounds.length; t++)e._sounds[t]._ended && o++; for(t = e._sounds.length - 1; t >= 0; t--) { if(o <= n)return; e._sounds[t]._ended && (e._webAudio && e._sounds[t]._node && e._sounds[t]._node.disconnect(0), e._sounds.splice(t, 1), o--) } } }, _getSoundIds:function (e) { var n = this; if(void 0 === e) { for(var o = [], t = 0; t < n._sounds.length; t++)o.push(n._sounds[t]._id); return o }return[e] }, _refreshBuffer:function (e) { var o = this; return e._node.bufferSource = n.ctx.createBufferSource(), e._node.bufferSource.buffer = r[o._src], e._panner ? e._node.bufferSource.connect(e._panner) : e._node.bufferSource.connect(e._node), e._node.bufferSource.loop = e._loop, e._loop && (e._node.bufferSource.loopStart = e._start || 0, e._node.bufferSource.loopEnd = e._stop || 0), e._node.bufferSource.playbackRate.setValueAtTime(e._rate, n.ctx.currentTime), o }, _cleanBuffer:function (e) { var o = this, t = n._navigator && n._navigator.vendor.indexOf('Apple') >= 0; if(n._scratchBuffer && e.bufferSource && (e.bufferSource.onended = null, e.bufferSource.disconnect(0), t))try{ e.bufferSource.buffer = n._scratchBuffer }catch(e) {}return e.bufferSource = null, o }, _clearSound:function (e) { /MSIE |Trident\//.test(n._navigator && n._navigator.userAgent) || (e.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') }}; var t = function (e) { this._parent = e, this.init() }; t.prototype = {init:function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, o._sounds.push(e), e.create(), e }, create:function () { var e = this, o = e._parent, t = n._muted || e._muted || e._parent._muted ? 0 : e._volume; return o._webAudio ? (e._node = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), e._node.gain.setValueAtTime(t, n.ctx.currentTime), e._node.paused = !0, e._node.connect(n.masterGain)) : n.noAudio || (e._node = n._obtainHtml5Audio(), e._errorFn = e._errorListener.bind(e), e._node.addEventListener('error', e._errorFn, !1), e._loadFn = e._loadListener.bind(e), e._node.addEventListener(n._canPlayEvent, e._loadFn, !1), e._node.src = o._src, e._node.preload = !0 === o._preload ? 'auto' : o._preload, e._node.volume = t * n.volume(), e._node.load()), e }, reset:function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._rateSeek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, e }, _errorListener:function () { var e = this; e._parent._emit('loaderror', e._id, e._node.error ? e._node.error.code : 0), e._node.removeEventListener('error', e._errorFn, !1) }, _loadListener:function () { var e = this, o = e._parent; o._duration = Math.ceil(10 * e._node.duration) / 10, 0 === Object.keys(o._sprite).length && (o._sprite = {__default:[0, 1e3 * o._duration]}), 'loaded' !== o._state && (o._state = 'loaded', o._emit('load'), o._loadQueue()), e._node.removeEventListener(n._canPlayEvent, e._loadFn, !1) }}; var r = {}, a = function (e) { var n = e._src; if(r[n])return e._duration = r[n].duration, void d(e); if(/^data:[^;]+;base64,/.test(n)) { for(var o = atob(n.split(',')[1]), t = new Uint8Array(o.length), a = 0; a < o.length; ++a)t[a] = o.charCodeAt(a); i(t.buffer, e) }else{ var _ = new XMLHttpRequest; _.open(e._xhr.method, n, !0), _.withCredentials = e._xhr.withCredentials, _.responseType = 'arraybuffer', e._xhr.headers && Object.keys(e._xhr.headers).forEach(function (n) { _.setRequestHeader(n, e._xhr.headers[n]) }), _.onload = function () { var n = (_.status + '')[0]; if('0' !== n && '2' !== n && '3' !== n)return void e._emit('loaderror', null, 'Failed loading audio file with status: ' + _.status + '.'); i(_.response, e) }, _.onerror = function () { e._webAudio && (e._html5 = !0, e._webAudio = !1, e._sounds = [], delete r[n], e.load()) }, u(_) } }, u = function (e) { try{ e.send() }catch(n) { e.onerror() } }, i = function (e, o) { var t = function () { o._emit('loaderror', null, 'Decoding audio data failed.') }, a = function (e) { e && o._sounds.length > 0 ? (r[o._src] = e, d(o, e)) : t() }; 'undefined' != typeof Promise && 1 === n.ctx.decodeAudioData.length ? n.ctx.decodeAudioData(e).then(a).catch(t) : n.ctx.decodeAudioData(e, a, t) }, d = function (e, n) { n && !e._duration && (e._duration = n.duration), 0 === Object.keys(e._sprite).length && (e._sprite = {__default:[0, 1e3 * e._duration]}), 'loaded' !== e._state && (e._state = 'loaded', e._emit('load'), e._loadQueue()) }, _ = function () { if(n.usingWebAudio) { try{ 'undefined' != typeof AudioContext ? n.ctx = new AudioContext : 'undefined' != typeof webkitAudioContext ? n.ctx = new webkitAudioContext : n.usingWebAudio = !1 }catch(e) { n.usingWebAudio = !1 }n.ctx || (n.usingWebAudio = !1); var e = /iP(hone|od|ad)/.test(n._navigator && n._navigator.platform), o = n._navigator && n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/), t = o ? parseInt(o[1], 10) : null; if(e && t && t < 9) { var r = /safari/.test(n._navigator && n._navigator.userAgent.toLowerCase()); n._navigator && !r && (n.usingWebAudio = !1) }n.usingWebAudio && (n.masterGain = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), n.masterGain.gain.setValueAtTime(n._muted ? 0 : n._volume, n.ctx.currentTime), n.masterGain.connect(n.ctx.destination)), n._setup() } }; 'function' == typeof define && define.amd && define([], function () { return{Howler:n, Howl:o} }), 'undefined' != typeof exports && (exports.Howler = n, exports.Howl = o), 'undefined' != typeof global ? (global.HowlerGlobal = e, global.Howler = n, global.Howl = o, global.Sound = t) : 'undefined' != typeof window && (window.HowlerGlobal = e, window.Howler = n, window.Howl = o, window.Sound = t) }();
 /*! Spatial Plugin */
-!function () { 'use strict';HowlerGlobal.prototype._pos = [0, 0, 0], HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0], HowlerGlobal.prototype.stereo = function (e) { var n = this;if(!n.ctx || !n.ctx.listener)return n;for(var t = n._howls.length - 1;t >= 0;t--)n._howls[t].stereo(e);return n }, HowlerGlobal.prototype.pos = function (e, n, t) { var r = this;return r.ctx && r.ctx.listener ? (n = 'number' != typeof n ? r._pos[1] : n, t = 'number' != typeof t ? r._pos[2] : t, 'number' != typeof e ? r._pos : (r._pos = [e, n, t], void 0 !== r.ctx.listener.positionX ? (r.ctx.listener.positionX.setTargetAtTime(r._pos[0], Howler.ctx.currentTime, .1), r.ctx.listener.positionY.setTargetAtTime(r._pos[1], Howler.ctx.currentTime, .1), r.ctx.listener.positionZ.setTargetAtTime(r._pos[2], Howler.ctx.currentTime, .1)) : r.ctx.listener.setPosition(r._pos[0], r._pos[1], r._pos[2]), r)) : r }, HowlerGlobal.prototype.orientation = function (e, n, t, r, o, i) { var a = this;if(!a.ctx || !a.ctx.listener)return a;var s = a._orientation;return n = 'number' != typeof n ? s[1] : n, t = 'number' != typeof t ? s[2] : t, r = 'number' != typeof r ? s[3] : r, o = 'number' != typeof o ? s[4] : o, i = 'number' != typeof i ? s[5] : i, 'number' != typeof e ? s : (a._orientation = [e, n, t, r, o, i], void 0 !== a.ctx.listener.forwardX ? (a.ctx.listener.forwardX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.forwardY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.forwardZ.setTargetAtTime(t, Howler.ctx.currentTime, .1), a.ctx.listener.upX.setTargetAtTime(r, Howler.ctx.currentTime, .1), a.ctx.listener.upY.setTargetAtTime(o, Howler.ctx.currentTime, .1), a.ctx.listener.upZ.setTargetAtTime(i, Howler.ctx.currentTime, .1)) : a.ctx.listener.setOrientation(e, n, t, r, o, i), a) }, Howl.prototype.init = function (e) { return function (n) { var t = this;return t._orientation = n.orientation || [1, 0, 0], t._stereo = n.stereo || null, t._pos = n.pos || null, t._pannerAttr = {coneInnerAngle:void 0 !== n.coneInnerAngle ? n.coneInnerAngle : 360, coneOuterAngle:void 0 !== n.coneOuterAngle ? n.coneOuterAngle : 360, coneOuterGain:void 0 !== n.coneOuterGain ? n.coneOuterGain : 0, distanceModel:void 0 !== n.distanceModel ? n.distanceModel : 'inverse', maxDistance:void 0 !== n.maxDistance ? n.maxDistance : 1e4, panningModel:void 0 !== n.panningModel ? n.panningModel : 'HRTF', refDistance:void 0 !== n.refDistance ? n.refDistance : 1, rolloffFactor:void 0 !== n.rolloffFactor ? n.rolloffFactor : 1}, t._onstereo = n.onstereo ? [{fn:n.onstereo}] : [], t._onpos = n.onpos ? [{fn:n.onpos}] : [], t._onorientation = n.onorientation ? [{fn:n.onorientation}] : [], e.call(this, n) } }(Howl.prototype.init), Howl.prototype.stereo = function (n, t) { var r = this;if(!r._webAudio)return r;if('loaded' !== r._state)return r._queue.push({event:'stereo', action:function () { r.stereo(n, t) }}), r;var o = void 0 === Howler.ctx.createStereoPanner ? 'spatial' : 'stereo';if(void 0 === t) { if('number' != typeof n)return r._stereo;r._stereo = n, r._pos = [n, 0, 0] }for(var i = r._getSoundIds(t), a = 0;a < i.length;a++) { var s = r._soundById(i[a]);if(s) { if('number' != typeof n)return s._stereo;s._stereo = n, s._pos = [n, 0, 0], s._node && (s._pannerAttr.panningModel = 'equalpower', s._panner && s._panner.pan || e(s, o), 'spatial' === o ? void 0 !== s._panner.positionX ? (s._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime), s._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime)) : s._panner.setPosition(n, 0, 0) : s._panner.pan.setValueAtTime(n, Howler.ctx.currentTime)), r._emit('stereo', s._id) } }return r }, Howl.prototype.pos = function (n, t, r, o) { var i = this;if(!i._webAudio)return i;if('loaded' !== i._state)return i._queue.push({event:'pos', action:function () { i.pos(n, t, r, o) }}), i;if(t = 'number' != typeof t ? 0 : t, r = 'number' != typeof r ? -.5 : r, void 0 === o) { if('number' != typeof n)return i._pos;i._pos = [n, t, r] }for(var a = i._getSoundIds(o), s = 0;s < a.length;s++) { var p = i._soundById(a[s]);if(p) { if('number' != typeof n)return p._pos;p._pos = [n, t, r], p._node && (p._panner && !p._panner.pan || e(p, 'spatial'), void 0 !== p._panner.positionX ? (p._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.positionY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.positionZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setPosition(n, t, r)), i._emit('pos', p._id) } }return i }, Howl.prototype.orientation = function (n, t, r, o) { var i = this;if(!i._webAudio)return i;if('loaded' !== i._state)return i._queue.push({event:'orientation', action:function () { i.orientation(n, t, r, o) }}), i;if(t = 'number' != typeof t ? i._orientation[1] : t, r = 'number' != typeof r ? i._orientation[2] : r, void 0 === o) { if('number' != typeof n)return i._orientation;i._orientation = [n, t, r] }for(var a = i._getSoundIds(o), s = 0;s < a.length;s++) { var p = i._soundById(a[s]);if(p) { if('number' != typeof n)return p._orientation;p._orientation = [n, t, r], p._node && (p._panner || (p._pos || (p._pos = i._pos || [0, 0, -.5]), e(p, 'spatial')), void 0 !== p._panner.orientationX ? (p._panner.orientationX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.orientationY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.orientationZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setOrientation(n, t, r)), i._emit('orientation', p._id) } }return i }, Howl.prototype.pannerAttr = function () { var n, t, r, o = this, i = arguments;if(!o._webAudio)return o;if(0 === i.length)return o._pannerAttr;if(1 === i.length) { if('object' != typeof i[0])return r = o._soundById(parseInt(i[0], 10)), r ? r._pannerAttr : o._pannerAttr;n = i[0], void 0 === t && (n.pannerAttr || (n.pannerAttr = {coneInnerAngle:n.coneInnerAngle, coneOuterAngle:n.coneOuterAngle, coneOuterGain:n.coneOuterGain, distanceModel:n.distanceModel, maxDistance:n.maxDistance, refDistance:n.refDistance, rolloffFactor:n.rolloffFactor, panningModel:n.panningModel}), o._pannerAttr = {coneInnerAngle:void 0 !== n.pannerAttr.coneInnerAngle ? n.pannerAttr.coneInnerAngle : o._coneInnerAngle, coneOuterAngle:void 0 !== n.pannerAttr.coneOuterAngle ? n.pannerAttr.coneOuterAngle : o._coneOuterAngle, coneOuterGain:void 0 !== n.pannerAttr.coneOuterGain ? n.pannerAttr.coneOuterGain : o._coneOuterGain, distanceModel:void 0 !== n.pannerAttr.distanceModel ? n.pannerAttr.distanceModel : o._distanceModel, maxDistance:void 0 !== n.pannerAttr.maxDistance ? n.pannerAttr.maxDistance : o._maxDistance, refDistance:void 0 !== n.pannerAttr.refDistance ? n.pannerAttr.refDistance : o._refDistance, rolloffFactor:void 0 !== n.pannerAttr.rolloffFactor ? n.pannerAttr.rolloffFactor : o._rolloffFactor, panningModel:void 0 !== n.pannerAttr.panningModel ? n.pannerAttr.panningModel : o._panningModel}) }else 2 === i.length && (n = i[0], t = parseInt(i[1], 10));for(var a = o._getSoundIds(t), s = 0;s < a.length;s++)if(r = o._soundById(a[s])) { var p = r._pannerAttr;p = {coneInnerAngle:void 0 !== n.coneInnerAngle ? n.coneInnerAngle : p.coneInnerAngle, coneOuterAngle:void 0 !== n.coneOuterAngle ? n.coneOuterAngle : p.coneOuterAngle, coneOuterGain:void 0 !== n.coneOuterGain ? n.coneOuterGain : p.coneOuterGain, distanceModel:void 0 !== n.distanceModel ? n.distanceModel : p.distanceModel, maxDistance:void 0 !== n.maxDistance ? n.maxDistance : p.maxDistance, refDistance:void 0 !== n.refDistance ? n.refDistance : p.refDistance, rolloffFactor:void 0 !== n.rolloffFactor ? n.rolloffFactor : p.rolloffFactor, panningModel:void 0 !== n.panningModel ? n.panningModel : p.panningModel};var c = r._panner;c ? (c.coneInnerAngle = p.coneInnerAngle, c.coneOuterAngle = p.coneOuterAngle, c.coneOuterGain = p.coneOuterGain, c.distanceModel = p.distanceModel, c.maxDistance = p.maxDistance, c.refDistance = p.refDistance, c.rolloffFactor = p.rolloffFactor, c.panningModel = p.panningModel) : (r._pos || (r._pos = o._pos || [0, 0, -.5]), e(r, 'spatial')) }return o }, Sound.prototype.init = function (e) { return function () { var n = this, t = n._parent;n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, e.call(this), n._stereo ? t.stereo(n._stereo) : n._pos && t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) } }(Sound.prototype.init), Sound.prototype.reset = function (e) { return function () { var n = this, t = n._parent;return n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, n._stereo ? t.stereo(n._stereo) : n._pos ? t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) : n._panner && (n._panner.disconnect(0), n._panner = void 0, t._refreshBuffer(n)), e.call(this) } }(Sound.prototype.reset);var e = function (e, n) { n = n || 'spatial', 'spatial' === n ? (e._panner = Howler.ctx.createPanner(), e._panner.coneInnerAngle = e._pannerAttr.coneInnerAngle, e._panner.coneOuterAngle = e._pannerAttr.coneOuterAngle, e._panner.coneOuterGain = e._pannerAttr.coneOuterGain, e._panner.distanceModel = e._pannerAttr.distanceModel, e._panner.maxDistance = e._pannerAttr.maxDistance, e._panner.refDistance = e._pannerAttr.refDistance, e._panner.rolloffFactor = e._pannerAttr.rolloffFactor, e._panner.panningModel = e._pannerAttr.panningModel, void 0 !== e._panner.positionX ? (e._panner.positionX.setValueAtTime(e._pos[0], Howler.ctx.currentTime), e._panner.positionY.setValueAtTime(e._pos[1], Howler.ctx.currentTime), e._panner.positionZ.setValueAtTime(e._pos[2], Howler.ctx.currentTime)) : e._panner.setPosition(e._pos[0], e._pos[1], e._pos[2]), void 0 !== e._panner.orientationX ? (e._panner.orientationX.setValueAtTime(e._orientation[0], Howler.ctx.currentTime), e._panner.orientationY.setValueAtTime(e._orientation[1], Howler.ctx.currentTime), e._panner.orientationZ.setValueAtTime(e._orientation[2], Howler.ctx.currentTime)) : e._panner.setOrientation(e._orientation[0], e._orientation[1], e._orientation[2])) : (e._panner = Howler.ctx.createStereoPanner(), e._panner.pan.setValueAtTime(e._stereo, Howler.ctx.currentTime)), e._panner.connect(e._node), e._paused || e._parent.pause(e._id, !0).play(e._id, !0) } }();
+!function () { 'use strict'; HowlerGlobal.prototype._pos = [0, 0, 0], HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0], HowlerGlobal.prototype.stereo = function (e) { var n = this; if(!n.ctx || !n.ctx.listener)return n; for(var t = n._howls.length - 1; t >= 0; t--)n._howls[t].stereo(e); return n }, HowlerGlobal.prototype.pos = function (e, n, t) { var r = this; return r.ctx && r.ctx.listener ? (n = 'number' != typeof n ? r._pos[1] : n, t = 'number' != typeof t ? r._pos[2] : t, 'number' != typeof e ? r._pos : (r._pos = [e, n, t], void 0 !== r.ctx.listener.positionX ? (r.ctx.listener.positionX.setTargetAtTime(r._pos[0], Howler.ctx.currentTime, .1), r.ctx.listener.positionY.setTargetAtTime(r._pos[1], Howler.ctx.currentTime, .1), r.ctx.listener.positionZ.setTargetAtTime(r._pos[2], Howler.ctx.currentTime, .1)) : r.ctx.listener.setPosition(r._pos[0], r._pos[1], r._pos[2]), r)) : r }, HowlerGlobal.prototype.orientation = function (e, n, t, r, o, i) { var a = this; if(!a.ctx || !a.ctx.listener)return a; var s = a._orientation; return n = 'number' != typeof n ? s[1] : n, t = 'number' != typeof t ? s[2] : t, r = 'number' != typeof r ? s[3] : r, o = 'number' != typeof o ? s[4] : o, i = 'number' != typeof i ? s[5] : i, 'number' != typeof e ? s : (a._orientation = [e, n, t, r, o, i], void 0 !== a.ctx.listener.forwardX ? (a.ctx.listener.forwardX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.forwardY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.forwardZ.setTargetAtTime(t, Howler.ctx.currentTime, .1), a.ctx.listener.upX.setTargetAtTime(r, Howler.ctx.currentTime, .1), a.ctx.listener.upY.setTargetAtTime(o, Howler.ctx.currentTime, .1), a.ctx.listener.upZ.setTargetAtTime(i, Howler.ctx.currentTime, .1)) : a.ctx.listener.setOrientation(e, n, t, r, o, i), a) }, Howl.prototype.init = function (e) { return function (n) { var t = this; return t._orientation = n.orientation || [1, 0, 0], t._stereo = n.stereo || null, t._pos = n.pos || null, t._pannerAttr = {coneInnerAngle:void 0 !== n.coneInnerAngle ? n.coneInnerAngle : 360, coneOuterAngle:void 0 !== n.coneOuterAngle ? n.coneOuterAngle : 360, coneOuterGain:void 0 !== n.coneOuterGain ? n.coneOuterGain : 0, distanceModel:void 0 !== n.distanceModel ? n.distanceModel : 'inverse', maxDistance:void 0 !== n.maxDistance ? n.maxDistance : 1e4, panningModel:void 0 !== n.panningModel ? n.panningModel : 'HRTF', refDistance:void 0 !== n.refDistance ? n.refDistance : 1, rolloffFactor:void 0 !== n.rolloffFactor ? n.rolloffFactor : 1}, t._onstereo = n.onstereo ? [{fn:n.onstereo}] : [], t._onpos = n.onpos ? [{fn:n.onpos}] : [], t._onorientation = n.onorientation ? [{fn:n.onorientation}] : [], e.call(this, n) } }(Howl.prototype.init), Howl.prototype.stereo = function (n, t) { var r = this; if(!r._webAudio)return r; if('loaded' !== r._state)return r._queue.push({event:'stereo', action:function () { r.stereo(n, t) }}), r; var o = void 0 === Howler.ctx.createStereoPanner ? 'spatial' : 'stereo'; if(void 0 === t) { if('number' != typeof n)return r._stereo; r._stereo = n, r._pos = [n, 0, 0] }for(var i = r._getSoundIds(t), a = 0; a < i.length; a++) { var s = r._soundById(i[a]); if(s) { if('number' != typeof n)return s._stereo; s._stereo = n, s._pos = [n, 0, 0], s._node && (s._pannerAttr.panningModel = 'equalpower', s._panner && s._panner.pan || e(s, o), 'spatial' === o ? void 0 !== s._panner.positionX ? (s._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime), s._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime)) : s._panner.setPosition(n, 0, 0) : s._panner.pan.setValueAtTime(n, Howler.ctx.currentTime)), r._emit('stereo', s._id) } }return r }, Howl.prototype.pos = function (n, t, r, o) { var i = this; if(!i._webAudio)return i; if('loaded' !== i._state)return i._queue.push({event:'pos', action:function () { i.pos(n, t, r, o) }}), i; if(t = 'number' != typeof t ? 0 : t, r = 'number' != typeof r ? -.5 : r, void 0 === o) { if('number' != typeof n)return i._pos; i._pos = [n, t, r] }for(var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if(p) { if('number' != typeof n)return p._pos; p._pos = [n, t, r], p._node && (p._panner && !p._panner.pan || e(p, 'spatial'), void 0 !== p._panner.positionX ? (p._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.positionY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.positionZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setPosition(n, t, r)), i._emit('pos', p._id) } }return i }, Howl.prototype.orientation = function (n, t, r, o) { var i = this; if(!i._webAudio)return i; if('loaded' !== i._state)return i._queue.push({event:'orientation', action:function () { i.orientation(n, t, r, o) }}), i; if(t = 'number' != typeof t ? i._orientation[1] : t, r = 'number' != typeof r ? i._orientation[2] : r, void 0 === o) { if('number' != typeof n)return i._orientation; i._orientation = [n, t, r] }for(var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if(p) { if('number' != typeof n)return p._orientation; p._orientation = [n, t, r], p._node && (p._panner || (p._pos || (p._pos = i._pos || [0, 0, -.5]), e(p, 'spatial')), void 0 !== p._panner.orientationX ? (p._panner.orientationX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.orientationY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.orientationZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setOrientation(n, t, r)), i._emit('orientation', p._id) } }return i }, Howl.prototype.pannerAttr = function () { var n, t, r, o = this, i = arguments; if(!o._webAudio)return o; if(0 === i.length)return o._pannerAttr; if(1 === i.length) { if('object' != typeof i[0])return r = o._soundById(parseInt(i[0], 10)), r ? r._pannerAttr : o._pannerAttr; n = i[0], void 0 === t && (n.pannerAttr || (n.pannerAttr = {coneInnerAngle:n.coneInnerAngle, coneOuterAngle:n.coneOuterAngle, coneOuterGain:n.coneOuterGain, distanceModel:n.distanceModel, maxDistance:n.maxDistance, refDistance:n.refDistance, rolloffFactor:n.rolloffFactor, panningModel:n.panningModel}), o._pannerAttr = {coneInnerAngle:void 0 !== n.pannerAttr.coneInnerAngle ? n.pannerAttr.coneInnerAngle : o._coneInnerAngle, coneOuterAngle:void 0 !== n.pannerAttr.coneOuterAngle ? n.pannerAttr.coneOuterAngle : o._coneOuterAngle, coneOuterGain:void 0 !== n.pannerAttr.coneOuterGain ? n.pannerAttr.coneOuterGain : o._coneOuterGain, distanceModel:void 0 !== n.pannerAttr.distanceModel ? n.pannerAttr.distanceModel : o._distanceModel, maxDistance:void 0 !== n.pannerAttr.maxDistance ? n.pannerAttr.maxDistance : o._maxDistance, refDistance:void 0 !== n.pannerAttr.refDistance ? n.pannerAttr.refDistance : o._refDistance, rolloffFactor:void 0 !== n.pannerAttr.rolloffFactor ? n.pannerAttr.rolloffFactor : o._rolloffFactor, panningModel:void 0 !== n.pannerAttr.panningModel ? n.pannerAttr.panningModel : o._panningModel}) }else 2 === i.length && (n = i[0], t = parseInt(i[1], 10)); for(var a = o._getSoundIds(t), s = 0; s < a.length; s++)if(r = o._soundById(a[s])) { var p = r._pannerAttr; p = {coneInnerAngle:void 0 !== n.coneInnerAngle ? n.coneInnerAngle : p.coneInnerAngle, coneOuterAngle:void 0 !== n.coneOuterAngle ? n.coneOuterAngle : p.coneOuterAngle, coneOuterGain:void 0 !== n.coneOuterGain ? n.coneOuterGain : p.coneOuterGain, distanceModel:void 0 !== n.distanceModel ? n.distanceModel : p.distanceModel, maxDistance:void 0 !== n.maxDistance ? n.maxDistance : p.maxDistance, refDistance:void 0 !== n.refDistance ? n.refDistance : p.refDistance, rolloffFactor:void 0 !== n.rolloffFactor ? n.rolloffFactor : p.rolloffFactor, panningModel:void 0 !== n.panningModel ? n.panningModel : p.panningModel}; var c = r._panner; c ? (c.coneInnerAngle = p.coneInnerAngle, c.coneOuterAngle = p.coneOuterAngle, c.coneOuterGain = p.coneOuterGain, c.distanceModel = p.distanceModel, c.maxDistance = p.maxDistance, c.refDistance = p.refDistance, c.rolloffFactor = p.rolloffFactor, c.panningModel = p.panningModel) : (r._pos || (r._pos = o._pos || [0, 0, -.5]), e(r, 'spatial')) }return o }, Sound.prototype.init = function (e) { return function () { var n = this, t = n._parent; n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, e.call(this), n._stereo ? t.stereo(n._stereo) : n._pos && t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) } }(Sound.prototype.init), Sound.prototype.reset = function (e) { return function () { var n = this, t = n._parent; return n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, n._stereo ? t.stereo(n._stereo) : n._pos ? t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) : n._panner && (n._panner.disconnect(0), n._panner = void 0, t._refreshBuffer(n)), e.call(this) } }(Sound.prototype.reset); var e = function (e, n) { n = n || 'spatial', 'spatial' === n ? (e._panner = Howler.ctx.createPanner(), e._panner.coneInnerAngle = e._pannerAttr.coneInnerAngle, e._panner.coneOuterAngle = e._pannerAttr.coneOuterAngle, e._panner.coneOuterGain = e._pannerAttr.coneOuterGain, e._panner.distanceModel = e._pannerAttr.distanceModel, e._panner.maxDistance = e._pannerAttr.maxDistance, e._panner.refDistance = e._pannerAttr.refDistance, e._panner.rolloffFactor = e._pannerAttr.rolloffFactor, e._panner.panningModel = e._pannerAttr.panningModel, void 0 !== e._panner.positionX ? (e._panner.positionX.setValueAtTime(e._pos[0], Howler.ctx.currentTime), e._panner.positionY.setValueAtTime(e._pos[1], Howler.ctx.currentTime), e._panner.positionZ.setValueAtTime(e._pos[2], Howler.ctx.currentTime)) : e._panner.setPosition(e._pos[0], e._pos[1], e._pos[2]), void 0 !== e._panner.orientationX ? (e._panner.orientationX.setValueAtTime(e._orientation[0], Howler.ctx.currentTime), e._panner.orientationY.setValueAtTime(e._orientation[1], Howler.ctx.currentTime), e._panner.orientationZ.setValueAtTime(e._orientation[2], Howler.ctx.currentTime)) : e._panner.setOrientation(e._orientation[0], e._orientation[1], e._orientation[2])) : (e._panner = Howler.ctx.createStereoPanner(), e._panner.pan.setValueAtTime(e._stereo, Howler.ctx.currentTime)), e._panner.connect(e._node), e._paused || e._parent.pause(e._id, !0).play(e._id, !0) } }();
diff --git a/player/js/3rd_party/transformation-matrix.js b/player/js/3rd_party/transformation-matrix.js
index 47a39f1..2add139 100644
--- a/player/js/3rd_party/transformation-matrix.js
+++ b/player/js/3rd_party/transformation-matrix.js
@@ -184,24 +184,24 @@
          * 001
          */
     _p[0] = a1 * a2 + b1 * e2 + c1 * i2 + d1 * m2;
-    _p[1] = a1 * b2 + b1 * f2 + c1 * j2 + d1 * n2 ;
-    _p[2] = a1 * c2 + b1 * g2 + c1 * k2 + d1 * o2 ;
-    _p[3] = a1 * d2 + b1 * h2 + c1 * l2 + d1 * p2 ;
+    _p[1] = a1 * b2 + b1 * f2 + c1 * j2 + d1 * n2;
+    _p[2] = a1 * c2 + b1 * g2 + c1 * k2 + d1 * o2;
+    _p[3] = a1 * d2 + b1 * h2 + c1 * l2 + d1 * p2;
 
-    _p[4] = e1 * a2 + f1 * e2 + g1 * i2 + h1 * m2 ;
-    _p[5] = e1 * b2 + f1 * f2 + g1 * j2 + h1 * n2 ;
-    _p[6] = e1 * c2 + f1 * g2 + g1 * k2 + h1 * o2 ;
-    _p[7] = e1 * d2 + f1 * h2 + g1 * l2 + h1 * p2 ;
+    _p[4] = e1 * a2 + f1 * e2 + g1 * i2 + h1 * m2;
+    _p[5] = e1 * b2 + f1 * f2 + g1 * j2 + h1 * n2;
+    _p[6] = e1 * c2 + f1 * g2 + g1 * k2 + h1 * o2;
+    _p[7] = e1 * d2 + f1 * h2 + g1 * l2 + h1 * p2;
 
-    _p[8] = i1 * a2 + j1 * e2 + k1 * i2 + l1 * m2 ;
-    _p[9] = i1 * b2 + j1 * f2 + k1 * j2 + l1 * n2 ;
-    _p[10] = i1 * c2 + j1 * g2 + k1 * k2 + l1 * o2 ;
-    _p[11] = i1 * d2 + j1 * h2 + k1 * l2 + l1 * p2 ;
+    _p[8] = i1 * a2 + j1 * e2 + k1 * i2 + l1 * m2;
+    _p[9] = i1 * b2 + j1 * f2 + k1 * j2 + l1 * n2;
+    _p[10] = i1 * c2 + j1 * g2 + k1 * k2 + l1 * o2;
+    _p[11] = i1 * d2 + j1 * h2 + k1 * l2 + l1 * p2;
 
-    _p[12] = m1 * a2 + n1 * e2 + o1 * i2 + p1 * m2 ;
-    _p[13] = m1 * b2 + n1 * f2 + o1 * j2 + p1 * n2 ;
-    _p[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2 ;
-    _p[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2 ;
+    _p[12] = m1 * a2 + n1 * e2 + o1 * i2 + p1 * m2;
+    _p[13] = m1 * b2 + n1 * f2 + o1 * j2 + p1 * n2;
+    _p[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2;
+    _p[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2;
 
     this._identityCalculated = false;
     return this;
@@ -228,7 +228,7 @@
 
   function clone(matr) {
     var i;
-    for(i = 0;i < 16;i += 1) {
+    for(i = 0; i < 16; i += 1) {
       matr.props[i] = this.props[i];
     }
     return matr;
@@ -236,7 +236,7 @@
 
   function cloneFromProps(props) {
     var i;
-    for(i = 0;i < 16;i += 1) {
+    for(i = 0; i < 16; i += 1) {
       this.props[i] = props[i];
     }
   }
@@ -288,7 +288,7 @@
 
   function inversePoints(pts) {
     var i, len = pts.length, retPts = [];
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       retPts[i] = inversePoint(pts[i]);
     }
     return retPts;
diff --git a/player/js/EffectsManager.js b/player/js/EffectsManager.js
index ab5dc8a..f2e0f14 100644
--- a/player/js/EffectsManager.js
+++ b/player/js/EffectsManager.js
@@ -3,7 +3,7 @@
   this.effectElements = [];
   var i, len = effects.length;
   var effectItem;
-  for(i = 0;i < len;i++) {
+  for(i = 0; i < len; i++) {
     effectItem = new GroupEffect(effects[i], element);
     this.effectElements.push(effectItem);
   }
@@ -23,7 +23,7 @@
   this.initDynamicPropertyContainer(element);
   var i, len = this.data.ef.length;
   var eff, effects = this.data.ef;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     eff = null;
     switch(effects[i].ty) {
       case 0:
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 14bada0..62c69c2 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -130,7 +130,7 @@
   var i, len = layers.length;
   var newLayers = data.layers;
   var j, jLen = newLayers.length;
-  for(j = 0;j < jLen;j += 1) {
+  for(j = 0; j < jLen; j += 1) {
     i = 0;
     while(i < len) {
       if(layers[i].id == newLayers[j].id) {
diff --git a/player/js/animation/AnimationItemWorkerOverride.js b/player/js/animation/AnimationItemWorkerOverride.js
index 3d1f959..5941844 100644
--- a/player/js/animation/AnimationItemWorkerOverride.js
+++ b/player/js/animation/AnimationItemWorkerOverride.js
@@ -46,7 +46,7 @@
   var i, len = layers.length;
   var newLayers = data.layers;
   var j, jLen = newLayers.length;
-  for(j = 0;j < jLen;j += 1) {
+  for(j = 0; j < jLen; j += 1) {
     i = 0;
     while(i < len) {
       if(layers[i].id == newLayers[j].id) {
diff --git a/player/js/animation/AnimationManager.js b/player/js/animation/AnimationManager.js
index 21817ee..528d8fe 100644
--- a/player/js/animation/AnimationManager.js
+++ b/player/js/animation/AnimationManager.js
@@ -76,28 +76,28 @@
 
   function setSpeed(val, animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.setSpeed(val, animation);
     }
   }
 
   function setDirection(val, animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.setDirection(val, animation);
     }
   }
 
   function play(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.play(animation);
     }
   }
   function resume(nowTime) {
     var elapsedTime = nowTime - initTime;
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.advanceTime(elapsedTime);
     }
     initTime = nowTime;
@@ -115,35 +115,35 @@
 
   function pause(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.pause(animation);
     }
   }
 
   function goToAndStop(value, isFrame, animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.goToAndStop(value, isFrame, animation);
     }
   }
 
   function stop(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.stop(animation);
     }
   }
 
   function togglePause(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.togglePause(animation);
     }
   }
 
   function destroy(animation) {
     var i;
-    for(i = (len - 1);i >= 0;i -= 1) {
+    for(i = (len - 1); i >= 0; i -= 1) {
       registeredAnimations[i].animation.destroy(animation);
     }
   }
@@ -152,7 +152,7 @@
     var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')),
       [].slice.call(document.getElementsByClassName('bodymovin')));
     var i, len = animElements.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       if(renderer) {
         animElements[i].setAttribute('data-bm-type', renderer);
       }
@@ -175,7 +175,7 @@
 
   function resize() {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.resize();
     }
   }
@@ -200,21 +200,21 @@
 
   function setVolume(val, animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.setVolume(val, animation);
     }
   }
 
   function mute(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.mute(animation);
     }
   }
 
   function unmute(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.unmute(animation);
     }
   }
diff --git a/player/js/animation/AnimationManagerWorkerOverride.js b/player/js/animation/AnimationManagerWorkerOverride.js
index 6bb3aea..b2501ba 100644
--- a/player/js/animation/AnimationManagerWorkerOverride.js
+++ b/player/js/animation/AnimationManagerWorkerOverride.js
@@ -76,28 +76,28 @@
 
   function setSpeed(val, animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.setSpeed(val, animation);
     }
   }
 
   function setDirection(val, animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.setDirection(val, animation);
     }
   }
 
   function play(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.play(animation);
     }
   }
   function resume(nowTime) {
     var elapsedTime = nowTime - initTime;
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.advanceTime(elapsedTime);
     }
     initTime = nowTime;
@@ -115,35 +115,35 @@
 
   function pause(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.pause(animation);
     }
   }
 
   function goToAndStop(value, isFrame, animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.goToAndStop(value, isFrame, animation);
     }
   }
 
   function stop(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.stop(animation);
     }
   }
 
   function togglePause(animation) {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.togglePause(animation);
     }
   }
 
   function destroy(animation) {
     var i;
-    for(i = (len - 1);i >= 0;i -= 1) {
+    for(i = (len - 1); i >= 0; i -= 1) {
       registeredAnimations[i].animation.destroy(animation);
     }
   }
@@ -154,7 +154,7 @@
 
   function resize() {
     var i;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       registeredAnimations[i].animation.resize();
     }
   }
diff --git a/player/js/elements/ShapeElement.js b/player/js/elements/ShapeElement.js
index 5977a60..84eb9b8 100644
--- a/player/js/elements/ShapeElement.js
+++ b/player/js/elements/ShapeElement.js
@@ -4,7 +4,7 @@
 IShapeElement.prototype = {
   addShapeToModifiers: function (data) {
     var i, len = this.shapeModifiers.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       this.shapeModifiers[i].addShape(data);
     }
   },
@@ -22,12 +22,12 @@
       return;
     }
     var i, len = this.shapes.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       this.shapes[i].sh.reset();
     }
 
     len = this.shapeModifiers.length;
-    for(i = len - 1;i >= 0;i -= 1) {
+    for(i = len - 1; i >= 0; i -= 1) {
       this.shapeModifiers[i].processShapes(this._isFirstFrame);
     }
   },
diff --git a/player/js/elements/TextElement.js b/player/js/elements/TextElement.js
index 472d2df..14677a7 100644
--- a/player/js/elements/TextElement.js
+++ b/player/js/elements/TextElement.js
@@ -33,7 +33,7 @@
   var j, jLen = shapes.length;
   var k, kLen, pathNodes;
   var shapeStr = '';
-  for(j = 0;j < jLen;j += 1) {
+  for(j = 0; j < jLen; j += 1) {
     pathNodes = shapes[j].ks.k;
     shapeStr += buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper);
   }
diff --git a/player/js/elements/canvasElements/CVContextData.js b/player/js/elements/canvasElements/CVContextData.js
index a10d0fa..dc66836 100644
--- a/player/js/elements/canvasElements/CVContextData.js
+++ b/player/js/elements/canvasElements/CVContextData.js
@@ -5,7 +5,7 @@
   this.cO = 1;
   var i, len = 15;
   this.savedOp = createTypedArray('float32', len);
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     this.saved[i] = createTypedArray('float32', 16);
   }
   this._length = len;
diff --git a/player/js/elements/canvasElements/CVShapeElement.js b/player/js/elements/canvasElements/CVShapeElement.js
index 8291e2e..f4fab18 100644
--- a/player/js/elements/canvasElements/CVShapeElement.js
+++ b/player/js/elements/canvasElements/CVShapeElement.js
@@ -145,7 +145,7 @@
   var j, jLen;
   var ownStyles = [], ownModifiers = [], processedPos, modifier, currentTransform;
   var ownTransforms = [].concat(transforms);
-  for(i = len;i >= 0;i -= 1) {
+  for(i = len; i >= 0; i -= 1) {
     processedPos = this.searchProcessedElement(arr[i]);
     if(!processedPos) {
       arr[i]._shouldRender = shouldRender;
@@ -165,7 +165,7 @@
         itemsData[i] = this.createGroupElement(arr[i]);
       } else {
         jLen = itemsData[i].it.length;
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           itemsData[i].prevViewData[j] = itemsData[i].it[j];
         }
       }
@@ -211,7 +211,7 @@
   this.removeTransformFromStyleList();
   this.closeStyles(ownStyles);
   len = ownModifiers.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     ownModifiers[i].closed = true;
   }
 };
@@ -236,7 +236,7 @@
 CVShapeElement.prototype.drawLayer = function () {
   var i, len = this.stylesList.length;
   var j, jLen, k, kLen, elems, nodes, renderer = this.globalData.renderer, ctx = this.globalData.canvasContext, type, currentStyle;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     currentStyle = this.stylesList[i];
     type = currentStyle.type;
 
@@ -265,7 +265,7 @@
     }
     renderer.ctxTransform(currentStyle.preTransforms.finalTransform.props);
     jLen = elems.length;
-    for(j = 0;j < jLen;j += 1) {
+    for(j = 0; j < jLen; j += 1) {
       if(type === 'st' || type === 'gs') {
         ctx.beginPath();
         if(currentStyle.da) {
@@ -276,7 +276,7 @@
       nodes = elems[j].trNodes;
       kLen = nodes.length;
 
-      for(k = 0;k < kLen;k += 1) {
+      for(k = 0; k < kLen; k += 1) {
         if(nodes[k].t == 'm') {
           ctx.moveTo(nodes[k].p[0], nodes[k].p[1]);
         }else if(nodes[k].t == 'c') {
@@ -303,7 +303,7 @@
   var i, len = items.length - 1;
   var groupTransform;
   groupTransform = parentTransform;
-  for(i = len;i >= 0;i -= 1) {
+  for(i = len; i >= 0; i -= 1) {
     if(items[i].ty == 'tr') {
       groupTransform = data[i].transform;
       this.renderShapeTransform(parentTransform, groupTransform);
diff --git a/player/js/elements/canvasElements/CVTextElement.js b/player/js/elements/canvasElements/CVTextElement.js
index 0534601..f56ecd6 100644
--- a/player/js/elements/canvasElements/CVTextElement.js
+++ b/player/js/elements/canvasElements/CVTextElement.js
@@ -69,11 +69,11 @@
       this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);
     }
     commands = createSizedArray(jLen);
-    for(j = 0;j < jLen;j += 1) {
+    for(j = 0; j < jLen; j += 1) {
       kLen = shapes[j].ks.k.i.length;
       pathNodes = shapes[j].ks.k;
       pathArr = [];
-      for(k = 1;k < kLen;k += 1) {
+      for(k = 1; k < kLen; k += 1) {
         if(k == 1) {
           pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0], pathNodes.v[0][1], 0), matrixHelper.applyToY(pathNodes.v[0][0], pathNodes.v[0][1], 0));
         }
@@ -115,7 +115,7 @@
   len = letters.length;
   var renderedLetter;
   var lastFill = null, lastStroke = null, lastStrokeW = null, commands, pathArr;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     if(letters[i].n) {
       continue;
     }
@@ -138,7 +138,7 @@
       commands = this.textSpans[i].elem;
       jLen = commands.length;
       this.globalData.canvasContext.beginPath();
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         pathArr = commands[j];
         kLen = pathArr.length;
         this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);
@@ -172,7 +172,7 @@
       commands = this.textSpans[i].elem;
       jLen = commands.length;
       this.globalData.canvasContext.beginPath();
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         pathArr = commands[j];
         kLen = pathArr.length;
         this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);
diff --git a/player/js/elements/helpers/FrameElement.js b/player/js/elements/helpers/FrameElement.js
index 7adae66..62029d5 100644
--- a/player/js/elements/helpers/FrameElement.js
+++ b/player/js/elements/helpers/FrameElement.js
@@ -33,7 +33,7 @@
      */
   prepareProperties: function (num, isVisible) {
     var i, len = this.dynamicProperties.length;
-    for (i = 0;i < len; i += 1) {
+    for (i = 0; i < len; i += 1) {
       if (isVisible || (this._isParent && this.dynamicProperties[i].propType === 'transform')) {
         this.dynamicProperties[i].getValue();
         if (this.dynamicProperties[i]._mdf) {
diff --git a/player/js/elements/helpers/shapes/SVGElementsRenderer.js b/player/js/elements/helpers/shapes/SVGElementsRenderer.js
index cdf2916..68d66d8 100644
--- a/player/js/elements/helpers/shapes/SVGElementsRenderer.js
+++ b/player/js/elements/helpers/shapes/SVGElementsRenderer.js
@@ -40,7 +40,7 @@
     var j, jLen, pathStringTransformed, redraw, pathNodes, l, lLen = itemData.styles.length;
     var lvl = itemData.lvl;
     var paths, mat, props, iterations, k;
-    for(l = 0;l < lLen;l += 1) {
+    for(l = 0; l < lLen; l += 1) {
       redraw = itemData.sh._mdf || isFirstFrame;
       if(itemData.styles[l].lvl < lvl) {
         mat = _matrixHelper.reset();
@@ -68,7 +68,7 @@
       jLen = paths._length;
       if(redraw) {
         pathStringTransformed = '';
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           pathNodes = paths.shapes[j];
           if(pathNodes && pathNodes._length) {
             pathStringTransformed += buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
diff --git a/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js b/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
index a9f807a..c9017da 100644
--- a/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
+++ b/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
@@ -29,7 +29,7 @@
   var stops = [];
   var stop, j, jLen;
   jLen = data.g.p * 4;
-  for(j = 0;j < jLen;j += 4) {
+  for(j = 0; j < jLen; j += 4) {
     stop = createNS('stop');
     gfill.appendChild(stop);
     stops.push(stop);
@@ -55,7 +55,7 @@
     opFill.setAttribute('gradientUnits', 'userSpaceOnUse');
     jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length;
     var stops = this.stops;
-    for(j = data.g.p * 4;j < jLen;j += 2) {
+    for(j = data.g.p * 4; j < jLen; j += 2) {
       stop = createNS('stop');
       stop.setAttribute('stop-color', 'rgb(255,255,255)');
       opFill.appendChild(stop);
diff --git a/player/js/elements/htmlElements/HCameraElement.js b/player/js/elements/htmlElements/HCameraElement.js
index da4d174..d25e357 100644
--- a/player/js/elements/htmlElements/HCameraElement.js
+++ b/player/js/elements/htmlElements/HCameraElement.js
@@ -16,7 +16,7 @@
   }
   if(data.ks.or.k.length && data.ks.or.k[0].to) {
     var i, len = data.ks.or.k.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       data.ks.or.k[i].to = null;
       data.ks.or.k[i].ti = null;
     }
@@ -39,7 +39,7 @@
 
 HCameraElement.prototype.setup = function () {
   var i, len = this.comp.threeDElements.length, comp;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     // [perspectiveElem,container]
     comp = this.comp.threeDElements[i];
     if(comp.type === '3d') {
@@ -61,7 +61,7 @@
   var i, len;
   if(this.hierarchy) {
     len = this.hierarchy.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       _mdf = this.hierarchy[i].finalTransform.mProp._mdf || _mdf;
     }
   }
@@ -113,7 +113,7 @@
     if((hasMatrixChanged || this.pe._mdf) && this.comp.threeDElements) {
       len = this.comp.threeDElements.length;
       var comp;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         comp = this.comp.threeDElements[i];
         if(comp.type === '3d') {
           if(hasMatrixChanged) {
diff --git a/player/js/elements/htmlElements/HTextElement.js b/player/js/elements/htmlElements/HTextElement.js
index 7f4a6ea..a967b06 100644
--- a/player/js/elements/htmlElements/HTextElement.js
+++ b/player/js/elements/htmlElements/HTextElement.js
@@ -64,7 +64,7 @@
   var matrixHelper = this.mHelper;
   var shapes, shapeStr = '';
   var cnt = 0;
-  for (i = 0;i < len ;i += 1) {
+  for (i = 0; i < len; i += 1) {
     if(this.globalData.fontManager.chars) {
       if(!this.textPaths[cnt]) {
         tSpan = createNS('path');
@@ -193,7 +193,7 @@
 
   len = letters.length;
   var renderedLetter, textSpan, textPath;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     if(letters[i].n) {
       count += 1;
       continue;
diff --git a/player/js/elements/svgElements/SVGEffects.js b/player/js/elements/svgElements/SVGEffects.js
index d96affc..153c417 100644
--- a/player/js/elements/svgElements/SVGEffects.js
+++ b/player/js/elements/svgElements/SVGEffects.js
@@ -5,7 +5,7 @@
   var count = 0;
   this.filters = [];
   var filterManager;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     filterManager = null;
     if(elem.data.ef[i].ty === 20) {
       count += 1;
@@ -46,7 +46,7 @@
 
 SVGEffects.prototype.renderFrame = function (_isFirstFrame) {
   var i, len = this.filters.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     this.filters[i].renderFrame(_isFirstFrame);
   }
 };
diff --git a/player/js/elements/svgElements/SVGShapeElement.js b/player/js/elements/svgElements/SVGShapeElement.js
index b01c274..c3afb29 100644
--- a/player/js/elements/svgElements/SVGShapeElement.js
+++ b/player/js/elements/svgElements/SVGShapeElement.js
@@ -198,7 +198,7 @@
   var i, len = arr.length - 1;
   var j, jLen;
   var ownStyles = [], ownModifiers = [], styleOb, currentTransform, modifier, processedPos;
-  for(i = len;i >= 0;i -= 1) {
+  for(i = len; i >= 0; i -= 1) {
     processedPos = this.searchProcessedElement(arr[i]);
     if(!processedPos) {
       arr[i]._render = render;
@@ -220,7 +220,7 @@
         itemsData[i] = this.createGroupElement(arr[i]);
       } else {
         jLen = itemsData[i].it.length;
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           itemsData[i].prevViewData[j] = itemsData[i].it[j];
         }
       }
@@ -267,11 +267,11 @@
     this.addProcessedElement(arr[i], i + 1);
   }
   len = ownStyles.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     ownStyles[i].closed = true;
   }
   len = ownModifiers.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     ownModifiers[i].closed = true;
   }
 };
@@ -279,7 +279,7 @@
 SVGShapeElement.prototype.renderInnerContent = function () {
   this.renderModifiers();
   var i, len = this.stylesList.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     this.stylesList[i].reset();
   }
   this.renderShape();
diff --git a/player/js/elements/svgElements/SVGTextElement.js b/player/js/elements/svgElements/SVGTextElement.js
index 1ce0aa6..9883618 100644
--- a/player/js/elements/svgElements/SVGTextElement.js
+++ b/player/js/elements/svgElements/SVGTextElement.js
@@ -181,7 +181,7 @@
 
       len = letters.length;
       var renderedLetter, textSpan;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         if(letters[i].n) {
           continue;
         }
diff --git a/player/js/elements/svgElements/effects/SVGStrokeEffect.js b/player/js/elements/svgElements/effects/SVGStrokeEffect.js
index 09732d5..395ad63 100644
--- a/player/js/elements/svgElements/effects/SVGStrokeEffect.js
+++ b/player/js/elements/svgElements/effects/SVGStrokeEffect.js
@@ -20,7 +20,7 @@
   groupPath.setAttribute('fill', 'none');
   groupPath.setAttribute('stroke-linecap', 'round');
   groupPath.setAttribute('stroke-dashoffset', 1);
-  for(i;i < len;i += 1) {
+  for(i; i < len; i += 1) {
     path = createNS('path');
     groupPath.appendChild(path);
     this.paths.push({p:path, m:i});
@@ -61,7 +61,7 @@
   }
   var i, len = this.paths.length;
   var mask, path;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     if(this.paths[i].m === -1) {
       continue;
     }
@@ -81,7 +81,7 @@
         var segment = 1 + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v / 100;
         var units = Math.floor(lineLength / segment);
         var j;
-        for(j = 0;j < units;j += 1) {
+        for(j = 0; j < units; j += 1) {
           dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v / 100 + ' ';
         }
         dasharrayValue += '0 ' + l * 10 + ' 0 0';
diff --git a/player/js/mask.js b/player/js/mask.js
index 9127e42..76c12f0 100644
--- a/player/js/mask.js
+++ b/player/js/mask.js
@@ -84,7 +84,7 @@
     if(properties[i].mode == 'i') {
       jLen = currentMasks.length;
       var g = createNS('g');
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         g.appendChild(currentMasks[j]);
       }
       var mask = createNS('mask');
@@ -118,7 +118,7 @@
   this.maskElement = createNS( maskType);
 
   len = currentMasks.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     this.maskElement.appendChild(currentMasks[i]);
   }
 
@@ -178,9 +178,9 @@
 
 MaskElement.prototype.createLayerSolidPath = function () {
   var path = 'M0,0 ';
-  path += ' h' + this.globalData.compSize.w ;
-  path += ' v' + this.globalData.compSize.h ;
-  path += ' h-' + this.globalData.compSize.w ;
+  path += ' h' + this.globalData.compSize.w;
+  path += ' v' + this.globalData.compSize.h;
+  path += ' h-' + this.globalData.compSize.w;
   path += ' v-' + this.globalData.compSize.h + ' ';
   return path;
 };
@@ -189,7 +189,7 @@
   var pathString = ' M' + pathNodes.v[0][0] + ',' + pathNodes.v[0][1];
   var i, len;
   len = pathNodes._length;
-  for(i = 1;i < len;i += 1) {
+  for(i = 1; i < len; i += 1) {
     // pathString += " C"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + " "+pathNodes.i[i][0]+','+pathNodes.i[i][1] + " "+pathNodes.v[i][0]+','+pathNodes.v[i][1];
     pathString += ' C' + pathNodes.o[i - 1][0] + ',' + pathNodes.o[i - 1][1] + ' ' + pathNodes.i[i][0] + ',' + pathNodes.i[i][1] + ' ' + pathNodes.v[i][0] + ',' + pathNodes.v[i][1];
   }
diff --git a/player/js/renderers/BaseRenderer.js b/player/js/renderers/BaseRenderer.js
index cb0b773..8affabd 100644
--- a/player/js/renderers/BaseRenderer.js
+++ b/player/js/renderers/BaseRenderer.js
@@ -47,7 +47,7 @@
 
 BaseRenderer.prototype.buildAllItems = function () {
   var i, len = this.layers.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     this.buildItem(i);
   }
   this.checkPendingElements();
@@ -57,7 +57,7 @@
   this.completeLayers = false;
   var i, len = newLayers.length;
   var j, jLen = this.layers.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     j = 0;
     while(j < jLen) {
       if(this.layers[j].id == newLayers[i].id) {
@@ -107,7 +107,7 @@
 
 BaseRenderer.prototype.searchExtraCompositions = function (assets) {
   var i, len = assets.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     if(assets[i].xt) {
       var comp = this.createComp(assets[i]);
       comp.initExpressions();
diff --git a/player/js/renderers/CanvasRenderer.js b/player/js/renderers/CanvasRenderer.js
index 7b995e2..cfe5837 100644
--- a/player/js/renderers/CanvasRenderer.js
+++ b/player/js/renderers/CanvasRenderer.js
@@ -124,7 +124,7 @@
   this.contextData.cArrPos -= 1;
   var popped = this.contextData.saved[this.contextData.cArrPos];
   var i, arr = this.contextData.cTr.props;
-  for(i = 0;i < 16;i += 1) {
+  for(i = 0; i < 16; i += 1) {
     arr[i] = popped[i];
   }
   this.canvasContext.setTransform(popped[0], popped[1], popped[4], popped[5], popped[12], popped[13]);
diff --git a/player/js/renderers/HybridRenderer.js b/player/js/renderers/HybridRenderer.js
index 946eabb..17a50f1 100644
--- a/player/js/renderers/HybridRenderer.js
+++ b/player/js/renderers/HybridRenderer.js
@@ -157,7 +157,7 @@
   var i, len = this.layers.length;
   var lastThreeDContainerData;
   var currentContainer = '';
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     if(this.layers[i].ddd && this.layers[i].ty !== 3) {
       if(currentContainer !== '3d') {
         currentContainer = '3d';
@@ -285,7 +285,7 @@
     var cWidth = this.globalData.compSize.w;
     var cHeight = this.globalData.compSize.h;
     var i, len = this.threeDElements.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       this.threeDElements[i].perspectiveElem.style.perspective = this.threeDElements[i].perspectiveElem.style.webkitPerspective = Math.sqrt(Math.pow(cWidth, 2) + Math.pow(cHeight, 2)) + 'px';
     }
   }
@@ -294,7 +294,7 @@
 HybridRenderer.prototype.searchExtraCompositions = function (assets) {
   var i, len = assets.length;
   var floatingContainer = createTag('div');
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     if(assets[i].xt) {
       var comp = this.createComp(assets[i], floatingContainer, this.globalData.comp, null);
       comp.initExpressions();
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 9ccf9db..5688314 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -7,7 +7,7 @@
     var animArray, lastFrame;
     var i, len = layers.length;
     var j, jLen, k, kLen;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       layerData = layers[i];
       if(!('ks' in layerData) || layerData.completed) {
         continue;
@@ -21,12 +21,12 @@
       if(layerData.hasMask) {
         var maskProps = layerData.masksProperties;
         jLen = maskProps.length;
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           if(maskProps[j].pt.k.i) {
             convertPathsToAbsoluteValues(maskProps[j].pt.k);
           }else{
             kLen = maskProps[j].pt.k.length;
-            for(k = 0;k < kLen;k += 1) {
+            for(k = 0; k < kLen; k += 1) {
               if(maskProps[j].pt.k[k].s) {
                 convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0]);
               }
@@ -66,13 +66,13 @@
     var i, len = arr.length;
     var j, jLen;
     var hasPaths = false;
-    for(i = len - 1;i >= 0;i -= 1) {
+    for(i = len - 1; i >= 0; i -= 1) {
       if(arr[i].ty == 'sh') {
         if(arr[i].ks.k.i) {
           convertPathsToAbsoluteValues(arr[i].ks.k);
         }else{
           jLen = arr[i].ks.k.length;
-          for(j = 0;j < jLen;j += 1) {
+          for(j = 0; j < jLen; j += 1) {
             if(arr[i].ks.k[j].s) {
               convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0]);
             }
@@ -102,7 +102,7 @@
 
   function convertPathsToAbsoluteValues(path) {
     var i, len = path.i.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       path.i[i][0] += path.v[i][0];
       path.i[i][1] += path.v[i][1];
       path.o[i][0] += path.v[i][0];
@@ -146,7 +146,7 @@
 
     function iterateLayers(layers) {
       var i, len = layers.length;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         if(layers[i].ty === 5) {
           updateTextLayer(layers[i]);
         }
@@ -158,7 +158,7 @@
         iterateLayers(animationData.layers);
         if(animationData.assets) {
           var i, len = animationData.assets.length;
-          for(i = 0;i < len;i += 1) {
+          for(i = 0; i < len; i += 1) {
             if(animationData.assets[i].layers) {
               iterateLayers(animationData.assets[i].layers);
 
@@ -199,13 +199,13 @@
     function iterateShapes(shapes) {
       var i, len = shapes.length;
       var j, jLen;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         if(shapes[i].ty === 'gr') {
           iterateShapes(shapes[i].it);
         }else if(shapes[i].ty === 'fl' || shapes[i].ty === 'st') {
           if(shapes[i].c.k && shapes[i].c.k[0].i) {
             jLen = shapes[i].c.k.length;
-            for(j = 0;j < jLen;j += 1) {
+            for(j = 0; j < jLen; j += 1) {
               if(shapes[i].c.k[j].s) {
                 shapes[i].c.k[j].s[0] /= 255;
                 shapes[i].c.k[j].s[1] /= 255;
@@ -231,7 +231,7 @@
 
     function iterateLayers(layers) {
       var i, len = layers.length;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         if(layers[i].ty === 4) {
           iterateShapes(layers[i].shapes);
         }
@@ -243,7 +243,7 @@
         iterateLayers(animationData.layers);
         if(animationData.assets) {
           var i, len = animationData.assets.length;
-          for(i = 0;i < len;i += 1) {
+          for(i = 0; i < len; i += 1) {
             if(animationData.assets[i].layers) {
               iterateLayers(animationData.assets[i].layers);
 
@@ -263,13 +263,13 @@
       var i, len = arr.length;
       var j, jLen;
       var hasPaths = false;
-      for(i = len - 1;i >= 0;i -= 1) {
+      for(i = len - 1; i >= 0; i -= 1) {
         if(arr[i].ty == 'sh') {
           if(arr[i].ks.k.i) {
             arr[i].ks.k.c = arr[i].closed;
           }else{
             jLen = arr[i].ks.k.length;
-            for(j = 0;j < jLen;j += 1) {
+            for(j = 0; j < jLen; j += 1) {
               if(arr[i].ks.k[j].s) {
                 arr[i].ks.k[j].s[0].c = arr[i].closed;
               }
@@ -289,17 +289,17 @@
       var layerData;
       var i, len = layers.length;
       var j, jLen, k, kLen;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         layerData = layers[i];
         if(layerData.hasMask) {
           var maskProps = layerData.masksProperties;
           jLen = maskProps.length;
-          for(j = 0;j < jLen;j += 1) {
+          for(j = 0; j < jLen; j += 1) {
             if(maskProps[j].pt.k.i) {
               maskProps[j].pt.k.c = maskProps[j].cl;
             }else{
               kLen = maskProps[j].pt.k.length;
-              for(k = 0;k < kLen;k += 1) {
+              for(k = 0; k < kLen; k += 1) {
                 if(maskProps[j].pt.k[k].s) {
                   maskProps[j].pt.k[k].s[0].c = maskProps[j].cl;
                 }
@@ -321,7 +321,7 @@
         iterateLayers(animationData.layers);
         if(animationData.assets) {
           var i, len = animationData.assets.length;
-          for(i = 0;i < len;i += 1) {
+          for(i = 0; i < len; i += 1) {
             if(animationData.assets[i].layers) {
               iterateLayers(animationData.assets[i].layers);
 
diff --git a/player/js/utils/FontManager.js b/player/js/utils/FontManager.js
index 21e1c7d..d17a1a5 100644
--- a/player/js/utils/FontManager.js
+++ b/player/js/utils/FontManager.js
@@ -54,7 +54,7 @@
     var i, len = this.fonts.length;
     var node, w;
     var loadedCount = len;
-    for(i = 0;i < len; i += 1) {
+    for(i = 0; i < len; i += 1) {
       if(this.fonts[i].loaded) {
         loadedCount -= 1;
         continue;
@@ -212,7 +212,7 @@
     }
     var i, len = chars.length;
     var j, jLen = this.chars.length, found;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       j = 0;
       found = false;
       while(j < jLen) {
diff --git a/player/js/utils/TransformProperty.js b/player/js/utils/TransformProperty.js
index fcda771..7584543 100644
--- a/player/js/utils/TransformProperty.js
+++ b/player/js/utils/TransformProperty.js
@@ -177,7 +177,7 @@
       this.rz = PropertyFactory.getProp(elem, data.rz, 0, degToRads, this);
       if(data.or.k[0].ti) {
         var i, len = data.or.k.length;
-        for(i = 0;i < len;i += 1) {
+        for(i = 0; i < len; i += 1) {
           data.or.k[i].to = data.or.k[i].ti = null;
         }
       }
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
index 893a5b9..e84c2bf 100644
--- a/player/js/utils/bez.js
+++ b/player/js/utils/bez.js
@@ -41,10 +41,10 @@
       var point = [], lastPoint = [];
       var lengthData = bezier_length_pool.newElement();
       len = pt3.length;
-      for(k = 0;k < curveSegments;k += 1) {
+      for(k = 0; k < curveSegments; k += 1) {
         perc = k / (curveSegments - 1);
         ptDistance = 0;
-        for(i = 0;i < len;i += 1) {
+        for(i = 0; i < len; i += 1) {
           ptCoord = bm_pow(1 - perc, 3) * pt1[i] + 3 * bm_pow(1 - perc, 2) * perc * pt3[i] + 3 * (1 - perc) * bm_pow(perc, 2) * pt4[i] + bm_pow(perc, 3) * pt2[i];
           point[i] = ptCoord;
           if(lastPoint[i] !== null) {
@@ -73,7 +73,7 @@
     var i, len = shapeData._length;
     var lengths = segmentsLength.lengths;
     var totalLength = 0;
-    for(i = 0;i < len - 1;i += 1) {
+    for(i = 0; i < len - 1; i += 1) {
       lengths[i] = getBezierLength(pathV[i], pathV[i + 1], pathO[i], pathI[i + 1]);
       totalLength += lengths[i].addedLength;
     }
@@ -209,7 +209,7 @@
     var t1u1u1_3 = t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1;
     var t1t1u1_3 = t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1;
     var t1t1t1 = t1 * t1 * t1;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       bezier_segment_points[i * 4] = Math.round((u0u0u0 * pt1[i] + t0u0u0_3 * pt3[i] + t0t0u0_3 * pt4[i] + t0t0t0 * pt2[i]) * 1000) / 1000;
       bezier_segment_points[i * 4 + 1] = Math.round((u0u0u1 * pt1[i] + t0u0u1_3 * pt3[i] + t0t0u1_3 * pt4[i] + t0t0t1 * pt2[i]) * 1000) / 1000;
       bezier_segment_points[i * 4 + 2] = Math.round((u0u1u1 * pt1[i] + t0u1u1_3 * pt3[i] + t0t1u1_3 * pt4[i] + t0t1t1 * pt2[i]) * 1000) / 1000;
diff --git a/player/js/utils/common.js b/player/js/utils/common.js
index b47ff6e..dd11ba3 100644
--- a/player/js/utils/common.js
+++ b/player/js/utils/common.js
@@ -16,7 +16,7 @@
 (function () {
   var propertyNames = ['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'];
   var i, len = propertyNames.length;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     BMMath[propertyNames[i]] = Math[propertyNames[i]];
   }
 }());
@@ -29,7 +29,7 @@
   if(tOfVal === 'object' && val.length) {
     var absArr = createSizedArray(val.length);
     var i, len = val.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       absArr[i] = Math.abs(val[i]);
     }
     return absArr;
@@ -197,7 +197,7 @@
   var colorMap = [];
   var i;
   var hex;
-  for(i = 0;i < 256;i += 1) {
+  for(i = 0; i < 256; i += 1) {
     hex = i.toString(16);
     colorMap[i] = hex.length == 1 ? '0' + hex : hex;
   }
diff --git a/player/js/utils/expressions/EffectInterface.js b/player/js/utils/expressions/EffectInterface.js
index b06e7ac..c34c1a6 100644
--- a/player/js/utils/expressions/EffectInterface.js
+++ b/player/js/utils/expressions/EffectInterface.js
@@ -9,7 +9,7 @@
       var effectElements = [];
       var effectsData = elem.data.ef;
       var i, len = elem.effectsManager.effectElements.length;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         effectElements.push(createGroupInterface(effectsData[i], elem.effectsManager.effectElements[i], propertyGroup, elem));
       }
 
@@ -52,7 +52,7 @@
 
     var effectElements = [];
     var i, len = data.ef.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       if(data.ef[i].ty === 5) {
         effectElements.push(createGroupInterface(data.ef[i], elements.effectElements[i], elements.effectElements[i].propertyGroup, elem));
       } else {
diff --git a/player/js/utils/expressions/ExpressionManager.js b/player/js/utils/expressions/ExpressionManager.js
index 98af50f..0430f30 100644
--- a/player/js/utils/expressions/ExpressionManager.js
+++ b/player/js/utils/expressions/ExpressionManager.js
@@ -21,7 +21,7 @@
     if($bm_isInstanceOfArray(a)) {
       var i, lenA = a.length;
       var retArr = [];
-      for(i = 0;i < lenA;i += 1) {
+      for(i = 0; i < lenA; i += 1) {
         retArr[i] = -a[i];
       }
       return retArr;
@@ -122,7 +122,7 @@
     if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {
       len = a.length;
       arr = createTypedArray('float32', len);
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         arr[i] = a[i] * b;
       }
       return arr;
@@ -130,7 +130,7 @@
     if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) {
       len = b.length;
       arr = createTypedArray('float32', len);
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         arr[i] = a * b[i];
       }
       return arr;
@@ -149,7 +149,7 @@
     if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) {
       len = a.length;
       arr = createTypedArray('float32', len);
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         arr[i] = a[i] / b;
       }
       return arr;
@@ -157,7 +157,7 @@
     if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) {
       len = b.length;
       arr = createTypedArray('float32', len);
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         arr[i] = a / b[i];
       }
       return arr;
@@ -294,7 +294,7 @@
     }
     var i, len = value1.length;
     var arr = createTypedArray('float32', len);
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       arr[i] = value1[i] + (value2[i] - value1[i]) * perc;
     }
     return arr;
@@ -316,7 +316,7 @@
       }
       var arr = createTypedArray('float32', len);
       var rnd = BMMath.random();
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         arr[i] = min[i] + rnd * (max[i] - min[i]);
       }
       return arr;
@@ -386,7 +386,7 @@
       j = 0;
       while(i < iterations) {
         // var rnd = BMMath.random();
-        for(j = 0;j < len;j += 1) {
+        for(j = 0; j < len; j += 1) {
           addedAmps[j] += -amp + amp * 2 * BMMath.random();
           // addedAmps[j] += -amp + amp*2*rnd;
         }
@@ -397,7 +397,7 @@
       var perc = periods - Math.floor(periods);
       var arr = createTypedArray('float32', len);
       if(len > 1) {
-        for(j = 0;j < len;j += 1) {
+        for(j = 0; j < len; j += 1) {
           arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp * 2 * BMMath.random()) * perc;
           // arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*rnd)*perc;
           // arr[i] = this.pv[i] + addedAmp + amp1*perc + amp2*(1-perc);
@@ -492,7 +492,7 @@
           index = 1;
           keyTime = data.k[0].t;
         } else {
-          for(i = 0;i < len - 1;i += 1) {
+          for(i = 0; i < len - 1; i += 1) {
             if(time === data.k[i].t) {
               index = i + 1;
               keyTime = data.k[i].t;
@@ -534,7 +534,7 @@
       var arr = data.k[ind].hasOwnProperty('s') ? data.k[ind].s : data.k[ind - 1].e;
 
       len = arr.length;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         ob[i] = arr[i];
         ob.value[i] = arr[i]
       }
diff --git a/player/js/utils/expressions/ExpressionPropertyDecorator.js b/player/js/utils/expressions/ExpressionPropertyDecorator.js
index 8dc5c5f..125a51f 100644
--- a/player/js/utils/expressions/ExpressionPropertyDecorator.js
+++ b/player/js/utils/expressions/ExpressionPropertyDecorator.js
@@ -40,7 +40,7 @@
         if(this.pv.length) {
           ret = new Array(initV.length);
           len = ret.length;
-          for(i = 0;i < len;i += 1) {
+          for(i = 0; i < len; i += 1) {
             ret[i] = (endV[i] - initV[i]) * repeats + current[i];
           }
           return ret;
@@ -52,7 +52,7 @@
         if(this.pv.length) {
           ret = new Array(lastValue.length);
           len = ret.length;
-          for(i = 0;i < len;i += 1) {
+          for(i = 0; i < len; i += 1) {
             ret[i] = lastValue[i] + (lastValue[i] - nextLastValue[i]) * ((currentFrame - lastKeyFrame) / this.comp.globalData.frameRate) / 0.0005;
           }
           return ret;
@@ -103,7 +103,7 @@
         if(this.pv.length) {
           ret = new Array(initV.length);
           len = ret.length;
-          for(i = 0;i < len;i += 1) {
+          for(i = 0; i < len; i += 1) {
             ret[i] = current[i] - (endV[i] - initV[i]) * repeats;
           }
           return ret;
@@ -115,7 +115,7 @@
         if(this.pv.length) {
           ret = new Array(firstValue.length);
           len = ret.length;
-          for(i = 0;i < len;i += 1) {
+          for(i = 0; i < len; i += 1) {
             ret[i] = firstValue[i] + (firstValue[i] - nextFirstValue[i]) * (firstKeyFrame - currentFrame) / 0.001;
           }
           return ret;
diff --git a/player/js/utils/expressions/LayerInterface.js b/player/js/utils/expressions/LayerInterface.js
index 915edd6..91a7166 100644
--- a/player/js/utils/expressions/LayerInterface.js
+++ b/player/js/utils/expressions/LayerInterface.js
@@ -37,7 +37,7 @@
   function applyPoint(matrix, arr) {
     if(this._elem.hierarchy && this._elem.hierarchy.length) {
       var i, len = this._elem.hierarchy.length;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(matrix);
       }
     }
@@ -47,7 +47,7 @@
   function invertPoint(matrix, arr) {
     if (this._elem.hierarchy && this._elem.hierarchy.length) {
       var i, len = this._elem.hierarchy.length;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(matrix);
       }
     }
@@ -60,7 +60,7 @@
     this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);
     if(this._elem.hierarchy && this._elem.hierarchy.length) {
       var i, len = this._elem.hierarchy.length;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
       }
       return toWorldMat.inversePoint(arr);
diff --git a/player/js/utils/expressions/ShapeInterface.js b/player/js/utils/expressions/ShapeInterface.js
index f73cb5a..a00fb0d 100644
--- a/player/js/utils/expressions/ShapeInterface.js
+++ b/player/js/utils/expressions/ShapeInterface.js
@@ -3,7 +3,7 @@
   function iterateElements(shapes, view, propertyGroup) {
     var arr = [];
     var i, len = shapes ? shapes.length : 0;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       if(shapes[i].ty == 'gr') {
         arr.push(groupInterfaceFactory(shapes[i], view[i], propertyGroup));
       }else if(shapes[i].ty == 'fl') {
diff --git a/player/js/utils/expressions/expressionHelpers.js b/player/js/utils/expressions/expressionHelpers.js
index fb62488..0128036 100644
--- a/player/js/utils/expressions/expressionHelpers.js
+++ b/player/js/utils/expressions/expressionHelpers.js
@@ -28,7 +28,7 @@
     var speed = 0;
     if(v1.length) {
       var i;
-      for(i = 0;i < v1.length;i += 1) {
+      for(i = 0; i < v1.length; i += 1) {
         speed += Math.pow(v2[i] - v1[i], 2);
       }
       speed = Math.sqrt(speed) * 100;
@@ -50,7 +50,7 @@
     if(v1.length) {
       velocity = createTypedArray('float32', v1.length);
       var i;
-      for(i = 0;i < v1.length;i += 1) {
+      for(i = 0; i < v1.length; i += 1) {
         // removing frameRate
         // if needed, don't add it here
         // velocity[i] = this.elem.globalData.frameRate*((v2[i] - v1[i])/delta);
diff --git a/player/js/utils/functionExtensions.js b/player/js/utils/functionExtensions.js
index 28fdb92..1f9ed72 100644
--- a/player/js/utils/functionExtensions.js
+++ b/player/js/utils/functionExtensions.js
@@ -1,6 +1,6 @@
 function extendPrototype(sources, destination) {
   var i, len = sources.length, sourcePrototype;
-  for (i = 0;i < len;i += 1) {
+  for (i = 0; i < len; i += 1) {
     sourcePrototype = sources[i].prototype;
     for (var attr in sourcePrototype) {
       if (sourcePrototype.hasOwnProperty(attr)) destination.prototype[attr] = sourcePrototype[attr];
diff --git a/player/js/utils/helpers/dynamicProperties.js b/player/js/utils/helpers/dynamicProperties.js
index 12f1764..b3f4f08 100644
--- a/player/js/utils/helpers/dynamicProperties.js
+++ b/player/js/utils/helpers/dynamicProperties.js
@@ -10,7 +10,7 @@
   iterateDynamicProperties: function () {
     this._mdf = false;
     var i, len = this.dynamicProperties.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       this.dynamicProperties[i].getValue();
       if(this.dynamicProperties[i]._mdf) {
         this._mdf = true;
diff --git a/player/js/utils/pooling/segments_length_pool.js b/player/js/utils/pooling/segments_length_pool.js
index 3d61229..f937cd7 100644
--- a/player/js/utils/pooling/segments_length_pool.js
+++ b/player/js/utils/pooling/segments_length_pool.js
@@ -9,7 +9,7 @@
 
   function release(element) {
     var i, len = element.lengths.length;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       bezier_length_pool.release(element.lengths[i]);
     }
     element.lengths.length = 0;
diff --git a/player/js/utils/shapes/DashProperty.js b/player/js/utils/shapes/DashProperty.js
index 55fbddc..c562597 100644
--- a/player/js/utils/shapes/DashProperty.js
+++ b/player/js/utils/shapes/DashProperty.js
@@ -32,7 +32,7 @@
     if(this.renderer === 'svg') {
       this.dashStr = '';
     }
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       if(this.dataProps[i].n != 'o') {
         if(this.renderer === 'svg') {
           this.dashStr += ' ' + this.dataProps[i].p.v;
diff --git a/player/js/utils/shapes/GradientProperty.js b/player/js/utils/shapes/GradientProperty.js
index bdd6f26..cf22fe9 100644
--- a/player/js/utils/shapes/GradientProperty.js
+++ b/player/js/utils/shapes/GradientProperty.js
@@ -51,7 +51,7 @@
   if(this.prop._mdf || forceRender) {
     var i, len = this.data.p * 4;
     var mult, val;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       mult = i % 4 === 0 ? 100 : 255;
       val = Math.round(this.prop.v[i] * mult);
       if(this.c[i] !== val) {
@@ -61,7 +61,7 @@
     }
     if(this.o.length) {
       len = this.prop.v.length;
-      for(i = this.data.p * 4;i < len;i += 1) {
+      for(i = this.data.p * 4; i < len; i += 1) {
         mult = i % 2 === 0 ? 100 : 1;
         val = i % 2 === 0 ?  Math.round(this.prop.v[i] * 100) : this.prop.v[i];
         if(this.o[i - this.data.p * 4] !== val) {
diff --git a/player/js/utils/shapes/MouseModifier.js b/player/js/utils/shapes/MouseModifier.js
index b62c57e..a389b58 100644
--- a/player/js/utils/shapes/MouseModifier.js
+++ b/player/js/utils/shapes/MouseModifier.js
@@ -18,7 +18,7 @@
   var dist;
   var theta, x, y;
   /// / OPTION A
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     if(!positions.v[i]) {
       positions.v[i] = [path.v[i][0], path.v[i][1]];
       positions.o[i] = [path.o[i][0], path.o[i][1]];
@@ -187,7 +187,7 @@
     var localMouseCoords = this.elem.globalToLocal([mouseX, mouseY, 0]);
 
     var shapeData, newPaths = [];
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       shapeData = this.shapes[i];
       if(!shapeData.shape._mdf && !this._mdf) {
         shapeData.shape.paths = shapeData.last;
@@ -195,7 +195,7 @@
         shapeData.shape._mdf = true;
         shapePaths = shapeData.shape.paths;
         jLen = shapePaths.length;
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           if(!this.positions[i][j]) {
             this.positions[i][j] = {
               v:[],
diff --git a/player/js/utils/shapes/PuckerAndBloatModifier.js b/player/js/utils/shapes/PuckerAndBloatModifier.js
index 5dda2dc..e809b96 100644
--- a/player/js/utils/shapes/PuckerAndBloatModifier.js
+++ b/player/js/utils/shapes/PuckerAndBloatModifier.js
@@ -39,7 +39,7 @@
 
   if(amount !== 0) {
     var shapeData, newPaths, localShapeCollection;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       shapeData = this.shapes[i];
       newPaths = shapeData.shape.paths;
       localShapeCollection = shapeData.localShapeCollection;
@@ -48,7 +48,7 @@
         shapeData.shape._mdf = true;
         shapePaths = shapeData.shape.paths.shapes;
         jLen = shapeData.shape.paths._length;
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           localShapeCollection.addShape(this.processPath(shapePaths[j], amount));
         }
       }
diff --git a/player/js/utils/shapes/RepeaterModifier.js b/player/js/utils/shapes/RepeaterModifier.js
index c846c8a..fc11578 100644
--- a/player/js/utils/shapes/RepeaterModifier.js
+++ b/player/js/utils/shapes/RepeaterModifier.js
@@ -168,13 +168,13 @@
         this.matrix.transform(sProps[0], sProps[1], sProps[2], sProps[3], sProps[4], sProps[5], sProps[6], sProps[7], sProps[8], sProps[9], sProps[10], sProps[11], sProps[12], sProps[13], sProps[14], sProps[15]);
         this.matrix.transform(pProps[0], pProps[1], pProps[2], pProps[3], pProps[4], pProps[5], pProps[6], pProps[7], pProps[8], pProps[9], pProps[10], pProps[11], pProps[12], pProps[13], pProps[14], pProps[15]);
                 
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           itemsTransform[j] = this.matrix.props[j];
         }
         this.matrix.reset();
       } else {
         this.matrix.reset();
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           itemsTransform[j] = this.matrix.props[j];
         }
       }
diff --git a/player/js/utils/shapes/RoundCornersModifier.js b/player/js/utils/shapes/RoundCornersModifier.js
index 3ef5260..679ca45 100644
--- a/player/js/utils/shapes/RoundCornersModifier.js
+++ b/player/js/utils/shapes/RoundCornersModifier.js
@@ -12,7 +12,7 @@
   var i, len = path._length;
   var currentV, currentI, currentO, closerV, newV, newO, newI, distance, newPosPerc, index = 0;
   var vX, vY, oX, oY, iX, iY;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     currentV = path.v[i];
     currentO = path.o[i];
     currentI = path.i[i];
@@ -68,7 +68,7 @@
 
   if(rd !== 0) {
     var shapeData, newPaths, localShapeCollection;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       shapeData = this.shapes[i];
       newPaths = shapeData.shape.paths;
       localShapeCollection = shapeData.localShapeCollection;
@@ -77,7 +77,7 @@
         shapeData.shape._mdf = true;
         shapePaths = shapeData.shape.paths.shapes;
         jLen = shapeData.shape.paths._length;
-        for(j = 0;j < jLen;j += 1) {
+        for(j = 0; j < jLen; j += 1) {
           localShapeCollection.addShape(this.processPath(shapePaths[j], rd));
         }
       }
diff --git a/player/js/utils/shapes/ShapeProperty.js b/player/js/utils/shapes/ShapeProperty.js
index 0d0cd39..06866d3 100644
--- a/player/js/utils/shapes/ShapeProperty.js
+++ b/player/js/utils/shapes/ShapeProperty.js
@@ -58,8 +58,8 @@
     kLen = keyPropS.i[0].length;
     caching.lastIndex = iterationIndex;
 
-    for(j = 0;j < jLen;j += 1) {
-      for(k = 0;k < kLen;k += 1) {
+    for(j = 0; j < jLen; j += 1) {
+      for(k = 0; k < kLen; k += 1) {
         vertexValue = isHold ? keyPropS.i[j][k] :  keyPropS.i[j][k] + (keyPropE.i[j][k] - keyPropS.i[j][k]) * perc;
         previousValue.i[j][k] = vertexValue;
         vertexValue = isHold ? keyPropS.o[j][k] :  keyPropS.o[j][k] + (keyPropE.o[j][k] - keyPropS.o[j][k]) * perc;
@@ -339,7 +339,7 @@
         currentAng += this.r.v;
         var dir = this.data.d === 3 ? -1 : 1;
         this.v._length = 0;
-        for(i = 0;i < numPts;i += 1) {
+        for(i = 0; i < numPts; i += 1) {
           rad = longFlag ? longRad : shortRad;
           roundness = longFlag ? longRound : shortRound;
           perimSegment = longFlag ? longPerimSegment : shortPerimSegment;
@@ -369,7 +369,7 @@
         var dir = this.data.d === 3 ? -1 : 1;
         currentAng += this.r.v;
         this.v._length = 0;
-        for(i = 0;i < numPts;i += 1) {
+        for(i = 0; i < numPts; i += 1) {
           var x = rad * Math.cos(currentAng);
           var y = rad * Math.sin(currentAng);
           var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y);
diff --git a/player/js/utils/text/TextAnimatorProperty.js b/player/js/utils/text/TextAnimatorProperty.js
index 8b5a004..cfd5b7e 100644
--- a/player/js/utils/text/TextAnimatorProperty.js
+++ b/player/js/utils/text/TextAnimatorProperty.js
@@ -19,7 +19,7 @@
 TextAnimatorProperty.prototype.searchProperties = function () {
   var i, len = this._textData.a.length, animatorProps;
   var getProp = PropertyFactory.getProp;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     animatorProps = this._textData.a[i];
     this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this);
   }
@@ -197,7 +197,7 @@
       xPos = 0;
       yPos += documentData.yOffset;
       yPos += firstLine ? 1 : 0;
-      currentLength = initPathPos ;
+      currentLength = initPathPos;
       firstLine = false;
       lineLength = 0;
       if(this._hasMaskedPath) {
@@ -301,7 +301,7 @@
       }
 
       lineLength += letters[i].l / 2;
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         animatorProps = animators[j].a;
         if (animatorProps.t.propType) {
           animatorSelector = animators[j].s;
@@ -338,7 +338,7 @@
       if(documentData.fillColorAnim && documentData.fc) {
         fc = [documentData.fc[0], documentData.fc[1], documentData.fc[2]];
       }
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         animatorProps = animators[j].a;
         if (animatorProps.a.propType) {
           animatorSelector = animators[j].s;
@@ -351,7 +351,7 @@
           }
         }
       }
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         animatorProps = animators[j].a;
         if (animatorProps.s.propType) {
           animatorSelector = animators[j].s;
@@ -363,7 +363,7 @@
           }
         }
       }
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         animatorProps = animators[j].a;
         animatorSelector = animators[j].s;
         mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
@@ -411,7 +411,7 @@
           }
         }
         if (documentData.strokeColorAnim && animatorProps.sc.propType) {
-          for(k = 0;k < 3;k += 1) {
+          for(k = 0; k < 3; k += 1) {
             if(mult.length) {
               sc[k] = sc[k] + (animatorProps.sc.v[k] - sc[k]) * mult[0];
             } else {
@@ -421,7 +421,7 @@
         }
         if (documentData.fillColorAnim && documentData.fc) {
           if(animatorProps.fc.propType) {
-            for(k = 0;k < 3;k += 1) {
+            for(k = 0; k < 3; k += 1) {
               if(mult.length) {
                 fc[k] = fc[k] + (animatorProps.fc.v[k] - fc[k]) * mult[0];
               } else {
@@ -453,7 +453,7 @@
         }
       }
 
-      for(j = 0;j < jLen;j += 1) {
+      for(j = 0; j < jLen; j += 1) {
         animatorProps = animators[j].a;
 
         if (animatorProps.p.propType) {
diff --git a/player/js/utils/text/TextProperty.js b/player/js/utils/text/TextProperty.js
index ace1617..b657680 100644
--- a/player/js/utils/text/TextProperty.js
+++ b/player/js/utils/text/TextProperty.js
@@ -182,7 +182,7 @@
   var fWeight = 'normal', fStyle = 'normal';
   len = styles.length;
   var styleName;
-  for(i = 0;i < len;i += 1) {
+  for(i = 0; i < len; i += 1) {
     styleName = styles[i].toLowerCase();
     switch(styleName) {
       case 'italic':
@@ -227,7 +227,7 @@
       len = finalText.length;
       trackingOffset = documentData.tr / 1000 * documentData.finalSize;
       var lastSpaceIndex = -1;
-      for(i = 0;i < len;i += 1) {
+      for(i = 0; i < len; i += 1) {
         charCode = finalText[i].charCodeAt(0);
         newLineFlag = false;
         if(finalText[i] === ' ') {
@@ -276,7 +276,7 @@
   cLength = 0;
   var uncollapsedSpaces = 0;
   var currentChar;
-  for (i = 0;i < len ;i += 1) {
+  for (i = 0; i < len; i += 1) {
     newLineFlag = false;
     currentChar = documentData.finalText[i];
     charCode = currentChar.charCodeAt(0);
@@ -368,7 +368,7 @@
   var animators = data.a, animatorData, letterData;
   jLen = animators.length;
   var based, ind, indexes = [];
-  for(j = 0;j < jLen;j += 1) {
+  for(j = 0; j < jLen; j += 1) {
     animatorData = animators[j];
     if(animatorData.a.sc) {
       documentData.strokeColorAnim = true;
@@ -381,7 +381,7 @@
     }
     ind = 0;
     based = animatorData.s.b;
-    for(i = 0;i < len;i += 1) {
+    for(i = 0; i < len; i += 1) {
       letterData = letters[i];
       letterData.anIndexes[j] = ind;
       if((based == 1 && letterData.val !== '') || (based == 2 && letterData.val !== '' && letterData.val !== ' ') || (based == 3 && (letterData.n || letterData.val == ' ' || i == len - 1)) || (based == 4 && (letterData.n || i == len - 1))) {