integrated" lang="enPortuguesesubstituteindividualimpossiblemultimediaalmost allpx solid #apart fromsubject toin Englishcriticizedexcept forguidelinesoriginallyremarkablethe secondh2 class="collection\r\nfunctionvisibilitythe use ofvolunteersattractionunder the threatened*\nevaluationemphasizedaccessiblesuccessionalong withMeanwhile,industries has becomeaspects ofTelevisionsufficientbasketballboth sidescontinuingan articlepublishersJournal ofdifficultyfacilitateacceptablestyle.css"\tfunction innovation>Copyrightsituationswould havebusinessesDictionarystatementsoften usedpersistentin Januarycomprising\n\tdiplomaticcontainingperformingextensionsmay not beconcept of onclick="It is alsofinancial making theLuxembourgadditionalare calledengaged in"script");but it waselectroniconsubmit="\n\x3c!-- End electricalofficiallysuggestiontop of theunlike theAustralianOriginallyreferences\n\r\nrecognisedinitializelimited toAlexandriaretirementAdventuresfour years\n\n<!-- increasingdecorationh3 class="origins ofobligationregulationclassified(function(advantagesbeing the historiansthe publicmany yearswhich wereover time,synonymouscontent">\npresumablyhis familyuserAgent.unexpectedincluding challengeda minorityundefined"belongs totaken fromin Octoberposition: said to bereligious Federation rowspan="only a fewmeant thatled to the--\x3e\r\n
Archbishop class="nobeing usedapproachesprivilegesnoscript>\nresults inmay be theEaster eggmechanismsreasonablePopulationCollectionselected">noscript>\r/index.phparrival of-jssdk\'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that\n\t\tcomplaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype="absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php?\npercentagebest-knowncreating a" dir="ltrLieutenant\n
is said tostructuralreferendummost oftena separate->\n
\r
-
+
@@ -302,6 +305,7 @@
+
diff --git a/docker/src/scripts/anime/player.js b/docker/src/scripts/anime/player.js
index d57c92d..8a57ed5 100644
--- a/docker/src/scripts/anime/player.js
+++ b/docker/src/scripts/anime/player.js
@@ -15,6 +15,7 @@ const AnimePlayer = (function() {
let _localEntryId = null;
let _totalEpisodes = 0;
let _manualExtensionId = null;
+ let _activeSubtitleIndex = -1;
let hlsInstance = null;
let subtitleRenderer = null;
@@ -448,48 +449,6 @@ const AnimePlayer = (function() {
if (_rpcActive) sendRPC({ paused: true });
}
- function onTimeUpdate() {
- if (!els.video) return;
-
- // Update progress bar
- const percent = (els.video.currentTime / els.video.duration) * 100;
- if (els.progressPlayed) {
- els.progressPlayed.style.width = `${percent}%`;
- }
- if (els.progressHandle) {
- els.progressHandle.style.left = `${percent}%`;
- }
-
- // Update time display
- if (els.timeDisplay) {
- const current = formatTime(els.video.currentTime);
- const total = formatTime(els.video.duration);
- els.timeDisplay.textContent = `${current} / ${total}`;
- }
-
- // Update progress for AniList
- if (!_progressUpdated && els.video.duration) {
- const percentage = els.video.currentTime / els.video.duration;
- if (percentage >= 0.8) {
- updateProgress();
- _progressUpdated = true;
- }
- }
-
- // Update subtitles - SAFE CHECK
- // We only call setCurrentTime if renderer exists AND is not in disposed state
- if (subtitleRenderer) {
- try {
- subtitleRenderer.setCurrentTime(els.video.currentTime);
- } catch (e) {
- // If the worker is dead or instance is invalid, silence the error
- // and potentially nullify the renderer to stop further attempts
- console.warn("Subtitle renderer error during timeupdate:", e);
- subtitleRenderer = null;
- }
- }
- }
-
function onProgress() {
if (!els.video || !els.progressBuffer) return;
if (els.video.buffered.length > 0) {
@@ -747,11 +706,27 @@ const AnimePlayer = (function() {
if (hlsInstance) hlsInstance.audioTrack = parseInt(value);
} else if (type === 'subtitle') {
const idx = parseInt(value);
+ _activeSubtitleIndex = idx; // <--- ACTUALIZAMOS EL ESTADO AQUÍ
+
+ // 1. Lógica nativa (para mantener compatibilidad interna)
if (els.video && els.video.textTracks) {
Array.from(els.video.textTracks).forEach((track, i) => {
- track.mode = (i === idx) ? 'showing' : 'hidden';
+ // Si usamos JASSUB, ocultamos la nativa. Si no, mostramos la seleccionada.
+ track.mode = (subtitleRenderer && idx !== -1) ? 'hidden' : ((i === idx) ? 'showing' : 'hidden');
});
}
+
+ // 2. Lógica de JASSUB
+ if (subtitleRenderer) {
+ if (idx === -1) {
+ subtitleRenderer.dispose();
+ } else {
+ const sub = _currentSubtitles[idx];
+ if (sub) {
+ subtitleRenderer.setTrack(sub.src);
+ }
+ }
+ }
} else if (type === 'speed') {
if (els.video) els.video.playbackRate = parseFloat(value);
}
@@ -762,45 +737,79 @@ const AnimePlayer = (function() {
}
function getActiveSubtitleIndex() {
- if (!els.video || !els.video.textTracks) return -1;
- for (let i = 0; i < els.video.textTracks.length; i++) {
- if (els.video.textTracks[i].mode === 'showing') return i;
- }
- return -1;
+ return _activeSubtitleIndex;
}
- // Subtitle renderer with libass
async function initSubtitleRenderer() {
- if (!window.SubtitlesOctopus || !els.video || !els.subtitlesCanvas) return;
+ if (!els.video) return;
- // Ensure clean slate
+ // Cleanup previous instance
if (subtitleRenderer) {
- try { subtitleRenderer.dispose(); } catch(e) { console.warn(e); }
+ try {
+ subtitleRenderer.dispose();
+ } catch(e) {
+ console.warn('Error disposing renderer:', e);
+ }
subtitleRenderer = null;
}
// Find ASS subtitle
const assSubtitle = _currentSubtitles.find(sub =>
- sub.src && (sub.src.endsWith('.ass') || sub.label?.toLowerCase().includes('ass'))
+ (sub.src && sub.src.endsWith('.ass')) ||
+ (sub.label && sub.label.toLowerCase().includes('ass'))
);
- if (!assSubtitle) return;
+ if (!assSubtitle) {
+ console.log('No ASS subtitles found in current list');
+ return;
+ }
try {
- subtitleRenderer = new SubtitlesOctopus({
- video: els.video,
- canvas: els.subtitlesCanvas,
- subUrl: assSubtitle.src,
- fonts: [],
- workerUrl: '/libs/subtitles-octopus-worker.js',
- legacyWorkerUrl: '/libs/subtitles-octopus-worker-legacy.js',
- });
+ console.log('Initializing JASSUB for:', assSubtitle.label);
+
+ // Check if JASSUB global is available
+ if (window.SubtitleRenderer && typeof window.JASSUB !== 'undefined') {
+ // --- CAMBIO AQUÍ: Pasamos els.subtitlesCanvas ---
+ subtitleRenderer = new SubtitleRenderer(els.video, els.subtitlesCanvas);
+ await subtitleRenderer.init(assSubtitle.src);
+ } else {
+ console.warn('JASSUB library not loaded.');
+ }
} catch (e) {
- console.error('Subtitle renderer error:', e);
+ console.error('Subtitle renderer setup error:', e);
subtitleRenderer = null;
}
}
+ function onTimeUpdate() {
+ if (!els.video) return;
+
+ // Update progress bar
+ const percent = (els.video.currentTime / els.video.duration) * 100;
+ if (els.progressPlayed) {
+ els.progressPlayed.style.width = `${percent}%`;
+ }
+ if (els.progressHandle) {
+ els.progressHandle.style.left = `${percent}%`;
+ }
+
+ // Update time display
+ if (els.timeDisplay) {
+ const current = formatTime(els.video.currentTime);
+ const total = formatTime(els.video.duration);
+ els.timeDisplay.textContent = `${current} / ${total}`;
+ }
+
+ // Update progress for AniList
+ if (!_progressUpdated && els.video.duration) {
+ const percentage = els.video.currentTime / els.video.duration;
+ if (percentage >= 0.8) {
+ updateProgress();
+ _progressUpdated = true;
+ }
+ }
+ }
+
// Player lifecycle
async function playEpisode(episodeNumber) {
const targetEp = parseInt(episodeNumber);
@@ -1163,62 +1172,56 @@ const AnimePlayer = (function() {
}
function initVideoPlayer(url, type, subtitles = []) {
- // Double check cleanup
+ // 1. CLEANUP FIRST: Destroy subtitle renderer while elements still exist
+ // This prevents "removeChild" errors because the DOM is still intact
+ if (subtitleRenderer) {
+ try {
+ subtitleRenderer.dispose();
+ } catch(e) {
+ console.warn('Renderer dispose error (clean):', e);
+ }
+ subtitleRenderer = null;
+ }
+
+ // 2. Destroy HLS instance
if (hlsInstance) {
hlsInstance.destroy();
hlsInstance = null;
}
- if (subtitleRenderer) {
- try { subtitleRenderer.dispose(); } catch(e) {}
- subtitleRenderer = null;
- }
const container = document.querySelector('.video-frame');
if (!container) return;
- // --- SAFE VIDEO ELEMENT REPLACEMENT ---
+ // 3. Remove OLD Elements
const oldVideo = container.querySelector('video');
+ const oldCanvas = container.querySelector('#subtitles-canvas');
+
if (oldVideo) {
- try {
- // Remove listeners to stop events from firing during removal
- oldVideo.ontimeupdate = null;
- oldVideo.onplay = null;
- oldVideo.onpause = null;
-
- // Stop playback
- oldVideo.pause();
- oldVideo.removeAttribute('src');
- oldVideo.load(); // Forces media unload
-
- // Remove from DOM
- if (oldVideo.parentNode) {
- oldVideo.parentNode.removeChild(oldVideo);
- } else {
- oldVideo.remove();
- }
- } catch (e) {
- console.warn("Error cleaning up old video element:", e);
- // Continue anyway, we need to create the new player
- }
+ oldVideo.removeAttribute('src');
+ oldVideo.load();
+ oldVideo.remove();
+ }
+ if (oldCanvas) {
+ oldCanvas.remove();
}
+ // 4. Create NEW Elements
const newVideo = document.createElement('video');
newVideo.id = 'player';
newVideo.crossOrigin = 'anonymous';
newVideo.playsInline = true;
- // Insert new video carefully
- if (container.firstChild) {
- container.insertBefore(newVideo, container.firstChild);
- } else {
- container.appendChild(newVideo);
- }
+ const newCanvas = document.createElement('canvas');
+ newCanvas.id = 'subtitles-canvas';
+ container.appendChild(newCanvas)
+ container.appendChild(newVideo);
els.video = newVideo;
+ els.subtitlesCanvas = newCanvas;
- // Re-setup control listeners
setupCustomControls();
+ // 5. Initialize Player (HLS or Native)
if (Hls.isSupported() && type === 'm3u8') {
hlsInstance = new Hls({
enableWorker: true,
@@ -1240,49 +1243,63 @@ const AnimePlayer = (function() {
if (els.loader) els.loader.style.display = 'none';
});
- hlsInstance.on(Hls.Events.LEVEL_SWITCHED, () => {
- buildSettingsPanel();
- });
+ hlsInstance.on(Hls.Events.LEVEL_SWITCHED, () => buildSettingsPanel());
+ hlsInstance.on(Hls.Events.AUDIO_TRACK_SWITCHED, () => buildSettingsPanel());
- hlsInstance.on(Hls.Events.AUDIO_TRACK_SWITCHED, () => {
- buildSettingsPanel();
- });
-
- if (els.downloadBtn) {
- els.downloadBtn.style.display = 'flex';
- }
-
- } else if (els.video.canPlayType('application/vnd.apple.mpegurl') && type === 'm3u8') {
- // Native HLS support (Safari)
- els.video.src = url;
- attachSubtitles(subtitles);
- buildSettingsPanel();
- els.video.play().catch(() => {});
- if(els.loader) els.loader.style.display = 'none';
- if (els.downloadBtn) {
- els.downloadBtn.style.display = 'flex';
- }
} else {
els.video.src = url;
attachSubtitles(subtitles);
buildSettingsPanel();
els.video.play().catch(() => {});
if(els.loader) els.loader.style.display = 'none';
- if (els.downloadBtn) {
- els.downloadBtn.style.display = 'none';
- }
+ if (els.downloadBtn) els.downloadBtn.style.display = 'flex';
}
- // Try to init ASS subtitle renderer
- initSubtitleRenderer();
+ // 6. Init Subtitles with explicit delay
+ // We use setTimeout instead of requestAnimationFrame to let the Layout Engine catch up
+ if (type === 'm3u8') {
+ hlsInstance.on(Hls.Events.MANIFEST_PARSED, () => {
+ attachSubtitles(subtitles);
+ buildSettingsPanel();
+ if (els.downloadBtn) els.downloadBtn.style.display = 'flex';
+
+ // IMPORTANTE: Esperar a loadedmetadata antes de init subtitles
+ if (els.video.readyState >= 1) {
+ initSubtitleRenderer();
+ } else {
+ els.video.addEventListener('loadedmetadata', () => {
+ initSubtitleRenderer();
+ }, { once: true });
+ }
+
+ els.video.play().catch(() => {});
+ if (els.loader) els.loader.style.display = 'none';
+ });
+ } else {
+ els.video.src = url;
+ attachSubtitles(subtitles);
+ buildSettingsPanel();
+
+ // Para video directo, esperar metadata
+ els.video.addEventListener('loadedmetadata', () => {
+ initSubtitleRenderer();
+ }, { once: true });
+
+ els.video.play().catch(() => {});
+ if(els.loader) els.loader.style.display = 'none';
+ if (els.downloadBtn) els.downloadBtn.style.display = 'flex';
+ }
}
function attachSubtitles(subtitles) {
if (!els.video) return;
- // Remove existing tracks
+ _activeSubtitleIndex = -1;
+
Array.from(els.video.querySelectorAll('track')).forEach(t => t.remove());
+ if (subtitles.length === 0) return;
+
subtitles.forEach((sub, i) => {
const track = document.createElement('track');
track.kind = 'subtitles';
@@ -1293,10 +1310,15 @@ const AnimePlayer = (function() {
els.video.appendChild(track);
});
- // Enable first track
setTimeout(() => {
if (els.video.textTracks && els.video.textTracks.length > 0) {
- els.video.textTracks[0].mode = 'showing';
+ _activeSubtitleIndex = 0;
+
+ if (!subtitleRenderer) {
+ els.video.textTracks[0].mode = 'showing';
+ } else {
+ els.video.textTracks[0].mode = 'hidden';
+ }
}
}, 100);
}
diff --git a/docker/src/scripts/anime/subtitle-renderer.js b/docker/src/scripts/anime/subtitle-renderer.js
new file mode 100644
index 0000000..fe07912
--- /dev/null
+++ b/docker/src/scripts/anime/subtitle-renderer.js
@@ -0,0 +1,161 @@
+const BASE_PATH = '/src/scripts/jassub/';
+
+class SubtitleRenderer {
+ // 1. Aceptamos 'canvas' en el constructor
+ constructor(video, canvas) {
+ this.video = video;
+ this.canvas = canvas;
+ this.instance = null;
+ this.currentUrl = null;
+ }
+
+ async init(subtitleUrl) {
+ if (!this.video || !this.canvas) return; // 2. Verificamos canvas
+
+ this.dispose();
+
+ const finalUrl = subtitleUrl.includes('/api/proxy')
+ ? subtitleUrl
+ : `/api/proxy?url=${encodeURIComponent(subtitleUrl)}`;
+
+ this.currentUrl = finalUrl;
+
+ try {
+ this.instance = new JASSUB({
+ video: this.video,
+ canvas: this.canvas,
+ subUrl: finalUrl,
+
+ workerUrl: `${BASE_PATH}jassub-worker.js`,
+ wasmUrl: `${BASE_PATH}jassub-worker.wasm`,
+ modernWasmUrl: `${BASE_PATH}jassub-worker-modern.wasm`,
+
+ blendMode: 'js',
+ asyncRender: true,
+ onDemand: true,
+ targetFps: 60,
+ debug: false
+ });
+
+ console.log('JASSUB initialized for:', finalUrl);
+
+ } catch (e) {
+ console.error("JASSUB Init Error:", e);
+ }
+ }
+
+ resize() {
+ if (this.instance && this.instance.resize) {
+ this.instance.resize();
+ }
+ }
+
+ setTrack(url) {
+ const finalUrl = url.includes('/api/proxy')
+ ? url
+ : `/api/proxy?url=${encodeURIComponent(url)}`;
+
+ if (this.instance) {
+ this.instance.setTrackByUrl(finalUrl);
+ this.currentUrl = finalUrl;
+ } else {
+ this.init(url);
+ }
+ }
+
+ dispose() {
+ if (this.instance) {
+ try {
+ this.instance.destroy();
+ } catch (e) {
+ console.warn("Error destroying JASSUB:", e);
+ }
+ this.instance = null;
+ }
+ }
+}
+
+// Simple Renderer remains unchanged for SRT/VTT (Non-ASS)
+class SimpleSubtitleRenderer {
+ constructor(video, canvas) {
+ this.video = video;
+ this.canvas = canvas;
+ this.ctx = canvas.getContext('2d');
+ this.cues = [];
+ this.destroyed = false;
+
+ this.setupCanvas();
+ this.video.addEventListener('timeupdate', () => this.render());
+ }
+
+ setupCanvas() {
+ const updateSize = () => {
+ if (!this.video || !this.canvas) return;
+ const rect = this.video.getBoundingClientRect();
+ this.canvas.width = rect.width;
+ this.canvas.height = rect.height;
+ };
+ updateSize();
+ window.addEventListener('resize', updateSize);
+ this.resizeHandler = updateSize;
+ }
+
+ async loadSubtitles(url) {
+ try {
+ const response = await fetch(`/api/proxy?url=${encodeURIComponent(url)}`);
+ const text = await response.text();
+ this.cues = this.parseSRT(text);
+ } catch (error) {
+ console.error('Failed to load subtitles:', error);
+ }
+ }
+
+ parseSRT(srtText) {
+ const blocks = srtText.trim().split('\n\n');
+ return blocks.map(block => {
+ const lines = block.split('\n');
+ if (lines.length < 3) return null;
+ const timeMatch = lines[1].match(/(\d{2}):(\d{2}):(\d{2}),(\d{3}) --> (\d{2}):(\d{2}):(\d{2}),(\d{3})/);
+ if (!timeMatch) return null;
+ const start = parseInt(timeMatch[1]) * 3600 + parseInt(timeMatch[2]) * 60 + parseInt(timeMatch[3]) + parseInt(timeMatch[4]) / 1000;
+ const end = parseInt(timeMatch[5]) * 3600 + parseInt(timeMatch[6]) * 60 + parseInt(timeMatch[7]) + parseInt(timeMatch[8]) / 1000;
+ const text = lines.slice(2).join('\n');
+ return { start, end, text };
+ }).filter(Boolean);
+ }
+
+ render() {
+ if (this.destroyed) return;
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
+ const currentTime = this.video.currentTime;
+ const cue = this.cues.find(c => currentTime >= c.start && currentTime <= c.end);
+ if (cue) this.drawSubtitle(cue.text);
+ }
+
+ drawSubtitle(text) {
+ const lines = text.split('\n');
+ const fontSize = Math.max(20, this.canvas.height * 0.04);
+ this.ctx.font = `bold ${fontSize}px Arial, sans-serif`;
+ this.ctx.textAlign = 'center';
+ this.ctx.textBaseline = 'bottom';
+ const lineHeight = fontSize * 1.2;
+ const startY = this.canvas.height - 60;
+ lines.reverse().forEach((line, index) => {
+ const y = startY - (index * lineHeight);
+ this.ctx.strokeStyle = 'black';
+ this.ctx.lineWidth = 4;
+ this.ctx.strokeText(line, this.canvas.width / 2, y);
+ this.ctx.fillStyle = 'white';
+ this.ctx.fillText(line, this.canvas.width / 2, y);
+ });
+ }
+
+ dispose() {
+ this.destroyed = true;
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
+ if (this.resizeHandler) window.removeEventListener('resize', this.resizeHandler);
+ }
+}
+
+window.SubtitleRenderer = SubtitleRenderer;
+window.SimpleSubtitleRenderer = SimpleSubtitleRenderer;
\ No newline at end of file
diff --git a/docker/src/scripts/jassub/default.woff2 b/docker/src/scripts/jassub/default.woff2
new file mode 100644
index 0000000..a562391
Binary files /dev/null and b/docker/src/scripts/jassub/default.woff2 differ
diff --git a/docker/src/scripts/jassub/jassub-worker-modern.wasm b/docker/src/scripts/jassub/jassub-worker-modern.wasm
new file mode 100644
index 0000000..7f728e4
Binary files /dev/null and b/docker/src/scripts/jassub/jassub-worker-modern.wasm differ
diff --git a/docker/src/scripts/jassub/jassub-worker.js b/docker/src/scripts/jassub/jassub-worker.js
new file mode 100644
index 0000000..af6b88f
--- /dev/null
+++ b/docker/src/scripts/jassub/jassub-worker.js
@@ -0,0 +1,11 @@
+"use strict";async function Module(i={}){var g,v=i,y=(...t)=>console.log(...t),h=(...t)=>console.error(...t);function T(){j?.(v)}G=(t=>()=>{t(),self.wasmMemory=B,self.HEAPU8C=new Uint8ClampedArray(B.buffer),self.HEAPU8=new Uint8Array(B.buffer)})(G);function P(t){throw t}var j,w,C,A,M,E,O,ie,oe,le=!1;function G(){var t=B.buffer;w=new Int8Array(t),A=new Int16Array(t),C=new Uint8Array(t),M=new Uint16Array(t),E=new Int32Array(t),O=new Uint32Array(t),ie=new Float32Array(t),oe=new Float64Array(t)}function $e(){{var t=62914560;B=new WebAssembly.Memory({initial:t/65536,maximum:32768})}G()}$e();var X=t=>Xe(t),Q=()=>Qe(),B,fe=new TextDecoder,Z=(t,r,n,s)=>{var o=r+n;if(s)return o;for(;t[r]&&!(r>=o);)++r;return r},q=(t,r,n)=>{if(!t)return"";var s=Z(C,t,r,n);return fe.decode(C.subarray(t,s))},Ce=(t,r,n,s)=>P(`Assertion failed: ${q(t)}, at: `+[r?q(r):"unknown filename",n,s?q(s):"unknown function"]);function _e(t,r,n){return 0}var we=(t,r,n)=>{};function tr(t,r,n){return 0}function nr(t,r,n,s){}var ar=()=>P(""),sr=(t,r,n,s,o)=>{},U=t=>{for(var r="";;){var n=C[t++];if(!n)return r;r+=String.fromCharCode(n)}},J={},K={},ue={},N=class extends Error{constructor(r){super(r),this.name="BindingError"}},$=t=>{throw new N(t)};function ir(t,r,n={}){var s=r.name;if(t||$(`type "${s}" must have a positive integer typeid pointer`),K.hasOwnProperty(t)){if(n.ignoreDuplicateRegistrations)return;$(`Cannot register type '${s}' twice`)}if(K[t]=r,delete ue[t],J.hasOwnProperty(t)){var o=J[t];delete J[t],o.forEach(l=>l())}}function L(t,r,n={}){return ir(t,r,n)}var or=(t,r,n,s)=>{r=U(r),L(t,{name:r,fromWireType:function(o){return!!o},toWireType:function(o,l){return l?n:s},readValueFromPointer:function(o){return this.fromWireType(C[o])},destructorFunction:null})},lr=t=>({count:t.count,deleteScheduled:t.deleteScheduled,preservePointerOnDelete:t.preservePointerOnDelete,ptr:t.ptr,ptrType:t.ptrType,smartPtr:t.smartPtr,smartPtrType:t.smartPtrType}),Te=t=>{function r(n){return n.$$.ptrType.registeredClass.name}$(r(t)+" instance already deleted")},Pe=!1,Me=t=>{},fr=t=>{t.smartPtr?t.smartPtrType.rawDestructor(t.smartPtr):t.ptrType.registeredClass.rawDestructor(t.ptr)},Re=t=>{t.count.value-=1;var r=t.count.value===0;r&&fr(t)},ee=t=>globalThis.FinalizationRegistry?(Pe=new FinalizationRegistry(r=>{Re(r.$$)}),ee=r=>{var n=r.$$,s=!!n.smartPtr;if(s){var o={$$:n};Pe.register(r,o,r)}return r},Me=r=>Pe.unregister(r),ee(t)):(ee=r=>r,t),ce=[],ur=()=>{for(;ce.length;){var t=ce.pop();t.$$.deleteScheduled=!1,t.delete()}},Ee,cr=()=>{let t=de.prototype;Object.assign(t,{isAliasOf(n){if(!(this instanceof de)||!(n instanceof de))return!1;var s=this.$$.ptrType.registeredClass,o=this.$$.ptr;n.$$=n.$$;for(var l=n.$$.ptrType.registeredClass,u=n.$$.ptr;s.baseClass;)o=s.upcast(o),s=s.baseClass;for(;l.baseClass;)u=l.upcast(u),l=l.baseClass;return s===l&&o===u},clone(){if(this.$$.ptr||Te(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var n=ee(Object.create(Object.getPrototypeOf(this),{$$:{value:lr(this.$$)}}));return n.$$.count.value+=1,n.$$.deleteScheduled=!1,n},delete(){this.$$.ptr||Te(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&$("Object already scheduled for deletion"),Me(this),Re(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||Te(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&$("Object already scheduled for deletion"),ce.push(this),ce.length===1&&Ee&&Ee(ur),this.$$.deleteScheduled=!0,this}});const r=Symbol.dispose;r&&(t[r]=t.delete)};function de(){}var ke=(t,r)=>Object.defineProperty(r,"name",{value:t}),We={},Ue=(t,r,n)=>{if(t[r].overloadTable===void 0){var s=t[r];t[r]=function(...o){return t[r].overloadTable.hasOwnProperty(o.length)||$(`Function '${n}' called with an invalid number of arguments (${o.length}) - expects one of (${t[r].overloadTable})!`),t[r].overloadTable[o.length].apply(this,o)},t[r].overloadTable=[],t[r].overloadTable[s.argCount]=s}},dr=(t,r,n)=>{v.hasOwnProperty(t)?((n===void 0||v[t].overloadTable!==void 0&&v[t].overloadTable[n]!==void 0)&&$(`Cannot register public name '${t}' twice`),Ue(v,t,t),v[t].overloadTable.hasOwnProperty(n)&&$(`Cannot register multiple overloads of a function with the same number of arguments (${n})!`),v[t].overloadTable[n]=r):(v[t]=r,v[t].argCount=n)},vr=48,pr=57,gr=t=>{t=t.replace(/[^a-zA-Z0-9_]/g,"$");var r=t.charCodeAt(0);return r>=vr&&r<=pr?`_${t}`:t};function br(t,r,n,s,o,l,u,f){this.name=t,this.constructor=r,this.instancePrototype=n,this.rawDestructor=s,this.baseClass=o,this.getActualType=l,this.upcast=u,this.downcast=f,this.pureVirtualFunctions=[]}var ve=(t,r,n)=>{for(;r!==n;)r.upcast||$(`Expected null or instance of ${n.name}, got an instance of ${r.name}`),t=r.upcast(t),r=r.baseClass;return t},je=t=>{if(t===null)return"null";var r=typeof t;return r==="object"||r==="array"||r==="function"?t.toString():""+t};function hr(t,r){if(r===null)return this.isReference&&$(`null is not a valid ${this.name}`),0;r.$$||$(`Cannot pass "${je(r)}" as a ${this.name}`),r.$$.ptr||$(`Cannot pass deleted object as a pointer of type ${this.name}`);var n=r.$$.ptrType.registeredClass,s=ve(r.$$.ptr,n,this.registeredClass);return s}function yr(t,r){var n;if(r===null)return this.isReference&&$(`null is not a valid ${this.name}`),this.isSmartPointer?(n=this.rawConstructor(),t!==null&&t.push(this.rawDestructor,n),n):0;(!r||!r.$$)&&$(`Cannot pass "${je(r)}" as a ${this.name}`),r.$$.ptr||$(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&r.$$.ptrType.isConst&&$(`Cannot convert argument of type ${r.$$.smartPtrType?r.$$.smartPtrType.name:r.$$.ptrType.name} to parameter type ${this.name}`);var s=r.$$.ptrType.registeredClass;if(n=ve(r.$$.ptr,s,this.registeredClass),this.isSmartPointer)switch(r.$$.smartPtr===void 0&&$("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:r.$$.smartPtrType===this?n=r.$$.smartPtr:$(`Cannot convert argument of type ${r.$$.smartPtrType?r.$$.smartPtrType.name:r.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:n=r.$$.smartPtr;break;case 2:if(r.$$.smartPtrType===this)n=r.$$.smartPtr;else{var o=r.clone();n=this.rawShare(n,Fe.toHandle(()=>o.delete())),t!==null&&t.push(this.rawDestructor,n)}break;default:$("Unsupporting sharing policy")}return n}function mr(t,r){if(r===null)return this.isReference&&$(`null is not a valid ${this.name}`),0;r.$$||$(`Cannot pass "${je(r)}" as a ${this.name}`),r.$$.ptr||$(`Cannot pass deleted object as a pointer of type ${this.name}`),r.$$.ptrType.isConst&&$(`Cannot convert argument of type ${r.$$.ptrType.name} to parameter type ${this.name}`);var n=r.$$.ptrType.registeredClass,s=ve(r.$$.ptr,n,this.registeredClass);return s}function pe(t){return this.fromWireType(O[t>>2])}var De=(t,r,n)=>{if(r===n)return t;if(n.baseClass===void 0)return null;var s=De(t,r,n.baseClass);return s===null?null:n.downcast(s)},$r={},Cr=(t,r)=>{for(r===void 0&&$("ptr should not be undefined");t.baseClass;)r=t.upcast(r),t=t.baseClass;return r},_r=(t,r)=>(r=Cr(t,r),$r[r]),wr=class extends Error{constructor(r){super(r),this.name="InternalError"}},ge=t=>{throw new wr(t)},be=(t,r)=>{(!r.ptrType||!r.ptr)&&ge("makeClassHandle requires ptr and ptrType");var n=!!r.smartPtrType,s=!!r.smartPtr;return n!==s&&ge("Both smartPtrType and smartPtr must be specified"),r.count={value:1},ee(Object.create(t,{$$:{value:r,writable:!0}}))};function Tr(t){var r=this.getPointee(t);if(!r)return this.destructor(t),null;var n=_r(this.registeredClass,r);if(n!==void 0){if(n.$$.count.value===0)return n.$$.ptr=r,n.$$.smartPtr=t,n.clone();var s=n.clone();return this.destructor(t),s}function o(){return this.isSmartPointer?be(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:r,smartPtrType:this,smartPtr:t}):be(this.registeredClass.instancePrototype,{ptrType:this,ptr:t})}var l=this.registeredClass.getActualType(r),u=We[l];if(!u)return o.call(this);var f;this.isConst?f=u.constPointerType:f=u.pointerType;var p=De(r,this.registeredClass,f.registeredClass);return p===null?o.call(this):this.isSmartPointer?be(f.registeredClass.instancePrototype,{ptrType:f,ptr:p,smartPtrType:this,smartPtr:t}):be(f.registeredClass.instancePrototype,{ptrType:f,ptr:p})}var Pr=()=>{Object.assign(he.prototype,{getPointee(t){return this.rawGetPointee&&(t=this.rawGetPointee(t)),t},destructor(t){this.rawDestructor?.(t)},readValueFromPointer:pe,fromWireType:Tr})};function he(t,r,n,s,o,l,u,f,p,m,_){this.name=t,this.registeredClass=r,this.isReference=n,this.isConst=s,this.isSmartPointer=o,this.pointeeType=l,this.sharingPolicy=u,this.rawGetPointee=f,this.rawConstructor=p,this.rawShare=m,this.rawDestructor=_,!o&&r.baseClass===void 0?s?(this.toWireType=hr,this.destructorFunction=null):(this.toWireType=mr,this.destructorFunction=null):this.toWireType=yr}var jr=(t,r,n)=>{v.hasOwnProperty(t)||ge("Replacing nonexistent public symbol"),v[t].overloadTable!==void 0&&n!==void 0?v[t].overloadTable[n]=r:(v[t]=r,v[t].argCount=n)},ye={},Fr=(t,r,n)=>{t=t.replace(/p/g,"i");var s=ye[t];return s(r,...n)},Ie=[],re=t=>{var r=Ie[t];return r||(Ie[t]=r=Ze.get(t)),r},Ar=(t,r,n=[],s=!1)=>{if(t.includes("j"))return Fr(t,r,n);var o=re(r),l=o(...n);function u(f){return f}return l},Sr=(t,r,n=!1)=>(...s)=>Ar(t,r,s,n),H=(t,r,n=!1)=>{t=U(t);function s(){if(t.includes("j"))return Sr(t,r);var l=re(r);return l}var o=s();return typeof o!="function"&&$(`unknown function pointer with signature ${t}: ${r}`),o};class Or extends Error{}var Mr=t=>{var r=Ke(t),n=U(r);return V(r),n},te=(t,r)=>{var n=[],s={};function o(l){if(!s[l]&&!K[l]){if(ue[l]){ue[l].forEach(o);return}n.push(l),s[l]=!0}}throw r.forEach(o),new Or(`${t}: `+n.map(Mr).join([", "]))},z=(t,r,n)=>{t.forEach(f=>ue[f]=r);function s(f){var p=n(f);p.length!==t.length&&ge("Mismatched type converter count");for(var m=0;m{o[f]=K[p],++u,u===l.length&&s(o)}));l.length===0&&s(o)},Rr=(t,r,n,s,o,l,u,f,p,m,_,S,R)=>{_=U(_),l=H(o,l),f&&=H(u,f),m&&=H(p,m),R=H(S,R);var F=gr(_);dr(F,function(){te(`Cannot construct ${_} due to unbound types`,[s])}),z([t,r,n],s?[s]:[],k=>{k=k[0];var D,x;s?(D=k.registeredClass,x=D.instancePrototype):x=de.prototype;var I=ke(_,function(...Oe){if(Object.getPrototypeOf(this)!==se)throw new N(`Use 'new' to construct ${_}`);if(W.constructor_body===void 0)throw new N(`${_} has no accessible constructor`);var rr=W.constructor_body[Oe.length];if(rr===void 0)throw new N(`Tried to invoke ctor of ${_} with invalid number of parameters (${Oe.length}) - expected (${Object.keys(W.constructor_body).toString()}) parameters instead!`);return rr.apply(this,Oe)}),se=Object.create(x,{constructor:{value:I}});I.prototype=se;var W=new br(_,I,se,R,D,l,f,m);W.baseClass&&(W.baseClass.__derivedClasses??=[],W.baseClass.__derivedClasses.push(W));var Ot=new he(_,W,!0,!1,!1),Ne=new he(_+"*",W,!1,!1,!1),er=new he(_+" const*",W,!1,!0,!1);return We[t]={pointerType:Ne,constPointerType:er},jr(F,I),[Ot,Ne,er]})},Be=(t,r)=>{for(var n=[],s=0;s>2]);return n},Le=t=>{for(;t.length;){var r=t.pop(),n=t.pop();n(r)}};function xe(t){for(var r=1;r{var u=Be(r,n);o=H(s,o),z([],[t],f=>{f=f[0];var p=`constructor ${f.name}`;if(f.registeredClass.constructor_body===void 0&&(f.registeredClass.constructor_body=[]),f.registeredClass.constructor_body[r-1]!==void 0)throw new N(`Cannot register multiple constructors with identical number of parameters (${r-1}) for class '${f.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return f.registeredClass.constructor_body[r-1]=()=>{te(`Cannot construct ${f.name} due to unbound types`,u)},z([],u,m=>(m.splice(1,0,null),f.registeredClass.constructor_body[r-1]=He(p,m,null,o,l),[])),[]})},Wr=t=>{t=t.trim();const r=t.indexOf("(");return r===-1?t:t.slice(0,r)},Ur=(t,r,n,s,o,l,u,f,p,m)=>{var _=Be(n,s);r=U(r),r=Wr(r),l=H(o,l,p),z([],[t],S=>{S=S[0];var R=`${S.name}.${r}`;r.startsWith("@@")&&(r=Symbol[r.substring(2)]),f&&S.registeredClass.pureVirtualFunctions.push(r);function F(){te(`Cannot call ${R} due to unbound types`,_)}var k=S.registeredClass.instancePrototype,D=k[r];return D===void 0||D.overloadTable===void 0&&D.className!==S.name&&D.argCount===n-2?(F.argCount=n-2,F.className=S.name,k[r]=F):(Ue(k,r,R),k[r].overloadTable[n-2]=F),z([],_,x=>{var I=He(R,x,S,l,u,p);return k[r].overloadTable===void 0?(I.argCount=n-2,k[r]=I):k[r].overloadTable[n-2]=I,[]}),[]})},Ve=(t,r,n)=>(t instanceof Object||$(`${n} with invalid "this": ${t}`),t instanceof r.registeredClass.constructor||$(`${n} incompatible with "this" of type ${t.constructor.name}`),t.$$.ptr||$(`cannot call emscripten binding method ${n} on deleted object`),ve(t.$$.ptr,t.$$.ptrType.registeredClass,r.registeredClass)),Dr=(t,r,n,s,o,l,u,f,p,m)=>{r=U(r),o=H(s,o),z([],[t],_=>{_=_[0];var S=`${_.name}.${r}`,R={get(){te(`Cannot access ${S} due to unbound types`,[n,u])},enumerable:!0,configurable:!0};return p?R.set=()=>te(`Cannot access ${S} due to unbound types`,[n,u]):R.set=F=>$(S+" is a read-only property"),Object.defineProperty(_.registeredClass.instancePrototype,r,R),z([],p?[n,u]:[n],F=>{var k=F[0],D={get(){var I=Ve(this,_,S+" getter");return k.fromWireType(o(l,I))},enumerable:!0};if(p){p=H(f,p);var x=F[1];D.set=function(I){var se=Ve(this,_,S+" setter"),W=[];p(m,se,x.toWireType(W,I)),Le(W)}}return Object.defineProperty(_.registeredClass.instancePrototype,r,D),[]}),[]})},ze=[],Y=[0,1,,1,null,1,!0,1,!1,1],Ir=t=>{t>9&&--Y[t+1]===0&&(Y[t]=void 0,ze.push(t))},Fe={toValue:t=>(t||$(`Cannot use deleted val. handle = ${t}`),Y[t]),toHandle:t=>{switch(t){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{const r=ze.pop()||Y.length;return Y[r]=t,Y[r+1]=1,r}}}},Br={name:"emscripten::val",fromWireType:t=>{var r=Fe.toValue(t);return Ir(t),r},toWireType:(t,r)=>Fe.toHandle(r),readValueFromPointer:pe,destructorFunction:null},Lr=t=>L(t,Br),xr=(t,r)=>{switch(r){case 4:return function(n){return this.fromWireType(ie[n>>2])};case 8:return function(n){return this.fromWireType(oe[n>>3])};default:throw new TypeError(`invalid float width (${r}): ${t}`)}},Hr=(t,r,n)=>{r=U(r),L(t,{name:r,fromWireType:s=>s,toWireType:(s,o)=>o,readValueFromPointer:xr(r,n),destructorFunction:null})},Vr=(t,r,n)=>{switch(r){case 1:return n?s=>w[s]:s=>C[s];case 2:return n?s=>A[s>>1]:s=>M[s>>1];case 4:return n?s=>E[s>>2]:s=>O[s>>2];default:throw new TypeError(`invalid integer width (${r}): ${t}`)}},zr=(t,r,n,s,o)=>{r=U(r);const l=s===0;let u=p=>p;if(l){var f=32-8*n;u=p=>p<>>f,o=u(o)}L(t,{name:r,fromWireType:u,toWireType:(p,m)=>m,readValueFromPointer:Vr(r,n,s!==0),destructorFunction:null})},Gr=(t,r,n)=>{var s=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],o=s[r];function l(u){var f=O[u>>2],p=O[u+4>>2];return new o(w.buffer,p,f)}n=U(n),L(t,{name:n,fromWireType:l,readValueFromPointer:l},{ignoreDuplicateRegistrations:!0})},qr=(t,r,n,s)=>{if(!(s>0))return 0;for(var o=n,l=n+s-1,u=0;u=l)break;r[n++]=f}else if(f<=2047){if(n+1>=l)break;r[n++]=192|f>>6,r[n++]=128|f&63}else if(f<=65535){if(n+2>=l)break;r[n++]=224|f>>12,r[n++]=128|f>>6&63,r[n++]=128|f&63}else{if(n+3>=l)break;r[n++]=240|f>>18,r[n++]=128|f>>12&63,r[n++]=128|f>>6&63,r[n++]=128|f&63,u++}}return r[n]=0,n-o},Ge=(t,r,n)=>qr(t,C,r,n),qe=t=>{for(var r=0,n=0;n=55296&&s<=57343?(r+=4,++n):r+=3}return r},Jr=(t,r)=>{r=U(r),L(t,{name:r,fromWireType(n){var s=O[n>>2],o=n+4,l;return l=q(o,s,!0),V(n),l},toWireType(n,s){s instanceof ArrayBuffer&&(s=new Uint8Array(s));var o,l=typeof s=="string";l||ArrayBuffer.isView(s)&&s.BYTES_PER_ELEMENT==1||$("Cannot pass non-string to std::string"),l?o=qe(s):o=s.length;var u=Se(4+o+1),f=u+4;return O[u>>2]=o,l?Ge(s,f,o+1):C.set(s,f),n!==null&&n.push(V,u),u},readValueFromPointer:pe,destructorFunction(n){V(n)}})},Kr=new TextDecoder("utf-16le"),Yr=(t,r,n)=>{var s=t>>1,o=Z(M,s,r/2,n);return Kr.decode(M.subarray(s,o))},Xr=(t,r,n)=>{if(n??=2147483647,n<2)return 0;n-=2;for(var s=r,o=n>1]=u,r+=2}return A[r>>1]=0,r-s},Qr=t=>t.length*2,Zr=(t,r,n)=>{for(var s="",o=t>>2,l=0;!(l>=r/4);l++){var u=O[o+l];if(!u&&!n)break;s+=String.fromCodePoint(u)}return s},Nr=(t,r,n)=>{if(n??=2147483647,n<4)return 0;for(var s=r,o=s+n-4,l=0;l65535&&l++,E[r>>2]=u,r+=4,r+4>o)break}return E[r>>2]=0,r-s},et=t=>{for(var r=0,n=0;n65535&&n++,r+=4}return r},rt=(t,r,n)=>{n=U(n);var s,o,l;r===2?(s=Yr,o=Xr,l=Qr):(s=Zr,o=Nr,l=et),L(t,{name:n,fromWireType:u=>{var f=O[u>>2],p=s(u+4,f*r,!0);return V(u),p},toWireType:(u,f)=>{typeof f!="string"&&$(`Cannot pass non-string to C++ string type ${n}`);var p=l(f),m=Se(4+p+r);return O[m>>2]=p/r,o(f,m+4,p+r),u!==null&&u.push(V,m),m},readValueFromPointer:pe,destructorFunction(u){V(u)}})},tt=(t,r)=>{r=U(r),L(t,{isVoid:!0,name:r,fromWireType:()=>{},toWireType:(n,s)=>{}})},nt=()=>{},at=()=>{throw 1/0},ne={},st=t=>{t()},it=()=>performance.now(),ot=(t,r)=>{if(ne[t]&&(clearTimeout(ne[t].id),delete ne[t]),!r)return 0;var n=setTimeout(()=>{delete ne[t],st(()=>Ye(t,it()))},r);return ne[t]={id:n,timeout_ms:r},0},lt=()=>2147483648,ft=(t,r)=>Math.ceil(t/r)*r,ut=t=>{var r=B.buffer.byteLength,n=(t-r+65535)/65536|0;try{return B.grow(n),G(),1}catch{}},ct=t=>{var r=C.length;t>>>=0;var n=lt();if(t>n)return!1;for(var s=1;s<=4;s*=2){var o=r*(1+.2/s);o=Math.min(o,t+100663296);var l=Math.min(n,ft(Math.max(t,o),65536)),u=ut(l);if(u)return!0}return!1},Ae={},dt=()=>"./this.program",ae=()=>{if(!ae.strings){var t=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",r={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:t,_:dt()};for(var n in Ae)Ae[n]===void 0?delete r[n]:r[n]=Ae[n];var s=[];for(var n in r)s.push(`${n}=${r[n]}`);ae.strings=s}return ae.strings},vt=(t,r)=>{var n=0,s=0;for(var o of ae()){var l=r+n;O[t+s>>2]=l,n+=Ge(o,l,1/0)+1,s+=4}return 0},pt=(t,r)=>{var n=ae();O[t>>2]=n.length;var s=0;for(var o of n)s+=qe(o)+1;return O[r>>2]=s,0},Je=t=>{throw`exit(${t})`},gt=Je,bt=t=>52,ht=(t,r,n,s)=>52;function yt(t,r,n,s,o){return 70}var mt=[null,[],[]],$t=(t,r=0,n,s)=>{var o=Z(t,r,n,s);return fe.decode(t.buffer?t.subarray(r,o):new Uint8Array(t.slice(r,o)))},Ct=(t,r)=>{var n=mt[t];r===0||r===10?((t===1?y:h)($t(n)),n.length=0):n.push(r)},_t=(t,r,n,s)=>{for(var o=0,l=0;l>2],f=O[r+4>>2];r+=8;for(var p=0;p>2]=o,0};cr(),Pr();var Se,V,Ke,Ye,me,Xe,Qe,Ze;function wt(t){Se=v._malloc=t.K,V=t.L,Ke=t.M,Ye=t.O,me=t.P,Xe=t.Q,Qe=t.R,ye.viiiiji=t.S,ye.jiji=t.T,ye.jij=t.U,Ze=t.N}var Tt={b:Ce,k:_e,B:we,H:tr,l:nr,z:ar,r:sr,o:or,h:Rr,E:kr,d:Ur,c:Dr,I:Lr,m:Hr,f:zr,e:Gr,n:Jr,i:rt,p:tt,x:nt,v:at,y:ot,A:ct,C:vt,D:pt,j:gt,g:bt,G:ht,q:yt,F:_t,u:Pt,s:Ft,t:jt,a:B,w:Je};function Pt(t,r,n){var s=Q();try{return re(t)(r,n)}catch(o){if(X(s),o!==o+0)throw o;me(1,0)}}function jt(t,r,n,s,o){var l=Q();try{return re(t)(r,n,s,o)}catch(u){if(X(l),u!==u+0)throw u;me(1,0)}}function Ft(t,r,n,s){var o=Q();try{return re(t)(r,n,s)}catch(l){if(X(o),l!==l+0)throw l;me(1,0)}}function At(t){le=!0,t.J()}var St={a:Tt};return WebAssembly.instantiateStreaming(fetch("jassub-worker-modern.wasm"),St).then(t=>{var r=t.instance.exports;wt(r),At(r),T()}),le?g=v:g=new Promise((t,r)=>{j=t}),g}const read_=(i,g)=>{const v=new XMLHttpRequest;return v.open("GET",i,!1),v.responseType=g?"arraybuffer":"text",v.send(null),v.response},readAsync=(i,g,v)=>{const y=new XMLHttpRequest;y.open("GET",i,!0),y.responseType="arraybuffer",y.onload=()=>{if((y.status===200||y.status===0)&&y.response)return g(y.response)},y.onerror=v,y.send(null)};let lastCurrentTime=0;const rate=1;let rafId=null,nextIsRaf=!1,lastCurrentTimeReceivedAt=Date.now(),targetFps=24,useLocalFonts=!1,blendMode="js",availableFonts={};const fontMap_={};let fontId=0,debug;self.width=0;self.height=0;let asyncRender=!1;self.addFont=({font:i})=>asyncWrite(i);const findAvailableFonts=i=>{i=i.trim().toLowerCase(),i[0]==="@"&&(i=i.substring(1)),!fontMap_[i]&&(fontMap_[i]=!0,availableFonts[i]?asyncWrite(availableFonts[i]):useLocalFonts&&postMessage({target:"getLocalFont",font:i}))},asyncWrite=i=>{typeof i=="string"?readAsync(i,g=>{allocFont(new Uint8Array(g))},console.error):allocFont(i)},allocFont=i=>{const g=_malloc(i.byteLength);self.HEAPU8.set(i,g),jassubObj.addFont("font-"+fontId++,g,i.byteLength),jassubObj.reloadFonts()},processAvailableFonts=i=>{if(!availableFonts)return;const g=parseAss(i);for(let h=0;h{processAvailableFonts(i),dropAllBlur&&(i=dropBlur(i)),jassubObj.createTrackMem(i),subtitleColorSpace=libassYCbCrMap[jassubObj.trackColorSpace],postMessage({target:"verifyColorSpace",subtitleColorSpace})};self.getColorSpace=()=>postMessage({target:"verifyColorSpace",subtitleColorSpace});self.freeTrack=()=>{jassubObj.removeTrack()};self.setTrackByUrl=({url:i})=>{self.setTrack({content:read_(i)})};const getCurrentTime=()=>{const i=(Date.now()-lastCurrentTimeReceivedAt)/1e3;return _isPaused?lastCurrentTime:(i>5&&(console.error("Didn't received currentTime > 5 seconds. Assuming video was paused."),setIsPaused(!0)),lastCurrentTime+i*rate)},setCurrentTime=i=>{lastCurrentTime=i,lastCurrentTimeReceivedAt=Date.now(),rafId||(nextIsRaf?rafId=requestAnimationFrame(renderLoop):(renderLoop(),setTimeout(()=>{nextIsRaf=!1},20)))};let _isPaused=!0;const setIsPaused=i=>{i!==_isPaused&&(_isPaused=i,i?rafId&&(clearTimeout(rafId),rafId=null):(lastCurrentTimeReceivedAt=Date.now(),rafId=requestAnimationFrame(renderLoop)))},a="BT601",b="BT709",c="SMPTE240M",d="FCC",libassYCbCrMap=[null,a,null,a,a,b,b,c,c,d,d],render=(i,g)=>{const v={},y=performance.now(),h=blendMode==="wasm"?jassubObj.renderBlend(i,g||0):jassubObj.renderImage(i,g||0);if(debug){const T=performance.now();v.WASMRenderTime=T-y,v.JSRenderTime=performance.now()}if(jassubObj.changed!==0||g){const T=[],P=[];if(!h)return paintImages({images:T,buffers:P,times:v});if(asyncRender){const j=[];for(let w=h,C=0;C{for(let C=0;C{lastCurrentTime=i,render(i)};const renderLoop=i=>{rafId=0,render(getCurrentTime(),i),_isPaused||(rafId=requestAnimationFrame(renderLoop))},paintImages=({times:i,images:g,buffers:v})=>{const y={target:"render",asyncRender,images:g,times:i,width:self.width,height:self.height,colorSpace:subtitleColorSpace};if(offscreenRender){(offCanvas.height!==self.height||offCanvas.width!==self.width)&&(offCanvas.width=self.width,offCanvas.height=self.height),offCanvasCtx.clearRect(0,0,self.width,self.height);for(const h of g)h.image&&(asyncRender?(offCanvasCtx.drawImage(h.image,h.x,h.y),h.image.close()):(bufferCanvas.width=h.w,bufferCanvas.height=h.h,bufferCtx.putImageData(new ImageData(self.HEAPU8C.subarray(h.image,h.image+h.w*h.h*4),h.w,h.h),0,0),offCanvasCtx.drawImage(bufferCanvas,h.x,h.y)));if(offscreenRender==="hybrid"){if(!g.length)return postMessage(y);debug&&(i.bitmaps=g.length);try{const h=offCanvas.transferToImageBitmap();y.images=[{image:h,x:0,y:0}],y.asyncRender=!0,postMessage(y,[h])}catch{postMessage({target:"unbusy"})}}else{if(debug){let h=0;for(const T in i)h+=i[T];console.log("Bitmaps: "+g.length+" Total: "+(h|0)+"ms",i)}postMessage({target:"unbusy"})}}else postMessage(y,v)},parseAss=i=>{let g,v,y,h,T,P,j,w,C,A;const M=[],E=i.split(/[\r\n]+/g);for(w=0;wv.length&&(y=P.slice(v.length-1).join(","),P=P.slice(0,v.length-1),P.push(y)),P=P.map(O=>O.trim()),v)){for(j={},C=0;Ci.replace(blurRegex,""),requestAnimationFrame=(()=>{let i=0;return g=>{const v=Date.now();if(i===0)i=v+1e3/targetFps;else for(;v+2>=i;)i+=1e3/targetFps;const y=Math.max(i-v,0);return setTimeout(g,y)}})(),_applyKeys=(i,g)=>{for(const v of Object.keys(i))g[v]=i[v]};let offCanvas,offCanvasCtx,offscreenRender,bufferCanvas,bufferCtx,jassubObj,subtitleColorSpace,dropAllBlur,_malloc,hasBitmapBug;self.init=data=>{hasBitmapBug=data.hasBitmapBug;try{const i=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));if(!(i instanceof WebAssembly.Module)||!(new WebAssembly.Instance(i)instanceof WebAssembly.Instance))throw new Error("WASM not supported")}catch(e){console.warn(e),eval(read_(data.legacyWasmUrl))}if(WebAssembly.instantiateStreaming){const i=self.fetch;self.fetch=g=>i(data.wasmUrl)}Module({wasm:!WebAssembly.instantiateStreaming&&read_(data.wasmUrl,!0)}).then(i=>{_malloc=i._malloc,self.width=data.width,self.height=data.height,blendMode=data.blendMode,asyncRender=data.asyncRender,asyncRender&&typeof createImageBitmap>"u"&&(asyncRender=!1,console.error("'createImageBitmap' needed for 'asyncRender' unsupported!")),availableFonts=data.availableFonts,debug=data.debug,targetFps=data.targetFps||targetFps,useLocalFonts=data.useLocalFonts,dropAllBlur=data.dropAllBlur;const g=data.fallbackFont.toLowerCase();jassubObj=new i.JASSUB(self.width,self.height,g||null,debug),g&&findAvailableFonts(g);let v=data.subContent;v||(v=read_(data.subUrl)),processAvailableFonts(v),dropAllBlur&&(v=dropBlur(v));for(const y of data.fonts||[])asyncWrite(y);jassubObj.createTrackMem(v),subtitleColorSpace=libassYCbCrMap[jassubObj.trackColorSpace],jassubObj.setDropAnimations(data.dropAllAnimations||0),(data.libassMemoryLimit>0||data.libassGlyphLimit>0)&&jassubObj.setMemoryLimits(data.libassGlyphLimit||0,data.libassMemoryLimit||0),postMessage({target:"ready"}),postMessage({target:"verifyColorSpace",subtitleColorSpace})})};self.offscreenCanvas=({transferable:i})=>{offCanvas=i[0],offCanvasCtx=offCanvas.getContext("2d"),asyncRender||(bufferCanvas=new OffscreenCanvas(self.height,self.width),bufferCtx=bufferCanvas.getContext("2d",{desynchronized:!0})),offscreenRender=!0};self.detachOffscreen=()=>{offCanvas=new OffscreenCanvas(self.height,self.width),offCanvasCtx=offCanvas.getContext("2d",{desynchronized:!0}),offscreenRender="hybrid"};self.canvas=({width:i,height:g,videoWidth:v,videoHeight:y,force:h})=>{if(i==null)throw new Error("Invalid canvas size specified");self.width=i,self.height=g,jassubObj&&jassubObj.resizeCanvas(i,g,v,y),h&&render(lastCurrentTime,!0)};self.video=({currentTime:i,isPaused:g,rate:v})=>{i!=null&&setCurrentTime(i),g!=null&&setIsPaused(g),v=v||v};self.destroy=()=>{jassubObj.quitLibrary()};self.createEvent=({event:i})=>{_applyKeys(i,jassubObj.getEvent(jassubObj.allocEvent()))};self.getEvents=()=>{const i=[];for(let g=0;g{_applyKeys(i,jassubObj.getEvent(g))};self.removeEvent=({index:i})=>{jassubObj.removeEvent(i)};self.createStyle=({style:i})=>{const g=jassubObj.getStyle(jassubObj.allocStyle());return _applyKeys(i,g),g};self.getStyles=()=>{const i=[];for(let g=0;g{_applyKeys(i,jassubObj.getStyle(g))};self.removeStyle=({index:i})=>{jassubObj.removeStyle(i)};self.styleOverride=i=>{jassubObj.styleOverride(self.createStyle(i))};self.disableStyleOverride=()=>{jassubObj.disableStyleOverride()};self.defaultFont=({font:i})=>{jassubObj.setDefaultFont(i)};onmessage=({data:i})=>{if(self[i.target])self[i.target](i);else throw new Error("Unknown event target "+i.target)};
diff --git a/docker/src/scripts/jassub/jassub-worker.wasm b/docker/src/scripts/jassub/jassub-worker.wasm
new file mode 100644
index 0000000..4711c19
Binary files /dev/null and b/docker/src/scripts/jassub/jassub-worker.wasm differ
diff --git a/docker/src/scripts/libass/default.woff2 b/docker/src/scripts/libass/default.woff2
deleted file mode 100644
index 68a0517..0000000
Binary files a/docker/src/scripts/libass/default.woff2 and /dev/null differ
diff --git a/docker/src/scripts/libass/subtitles-octopus-worker.js b/docker/src/scripts/libass/subtitles-octopus-worker.js
deleted file mode 100644
index f5def9b..0000000
--- a/docker/src/scripts/libass/subtitles-octopus-worker.js
+++ /dev/null
@@ -1 +0,0 @@
-null;var Module=typeof Module!="undefined"?Module:{};var hasNativeConsole=typeof console!=="undefined";function makeCustomConsole(){var console=function(){function postConsoleMessage(prefix,args){postMessage({target:"console-"+prefix,content:JSON.stringify(Array.prototype.slice.call(args))})}return{log:function(){postConsoleMessage("log",arguments)},debug:function(){postConsoleMessage("debug",arguments)},info:function(){postConsoleMessage("info",arguments)},warn:function(){postConsoleMessage("warn",arguments)},error:function(){postConsoleMessage("error",arguments)}}}();return console}function isBrotliFile(url){var len=url.indexOf("?");if(len===-1){len=url.length}if(url.endsWith(".br",len)){console.warn("Support for manual brotli decompression is tentatively deprecated and "+"may be removed with the next release. Instead use HTTP's Content-Encoding.");return true}return false}Module=Module||{};Module["preRun"]=Module["preRun"]||[];Module["preRun"].push(function(){Module["FS_createPath"]("/","fonts",true,true);Module["FS_createPath"]("/","fontconfig",true,true);if(!self.subContent){if(isBrotliFile(self.subUrl)){self.subContent=Module["BrotliDecode"](readBinary(self.subUrl))}else{self.subContent=read_(self.subUrl)}}if(self.availableFonts&&self.availableFonts.length!==0){var sections=parseAss(self.subContent);for(var i=0;i0||self.libassGlyphLimit>0){self.octObj.setMemoryLimits(self.libassGlyphLimit,self.libassMemoryLimit)}};Module["print"]=function(text){if(arguments.length>1)text=Array.prototype.slice.call(arguments).join(" ");console.log(text)};Module["printErr"]=function(text){if(arguments.length>1)text=Array.prototype.slice.call(arguments).join(" ");console.error(text)};if(!hasNativeConsole){var console={log:function(x){if(typeof dump==="function")dump("log: "+x+"\n")},debug:function(x){if(typeof dump==="function")dump("debug: "+x+"\n")},info:function(x){if(typeof dump==="function")dump("info: "+x+"\n")},warn:function(x){if(typeof dump==="function")dump("warn: "+x+"\n")},error:function(x){if(typeof dump==="function")dump("error: "+x+"\n")}}}function BrotliDecodeClosure(){null;var DICTIONARY_DATA=new Int8Array(0);function InputStream(bytes){this.data=bytes;this.offset=0}var MAX_HUFFMAN_TABLE_SIZE=Int32Array.from([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);var CODE_LENGTH_CODE_ORDER=Int32Array.from([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]);var DISTANCE_SHORT_CODE_INDEX_OFFSET=Int32Array.from([0,3,2,1,0,0,0,0,0,0,3,3,3,3,3,3]);var DISTANCE_SHORT_CODE_VALUE_OFFSET=Int32Array.from([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]);var FIXED_TABLE=Int32Array.from([131072,131076,131075,196610,131072,131076,131075,262145,131072,131076,131075,196610,131072,131076,131075,262149]);var DICTIONARY_OFFSETS_BY_LENGTH=Int32Array.from([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]);var DICTIONARY_SIZE_BITS_BY_LENGTH=Int32Array.from([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]);var BLOCK_LENGTH_OFFSET=Int32Array.from([1,5,9,13,17,25,33,41,49,65,81,97,113,145,177,209,241,305,369,497,753,1265,2289,4337,8433,16625]);var BLOCK_LENGTH_N_BITS=Int32Array.from([2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,7,8,9,10,11,12,13,24]);var INSERT_LENGTH_N_BITS=Int16Array.from([0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,12,14,24]);var COPY_LENGTH_N_BITS=Int16Array.from([0,0,0,0,0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,7,8,9,10,24]);var CMD_LOOKUP=new Int16Array(2816);{unpackCommandLookupTable(CMD_LOOKUP)}function log2floor(i){var result=-1;var step=16;while(step>0){if(i>>>step!=0){result+=step;i=i>>>step}step=step>>1}return result+i}function calculateDistanceAlphabetSize(npostfix,ndirect,maxndistbits){return 16+ndirect+2*(maxndistbits<>npostfix)+4;var ndistbits=log2floor(offset)-1;var group=ndistbits-1<<1|offset>>ndistbits&1;return(group-1<>>6;var distanceContextOffset=-4;if(rangeIdx>=2){rangeIdx-=2;distanceContextOffset=0}var insertCode=(170064>>>rangeIdx*2&3)<<3|cmdCode>>>3&7;var copyCode=(156228>>>rangeIdx*2&3)<<3|cmdCode&7;var copyLengthOffset=copyLengthOffsets[copyCode];var distanceContext=distanceContextOffset+(copyLengthOffset>4?3:copyLengthOffset-2);var index=cmdCode*4;cmdLookup[index+0]=INSERT_LENGTH_N_BITS[insertCode]|COPY_LENGTH_N_BITS[copyCode]<<8;cmdLookup[index+1]=insertLengthOffsets[insertCode];cmdLookup[index+2]=copyLengthOffsets[copyCode];cmdLookup[index+3]=distanceContext}}function decodeWindowBits(s){var largeWindowEnabled=s.isLargeWindow;s.isLargeWindow=0;if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}if(readFewBits(s,1)==0){return 16}var n=readFewBits(s,3);if(n!=0){return 17+n}n=readFewBits(s,3);if(n!=0){if(n==1){if(largeWindowEnabled==0){return-1}s.isLargeWindow=1;if(readFewBits(s,1)==1){return-1}n=readFewBits(s,6);if(n<10||n>30){return-1}return n}else{return 8+n}}return 17}function initState(s,input){if(s.runningState!=0){throw"State MUST be uninitialized"}s.blockTrees=new Int32Array(3091);s.blockTrees[0]=7;s.distRbIdx=3;var maxDistanceAlphabetLimit=calculateDistanceAlphabetLimit(2147483644,3,15<<3);s.distExtraBits=new Int8Array(maxDistanceAlphabetLimit);s.distOffset=new Int32Array(maxDistanceAlphabetLimit);s.input=input;initBitReader(s);s.runningState=1}function close(s){if(s.runningState==0){throw"State MUST be initialized"}if(s.runningState==11){return}s.runningState=11;if(s.input!=null){closeInput(s.input);s.input=null}}function decodeVarLenUnsignedByte(s){if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}if(readFewBits(s,1)!=0){var n=readFewBits(s,3);if(n==0){return 1}else{return readFewBits(s,n)+(1<=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}s.inputEnd=readFewBits(s,1);s.metaBlockLength=0;s.isUncompressed=0;s.isMetadata=0;if(s.inputEnd!=0&&readFewBits(s,1)!=0){return}var sizeNibbles=readFewBits(s,2)+4;if(sizeNibbles==7){s.isMetadata=1;if(readFewBits(s,1)!=0){throw"Corrupted reserved bit"}var sizeBytes=readFewBits(s,2);if(sizeBytes==0){return}for(var i=0;i=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var bits=readFewBits(s,8);if(bits==0&&i+1==sizeBytes&&sizeBytes>1){throw"Exuberant nibble"}s.metaBlockLength|=bits<=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var bits=readFewBits(s,4);if(bits==0&&i+1==sizeNibbles&&sizeNibbles>4){throw"Exuberant nibble"}s.metaBlockLength|=bits<>>s.bitOffset;offset+=val&255;var bits=tableGroup[offset]>>16;var sym=tableGroup[offset]&65535;if(bits<=8){s.bitOffset+=bits;return sym}offset+=sym;var mask=(1<>>8;s.bitOffset+=(tableGroup[offset]>>16)+8;return tableGroup[offset]&65535}function readBlockLength(tableGroup,tableIdx,s){if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var code=readSymbol(tableGroup,tableIdx,s);var n=BLOCK_LENGTH_N_BITS[code];if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}return BLOCK_LENGTH_OFFSET[code]+(n<=16?readFewBits(s,n):readManyBits(s,n))}function moveToFront(v,index){var value=v[index];for(;index>0;index--){v[index]=v[index-1]}v[0]=value}function inverseMoveToFrontTransform(v,vLen){var mtf=new Int32Array(256);for(var i=0;i<256;i++){mtf[i]=i}for(var i=0;i0){if(s.halfOffset>2030){doReadMoreInput(s)}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var p=s.accumulator32>>>s.bitOffset&31;s.bitOffset+=table[p]>>16;var codeLen=table[p]&65535;if(codeLen<16){repeat=0;codeLengths[symbol++]=codeLen;if(codeLen!=0){prevCodeLen=codeLen;space-=32768>>codeLen}}else{var extraBits=codeLen-14;var newLen=0;if(codeLen==16){newLen=prevCodeLen}if(repeatCodeLen!=newLen){repeat=0;repeatCodeLen=newLen}var oldRepeat=repeat;if(repeat>0){repeat-=2;repeat<<=extraBits}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}repeat+=readFewBits(s,extraBits)+3;var repeatDelta=repeat-oldRepeat;if(symbol+repeatDelta>numSymbols){throw"symbol + repeatDelta > numSymbols"}for(var i=0;i=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var symbol=readFewBits(s,maxBits);if(symbol>=alphabetSizeLimit){throw"Can't readHuffmanCode"}symbols[i]=symbol}checkDupes(symbols,numSymbols);var histogramId=numSymbols;if(numSymbols==4){histogramId+=readFewBits(s,1)}switch(histogramId){case 1:codeLengths[symbols[0]]=1;break;case 2:codeLengths[symbols[0]]=1;codeLengths[symbols[1]]=1;break;case 3:codeLengths[symbols[0]]=1;codeLengths[symbols[1]]=2;codeLengths[symbols[2]]=2;break;case 4:codeLengths[symbols[0]]=2;codeLengths[symbols[1]]=2;codeLengths[symbols[2]]=2;codeLengths[symbols[3]]=2;break;case 5:codeLengths[symbols[0]]=1;codeLengths[symbols[1]]=2;codeLengths[symbols[2]]=3;codeLengths[symbols[3]]=3;break;default:break}return buildHuffmanTable(tableGroup,tableIdx,8,codeLengths,alphabetSizeLimit)}function readComplexHuffmanCode(alphabetSizeLimit,skip,tableGroup,tableIdx,s){var codeLengths=new Int32Array(alphabetSizeLimit);var codeLengthCodeLengths=new Int32Array(18);var space=32;var numCodes=0;for(var i=skip;i<18&&space>0;i++){var codeLenIdx=CODE_LENGTH_CODE_ORDER[i];if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var p=s.accumulator32>>>s.bitOffset&15;s.bitOffset+=FIXED_TABLE[p]>>16;var v=FIXED_TABLE[p]&65535;codeLengthCodeLengths[codeLenIdx]=v;if(v!=0){space-=32>>v;numCodes++}}if(space!=0&&numCodes!=1){throw"Corrupted Huffman code histogram"}readHuffmanCodeLengths(codeLengthCodeLengths,alphabetSizeLimit,codeLengths,s);return buildHuffmanTable(tableGroup,tableIdx,8,codeLengths,alphabetSizeLimit)}function readHuffmanCode(alphabetSizeMax,alphabetSizeLimit,tableGroup,tableIdx,s){if(s.halfOffset>2030){doReadMoreInput(s)}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var simpleCodeOrSkip=readFewBits(s,2);if(simpleCodeOrSkip==1){return readSimpleHuffmanCode(alphabetSizeMax,alphabetSizeLimit,tableGroup,tableIdx,s)}else{return readComplexHuffmanCode(alphabetSizeLimit,simpleCodeOrSkip,tableGroup,tableIdx,s)}}function decodeContextMap(contextMapSize,contextMap,s){if(s.halfOffset>2030){doReadMoreInput(s)}var numTrees=decodeVarLenUnsignedByte(s)+1;if(numTrees==1){contextMap.fill(0,0,contextMapSize);return numTrees}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var useRleForZeros=readFewBits(s,1);var maxRunLengthPrefix=0;if(useRleForZeros!=0){maxRunLengthPrefix=readFewBits(s,4)+1}var alphabetSize=numTrees+maxRunLengthPrefix;var tableSize=MAX_HUFFMAN_TABLE_SIZE[alphabetSize+31>>5];var table=new Int32Array(tableSize+1);var tableIdx=table.length-1;readHuffmanCode(alphabetSize,alphabetSize,table,tableIdx,s);for(var i=0;i2030){doReadMoreInput(s)}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var code=readSymbol(table,tableIdx,s);if(code==0){contextMap[i]=0;i++}else if(code<=maxRunLengthPrefix){if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var reps=(1<=contextMapSize){throw"Corrupted context map"}contextMap[i]=0;i++;reps--}}else{contextMap[i]=code-maxRunLengthPrefix;i++}}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}if(readFewBits(s,1)==1){inverseMoveToFrontTransform(contextMap,contextMapSize)}return numTrees}function decodeBlockTypeAndLength(s,treeType,numBlockTypes){var ringBuffers=s.rings;var offset=4+treeType*2;if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var blockType=readSymbol(s.blockTrees,2*treeType,s);var result=readBlockLength(s.blockTrees,2*treeType+1,s);if(blockType==1){blockType=ringBuffers[offset+1]+1}else if(blockType==0){blockType=ringBuffers[offset]}else{blockType-=2}if(blockType>=numBlockTypes){blockType-=numBlockTypes}ringBuffers[offset]=ringBuffers[offset+1];ringBuffers[offset+1]=blockType;return result}function decodeLiteralBlockSwitch(s){s.literalBlockLength=decodeBlockTypeAndLength(s,0,s.numLiteralBlockTypes);var literalBlockType=s.rings[5];s.contextMapSlice=literalBlockType<<6;s.literalTreeIdx=s.contextMap[s.contextMapSlice]&255;var contextMode=s.contextModes[literalBlockType];s.contextLookupOffset1=contextMode<<9;s.contextLookupOffset2=s.contextLookupOffset1+256}function decodeCommandBlockSwitch(s){s.commandBlockLength=decodeBlockTypeAndLength(s,1,s.numCommandBlockTypes);s.commandTreeIdx=s.rings[7]}function decodeDistanceBlockSwitch(s){s.distanceBlockLength=decodeBlockTypeAndLength(s,2,s.numDistanceBlockTypes);s.distContextMapSlice=s.rings[9]<<2}function maybeReallocateRingBuffer(s){var newSize=s.maxRingBufferSize;if(newSize>s.expectedTotalSize){var minimalNewSize=s.expectedTotalSize;while(newSize>>1>minimalNewSize){newSize>>=1}if(s.inputEnd==0&&newSize<16384&&s.maxRingBufferSize>=16384){newSize=16384}}if(newSize<=s.ringBufferSize){return}var ringBufferSizeWithSlack=newSize+37;var newBuffer=new Int8Array(ringBufferSizeWithSlack);if(s.ringBuffer.length!=0){newBuffer.set(s.ringBuffer.subarray(0,0+s.ringBufferSize),0)}s.ringBuffer=newBuffer;s.ringBufferSize=newSize}function readNextMetablockHeader(s){if(s.inputEnd!=0){s.nextRunningState=10;s.runningState=12;return}s.literalTreeGroup=new Int32Array(0);s.commandTreeGroup=new Int32Array(0);s.distanceTreeGroup=new Int32Array(0);if(s.halfOffset>2030){doReadMoreInput(s)}decodeMetaBlockLength(s);if(s.metaBlockLength==0&&s.isMetadata==0){return}if(s.isUncompressed!=0||s.isMetadata!=0){jumpToByteBoundary(s);s.runningState=s.isMetadata!=0?5:6}else{s.runningState=3}if(s.isMetadata!=0){return}s.expectedTotalSize+=s.metaBlockLength;if(s.expectedTotalSize>1<<30){s.expectedTotalSize=1<<30}if(s.ringBufferSize2030){doReadMoreInput(s)}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}s.distancePostfixBits=readFewBits(s,2);s.numDirectDistanceCodes=readFewBits(s,4)<=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}s.contextModes[i]=readFewBits(s,2)}if(s.halfOffset>2030){doReadMoreInput(s)}}s.contextMap=new Int8Array(s.numLiteralBlockTypes<<6);var numLiteralTrees=decodeContextMap(s.numLiteralBlockTypes<<6,s.contextMap,s);s.trivialLiteralContext=1;for(var j=0;j>6){s.trivialLiteralContext=0;break}}s.distContextMap=new Int8Array(s.numDistanceBlockTypes<<2);var numDistTrees=decodeContextMap(s.numDistanceBlockTypes<<2,s.distContextMap,s);s.literalTreeGroup=decodeHuffmanTreeGroup(256,256,numLiteralTrees,s);s.commandTreeGroup=decodeHuffmanTreeGroup(704,704,s.numCommandBlockTypes,s);var distanceAlphabetSizeMax=calculateDistanceAlphabetSize(s.distancePostfixBits,s.numDirectDistanceCodes,24);var distanceAlphabetSizeLimit=distanceAlphabetSizeMax;if(s.isLargeWindow==1){distanceAlphabetSizeMax=calculateDistanceAlphabetSize(s.distancePostfixBits,s.numDirectDistanceCodes,62);distanceAlphabetSizeLimit=calculateDistanceAlphabetLimit(2147483644,s.distancePostfixBits,s.numDirectDistanceCodes)}s.distanceTreeGroup=decodeHuffmanTreeGroup(distanceAlphabetSizeMax,distanceAlphabetSizeLimit,numDistTrees,s);calculateDistanceLut(s,distanceAlphabetSizeLimit);s.contextMapSlice=0;s.distContextMapSlice=0;s.contextLookupOffset1=s.contextModes[0]*512;s.contextLookupOffset2=s.contextLookupOffset1+256;s.literalTreeIdx=0;s.commandTreeIdx=0;s.rings[4]=1;s.rings[5]=0;s.rings[6]=1;s.rings[7]=0;s.rings[8]=1;s.rings[9]=0}function copyUncompressedData(s){var ringBuffer=s.ringBuffer;if(s.metaBlockLength<=0){reload(s);s.runningState=2;return}var chunkLength=min(s.ringBufferSize-s.pos,s.metaBlockLength);copyBytes(s,ringBuffer,s.pos,chunkLength);s.metaBlockLength-=chunkLength;s.pos+=chunkLength;if(s.pos==s.ringBufferSize){s.nextRunningState=6;s.runningState=12;return}reload(s);s.runningState=2}function writeRingBuffer(s){var toWrite=min(s.outputLength-s.outputUsed,s.ringBufferBytesReady-s.ringBufferBytesWritten);if(toWrite!=0){s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten,s.ringBufferBytesWritten+toWrite),s.outputOffset+s.outputUsed);s.outputUsed+=toWrite;s.ringBufferBytesWritten+=toWrite}if(s.outputUsed>5];var group=new Int32Array(n+n*maxTableSize);var next=n;for(var i=0;i2030){doReadMoreInput(s)}if(s.commandBlockLength==0){decodeCommandBlockSwitch(s)}s.commandBlockLength--;if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var cmdCode=readSymbol(s.commandTreeGroup,s.commandTreeIdx,s)<<2;var insertAndCopyExtraBits=CMD_LOOKUP[cmdCode];var insertLengthOffset=CMD_LOOKUP[cmdCode+1];var copyLengthOffset=CMD_LOOKUP[cmdCode+2];s.distanceCode=CMD_LOOKUP[cmdCode+3];if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var extraBits=insertAndCopyExtraBits&255;s.insertLength=insertLengthOffset+(extraBits<=16?readFewBits(s,extraBits):readManyBits(s,extraBits));if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var extraBits=insertAndCopyExtraBits>>8;s.copyLength=copyLengthOffset+(extraBits<=16?readFewBits(s,extraBits):readManyBits(s,extraBits));s.j=0;s.runningState=7;case 7:if(s.trivialLiteralContext!=0){while(s.j2030){doReadMoreInput(s)}if(s.literalBlockLength==0){decodeLiteralBlockSwitch(s)}s.literalBlockLength--;if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}ringBuffer[s.pos]=readSymbol(s.literalTreeGroup,s.literalTreeIdx,s);s.pos++;s.j++;if(s.pos>=fence){s.nextRunningState=7;s.runningState=12;break}}}else{var prevByte1=ringBuffer[s.pos-1&ringBufferMask]&255;var prevByte2=ringBuffer[s.pos-2&ringBufferMask]&255;while(s.j2030){doReadMoreInput(s)}if(s.literalBlockLength==0){decodeLiteralBlockSwitch(s)}var literalContext=LOOKUP[s.contextLookupOffset1+prevByte1]|LOOKUP[s.contextLookupOffset2+prevByte2];var literalTreeIdx=s.contextMap[s.contextMapSlice+literalContext]&255;s.literalBlockLength--;prevByte2=prevByte1;if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}prevByte1=readSymbol(s.literalTreeGroup,literalTreeIdx,s);ringBuffer[s.pos]=prevByte1;s.pos++;s.j++;if(s.pos>=fence){s.nextRunningState=7;s.runningState=12;break}}}if(s.runningState!=7){continue}s.metaBlockLength-=s.insertLength;if(s.metaBlockLength<=0){s.runningState=4;continue}var distanceCode=s.distanceCode;if(distanceCode<0){s.distance=s.rings[s.distRbIdx]}else{if(s.halfOffset>2030){doReadMoreInput(s)}if(s.distanceBlockLength==0){decodeDistanceBlockSwitch(s)}s.distanceBlockLength--;if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}var distTreeIdx=s.distContextMap[s.distContextMapSlice+distanceCode]&255;distanceCode=readSymbol(s.distanceTreeGroup,distTreeIdx,s);if(distanceCode<16){var index=s.distRbIdx+DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode]&3;s.distance=s.rings[index]+DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode];if(s.distance<0){throw"Negative distance"}}else{var extraBits=s.distExtraBits[distanceCode];var bits;if(s.bitOffset+extraBits<=32){bits=readFewBits(s,extraBits)}else{if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}bits=extraBits<=16?readFewBits(s,extraBits):readManyBits(s,extraBits)}s.distance=s.distOffset[distanceCode]+(bits<s.maxDistance){s.runningState=9;continue}if(distanceCode>0){s.distRbIdx=s.distRbIdx+1&3;s.rings[s.distRbIdx]=s.distance}if(s.copyLength>s.metaBlockLength){throw"Invalid backward reference"}s.j=0;s.runningState=8;case 8:var src=s.pos-s.distance&ringBufferMask;var dst=s.pos;var copyLength=s.copyLength-s.j;var srcEnd=src+copyLength;var dstEnd=dst+copyLength;if(srcEnddst&&dstEnd>src){for(var k=0;k=fence){s.nextRunningState=8;s.runningState=12;break}}}if(s.runningState==8){s.runningState=4}continue;case 9:if(s.distance>2147483644){throw"Invalid backward reference"}if(s.copyLength>=4&&s.copyLength<=24){var offset=DICTIONARY_OFFSETS_BY_LENGTH[s.copyLength];var wordId=s.distance-s.maxDistance-1;var shift=DICTIONARY_SIZE_BITS_BY_LENGTH[s.copyLength];var mask=(1<>>shift;offset+=wordIdx*s.copyLength;if(transformIdx<121){var len=transformDictionaryWord(ringBuffer,s.pos,DICTIONARY_DATA,offset,s.copyLength,RFC_TRANSFORMS,transformIdx);s.pos+=len;s.metaBlockLength-=len;if(s.pos>=fence){s.nextRunningState=4;s.runningState=12;continue}}else{throw"Invalid backward reference"}}else{throw"Invalid backward reference"}s.runningState=4;continue;case 5:while(s.metaBlockLength>0){if(s.halfOffset>2030){doReadMoreInput(s)}if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}readFewBits(s,8);s.metaBlockLength--}s.runningState=2;continue;case 6:copyUncompressedData(s);continue;case 12:s.ringBufferBytesReady=min(s.pos,s.ringBufferSize);s.runningState=13;case 13:if(writeRingBuffer(s)==0){return}if(s.pos>=s.maxBackwardDistance){s.maxDistance=s.maxBackwardDistance}if(s.pos>=s.ringBufferSize){if(s.pos>s.ringBufferSize){ringBuffer.copyWithin(0,s.ringBufferSize,s.pos)}s.pos&=ringBufferMask;s.ringBufferBytesWritten=0}s.runningState=s.nextRunningState;continue;default:throw"Unexpected state "+s.runningState}}if(s.runningState==10){if(s.metaBlockLength<0){throw"Invalid metablock length"}jumpToByteBoundary(s);checkHealth(s,1)}}function Transforms(numTransforms,prefixSuffixLen,prefixSuffixCount){this.numTransforms=0;this.triplets=new Int32Array(0);this.prefixSuffixStorage=new Int8Array(0);this.prefixSuffixHeads=new Int32Array(0);this.params=new Int16Array(0);this.numTransforms=numTransforms;this.triplets=new Int32Array(numTransforms*3);this.params=new Int16Array(numTransforms);this.prefixSuffixStorage=new Int8Array(prefixSuffixLen);this.prefixSuffixHeads=new Int32Array(prefixSuffixCount+1)}var RFC_TRANSFORMS=new Transforms(121,167,50);function unpackTransforms(prefixSuffix,prefixSuffixHeads,transforms,prefixSuffixSrc,transformsSrc){var n=prefixSuffixSrc.length;var index=1;var j=0;for(var i=0;i#\n#]# for # a # that #. # with #\'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #="# of the #. This #,# not #er #al #=\'#ful #ive #less #est #ize #ous #'," !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K")}function transformDictionaryWord(dst,dstOffset,src,srcOffset,len,transforms,transformIndex){var offset=dstOffset;var triplets=transforms.triplets;var prefixSuffixStorage=transforms.prefixSuffixStorage;var prefixSuffixHeads=transforms.prefixSuffixHeads;var transformOffset=3*transformIndex;var prefixIdx=triplets[transformOffset];var transformType=triplets[transformOffset+1];var suffixIdx=triplets[transformOffset+2];var prefix=prefixSuffixHeads[prefixIdx];var prefixEnd=prefixSuffixHeads[prefixIdx+1];var suffix=prefixSuffixHeads[suffixIdx];var suffixEnd=prefixSuffixHeads[suffixIdx+1];var omitFirst=transformType-11;var omitLast=transformType-0;if(omitFirst<1||omitFirst>9){omitFirst=0}if(omitLast<1||omitLast>9){omitLast=0}while(prefix!=prefixEnd){dst[offset++]=prefixSuffixStorage[prefix++]}if(omitFirst>len){omitFirst=len}srcOffset+=omitFirst;len-=omitFirst;len-=omitLast;var i=len;while(i>0){dst[offset++]=src[srcOffset++];i--}if(transformType==10||transformType==11){var uppercaseOffset=offset-len;if(transformType==10){len=1}while(len>0){var c0=dst[uppercaseOffset]&255;if(c0<192){if(c0>=97&&c0<=122){dst[uppercaseOffset]^=32}uppercaseOffset+=1;len-=1}else if(c0<224){dst[uppercaseOffset+1]^=32;uppercaseOffset+=2;len-=2}else{dst[uppercaseOffset+2]^=5;uppercaseOffset+=3;len-=3}}}else if(transformType==21||transformType==22){var shiftOffset=offset-len;var param=transforms.params[transformIndex];var scalar=(param&32767)+(16777216-(param&32768));while(len>0){var step=1;var c0=dst[shiftOffset]&255;if(c0<128){scalar+=c0;dst[shiftOffset]=scalar&127}else if(c0<192){}else if(c0<224){if(len>=2){var c1=dst[shiftOffset+1];scalar+=c1&63|(c0&31)<<6;dst[shiftOffset]=192|scalar>>6&31;dst[shiftOffset+1]=c1&192|scalar&63;step=2}else{step=len}}else if(c0<240){if(len>=3){var c1=dst[shiftOffset+1];var c2=dst[shiftOffset+2];scalar+=c2&63|(c1&63)<<6|(c0&15)<<12;dst[shiftOffset]=224|scalar>>12&15;dst[shiftOffset+1]=c1&192|scalar>>6&63;dst[shiftOffset+2]=c2&192|scalar&63;step=3}else{step=len}}else if(c0<248){if(len>=4){var c1=dst[shiftOffset+1];var c2=dst[shiftOffset+2];var c3=dst[shiftOffset+3];scalar+=c3&63|(c2&63)<<6|(c1&63)<<12|(c0&7)<<18;dst[shiftOffset]=240|scalar>>18&7;dst[shiftOffset+1]=c1&192|scalar>>12&63;dst[shiftOffset+2]=c2&192|scalar>>6&63;dst[shiftOffset+3]=c3&192|scalar&63;step=4}else{step=len}}shiftOffset+=step;len-=step;if(transformType==21){len=0}}}while(suffix!=suffixEnd){dst[offset++]=prefixSuffixStorage[suffix++]}return offset-dstOffset}function getNextKey(key,len){var step=1<>=1}return(key&step-1)+step}function replicateValue(table,offset,step,end,item){do{end-=step;table[offset+end]=item}while(end>0)}function nextTableBitSize(count,len,rootBits){var left=1<0;count[len]--){replicateValue(tableGroup,tableOffset+key,step,tableSize,len<<16|sorted[symbol++]);key=getNextKey(key,len)}}var mask=totalSize-1;var low=-1;var currentOffset=tableOffset;for(var len=rootBits+1,step=2;len<=15;len++,step<<=1){for(;count[len]>0;count[len]--){if((key&mask)!=low){currentOffset+=tableSize;tableBits=nextTableBitSize(count,len,rootBits);tableSize=1<>rootBits),step,tableSize,len-rootBits<<16|sorted[symbol++]);key=getNextKey(key,len)}}return totalSize}function doReadMoreInput(s){if(s.endOfStreamReached!=0){if(halfAvailable(s)>=-2){return}throw"No more input"}var readOffset=s.halfOffset<<1;var bytesInBuffer=4096-readOffset;s.byteBuffer.copyWithin(0,readOffset,4096);s.halfOffset=0;while(bytesInBuffer<4096){var spaceLeft=4096-bytesInBuffer;var len=readInput(s.input,s.byteBuffer,bytesInBuffer,spaceLeft);if(len<=0){s.endOfStreamReached=1;s.tailBytes=bytesInBuffer;bytesInBuffer+=1;break}bytesInBuffer+=len}bytesToNibbles(s,bytesInBuffer)}function checkHealth(s,endOfStream){if(s.endOfStreamReached==0){return}var byteOffset=(s.halfOffset<<1)+(s.bitOffset+7>>3)-4;if(byteOffset>s.tailBytes){throw"Read after end"}if(endOfStream!=0&&byteOffset!=s.tailBytes){throw"Unused bytes after end"}}function readFewBits(s,n){var val=s.accumulator32>>>s.bitOffset&(1<>>16;s.bitOffset-=16;return low|readFewBits(s,n-16)<<16}function initBitReader(s){s.byteBuffer=new Int8Array(4160);s.accumulator32=0;s.shortBuffer=new Int16Array(2080);s.bitOffset=32;s.halfOffset=2048;s.endOfStreamReached=0;prepare(s)}function prepare(s){if(s.halfOffset>2030){doReadMoreInput(s)}checkHealth(s,0);s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16;s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}function reload(s){if(s.bitOffset==32){prepare(s)}}function jumpToByteBoundary(s){var padding=32-s.bitOffset&7;if(padding!=0){var paddingBits=readFewBits(s,padding);if(paddingBits!=0){throw"Corrupted padding bits"}}}function halfAvailable(s){var limit=2048;if(s.endOfStreamReached!=0){limit=s.tailBytes+1>>1}return limit-s.halfOffset}function copyBytes(s,data,offset,length){if((s.bitOffset&7)!=0){throw"Unaligned copyBytes"}while(s.bitOffset!=32&&length!=0){data[offset++]=s.accumulator32>>>s.bitOffset;s.bitOffset+=8;length--}if(length==0){return}var copyNibbles=min(halfAvailable(s),length>>1);if(copyNibbles>0){var readOffset=s.halfOffset<<1;var delta=copyNibbles<<1;data.set(s.byteBuffer.subarray(readOffset,readOffset+delta),offset);offset+=delta;length-=delta;s.halfOffset+=copyNibbles}if(length==0){return}if(halfAvailable(s)>0){if(s.bitOffset>=16){s.accumulator32=s.shortBuffer[s.halfOffset++]<<16|s.accumulator32>>>16;s.bitOffset-=16}while(length!=0){data[offset++]=s.accumulator32>>>s.bitOffset;s.bitOffset+=8;length--}checkHealth(s,0);return}while(length>0){var len=readInput(s.input,data,offset,length);if(len==-1){throw"Unexpected end of input"}offset+=len;length-=len}}function bytesToNibbles(s,byteLen){var byteBuffer=s.byteBuffer;var halfLen=byteLen>>1;var shortBuffer=s.shortBuffer;for(var i=0;i>2;lookup[1792+i]=2+(i>>6)}for(var i=0;i<128;++i){lookup[1024+i]=4*(map.charCodeAt(i)-32)}for(var i=0;i<64;++i){lookup[1152+i]=i&1;lookup[1216+i]=2+(i&1)}var offset=1280;for(var k=0;k<19;++k){var value=k&3;var rep=rle.charCodeAt(k)-32;for(var i=0;istopelseliestourpack.gifpastcss?graymean>rideshotlatesaidroadvar feeljohnrickportfast\'UA-deadpoorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$(\'#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid="sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnear\x3c!--growJSONdutyNamesaleyou lotspainjazzcoldeyesfishwww.risktabsprev10pxrise25pxBlueding300,ballfordearnwildbox.fairlackverspairjunetechif(!pickevil$("#warmlorddoespull,000ideadrawhugespotfundburnhrefcellkeystickhourlossfuel12pxsuitdealRSS"agedgreyGET"easeaimsgirlaids8px;navygridtips#999warsladycars); }php?helltallwhomzh:e*/\r\n 100hall.\n\nA7px;pushchat0px;crew*/ericmostguidbelldeschairmathatom/imgRluckcent000;tinygonehtmlselldrugFREEnodenick?id=losenullvastwindRSS wearrelybeensamedukenasacapewishgulfT23:hitsslotgatekickblurthey15px\'\'););">msiewinsbirdsortbetaseekT18:ordstreemall60pxfarmb\0sboys[0].\');"POSTbearkids);}}marytend(UK)quadzh:f-siz----prop\');\rliftT19:viceandydebt>RSSpoolneckblowT16:doorevalT17:letsfailoralpollnovacolsgene b\0softrometillross
collection\r\nfunctionvisibilitythe use ofvolunteersattractionunder the threatened*\nevaluationemphasizedaccessiblesuccessionalong withMeanwhile,industries has becomeaspects ofTelevisionsufficientbasketballboth sidescontinuingan articlepublishersJournal ofdifficultyfacilitateacceptablestyle.css"\tfunction innovation>Copyrightsituationswould havebusinessesDictionarystatementsoften usedpersistentin Januarycomprising\n\tdiplomaticcontainingperformingextensionsmay not beconcept of onclick="It is alsofinancial making theLuxembourgadditionalare calledengaged in"script");but it waselectroniconsubmit="\n\x3c!-- End electricalofficiallysuggestiontop of theunlike theAustralianOriginallyreferences\n\r\nrecognisedinitializelimited toAlexandriaretirementAdventuresfour years\n\n<!-- increasingdecorationh3 class="origins ofobligationregulationclassified(function(advantagesbeing the historiansthe publicmany yearswhich wereover time,synonymouscontent">\npresumablyhis familyuserAgent.unexpectedincluding challengeda minorityundefined"belongs totaken fromin Octoberposition: said to bereligious Federation rowspan="only a fewmeant thatled to the--\x3e\r\n
Archbishop class="nobeing usedapproachesprivilegesnoscript>\nresults inmay be theEaster eggmechanismsreasonablePopulationCollectionselected">noscript>\r/index.phparrival of-jssdk\'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that\n\t\tcomplaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype="absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php?\npercentagebest-knowncreating a" dir="ltrLieutenant\n
is said tostructuralreferendummost oftena separate->\n