diff --git a/assets/js/games/engine/ansi-converter.js b/assets/js/games/engine/ansi-converter.js new file mode 100644 index 0000000..61022e2 --- /dev/null +++ b/assets/js/games/engine/ansi-converter.js @@ -0,0 +1,194 @@ +// ANSI to HTML Converter (256-color + bold, persistent spans) +const AnsiConverter = { + // Standard + 256-color palette + palette: [ + "#000000", + "#800000", + "#008000", + "#808000", + "#000080", + "#800080", + "#008080", + "#c0c0c0", + "#808080", + "#ff0000", + "#00ff00", + "#ffff00", + "#0000ff", + "#ff00ff", + "#00ffff", + "#ffffff", + // 216-color cube (16-231) + ...(() => { + const colors = []; + const levels = [0, 95, 135, 175, 215, 255]; + for (let r = 0; r < 6; r++) { + for (let g = 0; g < 6; g++) { + for (let b = 0; b < 6; b++) { + colors.push( + `#${levels[r].toString(16).padStart(2, "0")}${levels[g].toString(16).padStart(2, "0")}${levels[b].toString(16).padStart(2, "0")}`, + ); + } + } + } + return colors; + })(), + // Grayscale (232-255) + ...(() => { + const grays = []; + for (let i = 0; i < 24; i++) { + const level = 8 + i * 10; + const hex = level.toString(16).padStart(2, "0"); + grays.push(`#${hex}${hex}${hex}`); + } + return grays; + })(), + ], + + // Convert 256-color index to hex + ansi256ToHex(index) { + index = Number(index); + if (index < this.palette.length) return this.palette[index]; + return null; + }, + + // Escape HTML special characters + escapeHtml(text) { + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); + }, + + // Convert style object to CSS string + styleToCss(style) { + const css = []; + if (style.color) css.push(`color:${style.color}`); + if (style.backgroundColor) + css.push(`background-color:${style.backgroundColor}`); + if (style.bold) css.push("font-weight:bold"); + return css.join(";"); + }, + + // Convert ANSI string to HTML + convert(ansiString) { + // Normalize escapes (\e and \x1b) + let processed = ansiString + .replace(/\\e/g, "\x1b") + .replace(/\\x1b/g, "\x1b"); + + // Regex to match ANSI SGR sequences + const ansiRegex = /\x1b\[([0-9;]*)m/g; + + let html = ""; + let lastIndex = 0; + let spanOpen = false; + let currentStyle = {}; + + let match; + while ((match = ansiRegex.exec(processed)) !== null) { + // Append text before escape sequence + const textBefore = processed.slice(lastIndex, match.index); + if (textBefore) html += this.escapeHtml(textBefore); + + // Parse SGR codes + const codes = match[1].split(";").map((s) => (s === "" ? 0 : Number(s))); + let styleChanged = false; + + for (let i = 0; i < codes.length; i++) { + const code = codes[i]; + + // Reset + if (code === 0) { + currentStyle = {}; + styleChanged = true; + continue; + } + + // Bold + if (code === 1) { + currentStyle.bold = true; + styleChanged = true; + continue; + } + + // Foreground 30-37 + if (code >= 30 && code <= 37) { + currentStyle.color = this.palette[code - 30]; + styleChanged = true; + continue; + } + + // Bright foreground 90-97 + if (code >= 90 && code <= 97) { + currentStyle.color = this.palette[code - 90 + 8]; + styleChanged = true; + continue; + } + + // Background 40-47 + if (code >= 40 && code <= 47) { + currentStyle.backgroundColor = this.palette[code - 40]; + styleChanged = true; + continue; + } + + // Bright background 100-107 + if (code >= 100 && code <= 107) { + currentStyle.backgroundColor = this.palette[code - 100 + 8]; + styleChanged = true; + continue; + } + + // 256-color foreground: 38;5;N + if (code === 38 && codes[i + 1] === 5) { + currentStyle.color = this.ansi256ToHex(codes[i + 2]); + i += 2; + styleChanged = true; + continue; + } + + // 256-color background: 48;5;N + if (code === 48 && codes[i + 1] === 5) { + currentStyle.backgroundColor = this.ansi256ToHex(codes[i + 2]); + i += 2; + styleChanged = true; + continue; + } + } + + // Update span if style changed + if (styleChanged) { + if (spanOpen) html += ""; + const css = this.styleToCss(currentStyle); + if (css) { + html += ``; + spanOpen = true; + } else { + spanOpen = false; + } + } + + lastIndex = match.index + match[0].length; + } + + // Append remaining text + const remaining = processed.slice(lastIndex); + if (remaining) html += this.escapeHtml(remaining); + + // Close final span + if (spanOpen) html += ""; + + return html; + }, + + // Wrap in
 for proper display
+  convertToBlock(ansiString, className = "ansi-art") {
+    console.log("AnsiConverter.convertToBlock called");
+    return `
${this.convert(ansiString)}
`; + }, +}; + +// Export for browser +if (typeof window !== "undefined") window.AnsiConverter = AnsiConverter; diff --git a/assets/js/games/engine/game-engine.js b/assets/js/games/engine/game-engine.js new file mode 100644 index 0000000..c96841c --- /dev/null +++ b/assets/js/games/engine/game-engine.js @@ -0,0 +1,357 @@ +// Game Engine - Main orchestrator for terminal games +class GameEngine { + constructor(gameDefinition) { + this.definition = gameDefinition; + this.terminal = null; + this.adapter = null; + this.state = null; + this.sharedState = null; // For series games + this.input = null; + this.sound = null; + this.scenes = null; + + this.isRunning = false; + this.originalExecuteCommand = null; + + // Series support + this.seriesId = gameDefinition.seriesId || null; + this.chapterNumber = gameDefinition.chapterNumber || null; + } + + // Register this game as a terminal command + register() { + if (!window.terminal) { + console.warn( + "Terminal not available, cannot register game:", + this.definition.id, + ); + return; + } + + this.terminal = window.terminal; + const self = this; + const def = this.definition; + + // this.terminal.registerCommand( + // def.command || def.id, + // def.description || `Play ${def.name}`, + // async (args) => { + // if (args[0] === "reset") { + // self._reset(); + // return; + // } + // if (args[0] === "reset-series" && self.seriesId) { + // self._resetSeries(); + // return; + // } + // if (args[0] === "continue" || args[0] === "resume") { + // await self.start(true); + // return; + // } + // await self.start(); + // }, + // ); + } + + // Start the game + async start(continueGame = false) { + if (this.isRunning) { + this.terminal.printWarning("Game is already running!"); + return; + } + + // Initialize shared state for series games (do this early for chapter check) + if (this.seriesId && window.SharedStateManager) { + this.sharedState = new SharedStateManager(this.seriesId); + this.sharedState.init(this.definition.sharedStateDefaults || {}); + + // Check if this chapter can be played (sequential unlock) + if (this.chapterNumber && this.chapterNumber > 1) { + if (!this.sharedState.canPlayChapter(this.chapterNumber)) { + const prevChapter = this.chapterNumber - 1; + this.terminal.printError( + `You must complete Chapter ${prevChapter} before playing Chapter ${this.chapterNumber}.`, + ); + return; + } + } + } + + // Update the global HTML to add the game in progress details + document.body.classList.add("game-in-progress"); + console.log(document.body.classList); + + this.isRunning = true; + + // Initialize components + this.adapter = new TerminalAdapter(this.terminal); + this.state = new StateManager(this.definition.id, this.sharedState); + this.input = new InputManager(this.adapter); + + // Initialize sound manager if SoundManager is available + if (window.SoundManager) { + this.sound = new SoundManager(this.adapter); + } + + this.scenes = new SceneManager( + this.adapter, + this.state, + this.input, + this.sound, + ); + + // Initialize state + this.state.init(this.definition.initialState || {}); + + // Load and merge external scenes if defined + const mergedScenes = this._getMergedScenes(); + + // Register scenes + this.scenes.registerScenes(mergedScenes); + + // Hook into terminal input + this._hookInput(); + + // Check for existing save + const hasSave = this.state.hasSavedState(); + + // Show intro unless continuing + if (!continueGame && !hasSave) { + if (this.definition.intro) { + await this._playIntro(); + } + } else if (hasSave && !continueGame) { + // Ask if player wants to continue + this.adapter.clear(); + this.adapter.printInfo("A saved game was found."); + const shouldContinue = await this.input.awaitConfirm( + "Continue from where you left off?", + ); + + if (!shouldContinue) { + this.state.reset(); + this.state.init(this.definition.initialState || {}); + if (this.definition.intro) { + await this._playIntro(); + } + } + } + + // Go to start scene (or last scene if continuing) + const startScene = + this.state.get("_currentScene") || this.definition.startScene || "start"; + await this.scenes.goTo(startScene); + } + + async _playIntro() { + this.adapter.clear(); + + // Show title + if (this.definition.name) { + this.adapter.printHTML( + `
${this.definition.name}
`, + ); + this.adapter.print(""); + } + + // Show intro content + if (typeof this.definition.intro === "string") { + this.adapter.print(this.definition.intro); + } else if (Array.isArray(this.definition.intro)) { + await this.scenes._renderContent(this.definition.intro); + } + + this.adapter.print(""); + + // Wait for input to continue + await this.input.awaitOption( + [{ text: "Begin", value: true }], + "Press Enter or 1 to start...", + ); + } + + _hookInput() { + // Store original executeCommand + this.originalExecuteCommand = this.terminal.executeCommand.bind( + this.terminal, + ); + + // Override to intercept input + const self = this; + this.terminal.executeCommand = function (commandString) { + if (!self.isRunning) { + return self.originalExecuteCommand(commandString); + } + + // Check for exit commands + const cmd = commandString.toLowerCase().trim(); + if (cmd === "quit" || cmd === "exit" || cmd === "q") { + self.stop(); + return; + } + + // Check for save command + if (cmd === "save") { + self._saveProgress(); + return; + } + + // Check for debug scene skip command (goto ) + if (cmd.startsWith("goto ")) { + const sceneName = commandString.trim().substring(5).trim(); + self._debugGoToScene(sceneName); + return; + } + + // Pass to input manager if in text mode + if (self.input.getMode() === "text") { + self.input.handleTextInput(commandString); + } + }; + } + + _saveProgress() { + // Save current scene for resuming + const currentSceneId = this.scenes.getCurrentSceneId(); + if (currentSceneId) { + this.state.set("_currentScene", currentSceneId); + } + this.adapter.printSuccess("Game progress saved."); + } + + // Stop the game and restore terminal + stop() { + // Save progress before stopping + this._saveProgress(); + + // Update the global HTML to remove the game in progress details + document.body.classList.remove("game-in-progress"); + + this.isRunning = false; + + // Cleanup sound manager + if (this.sound) { + this.sound.stopAll(); + } + + // Cleanup input manager + if (this.input) { + this.input.destroy(); + } + + // Restore original command handler + if (this.originalExecuteCommand) { + this.terminal.executeCommand = this.originalExecuteCommand; + } + + this.adapter.print(""); + this.adapter.printInfo(`Exited ${this.definition.name}. Progress saved.`); + this.adapter.print('Type "help" for available commands.'); + this.adapter.print( + `Type "${this.definition.command || this.definition.id}" to continue playing.`, + ); + } + + _reset() { + if (this.state) { + this.state.reset(); + } else { + // Create temporary state manager just to reset + const tempState = new StateManager(this.definition.id); + tempState.reset(); + } + this.terminal.printSuccess( + `${this.definition.name} progress has been reset.`, + ); + } + + // Reset entire series progress (for series games) + _resetSeries() { + // Reset chapter state + this._reset(); + + // Reset shared state + if (this.seriesId) { + const sharedState = new SharedStateManager(this.seriesId); + sharedState.reset(); + this.terminal.printSuccess( + `All ${this.definition.name} series progress has been reset.`, + ); + } + } + + // Create context for scene factories + _createSceneContext() { + return { + chapterNumber: this.chapterNumber || 1, + seriesId: this.seriesId, + sharedState: this.sharedState, + art: this.definition.art || {}, + additionalOptions: this.definition.additionalHubOptions || [], + }; + } + + // Load external scenes and merge with inline scenes + _getMergedScenes() { + const inlineScenes = this.definition.scenes || {}; + + // If no external scenes defined, just return inline scenes + if ( + !this.definition.externalScenes || + this.definition.externalScenes.length === 0 + ) { + return inlineScenes; + } + + // Load external scenes from registered factories + const externalScenes = {}; + const context = this._createSceneContext(); + + for (const sceneRef of this.definition.externalScenes) { + const factory = window.SceneFactories?.[sceneRef]; + if (factory) { + try { + const scenes = factory(context); + Object.assign(externalScenes, scenes); + } catch (e) { + console.error(`Failed to load external scenes from ${sceneRef}:`, e); + } + } else { + console.warn(`Scene factory not found: ${sceneRef}`); + } + } + + // Inline scenes override external scenes (allows chapter-specific overrides) + return { ...externalScenes, ...inlineScenes }; + } + + // Debug command to skip to a specific scene + async _debugGoToScene(sceneName) { + const scene = this.scenes.getScene(sceneName); + if (!scene) { + this.adapter.printError(`Scene not found: ${sceneName}`); + this.adapter.print(""); + this.adapter.printInfo("Available scenes:"); + const sceneNames = Object.keys(this.definition.scenes).sort(); + for (const name of sceneNames) { + this.adapter.print(` ${name}`); + } + return; + } + this.adapter.printWarning(`[DEBUG] Skipping to scene: ${sceneName}`); + await this.scenes.goTo(sceneName); + } + + // Check if game is currently running + isActive() { + return this.isRunning; + } + + // Get game definition + getDefinition() { + return this.definition; + } +} + +// Make available globally +window.GameEngine = GameEngine; diff --git a/assets/js/games/engine/input-manager.js b/assets/js/games/engine/input-manager.js new file mode 100644 index 0000000..547fa23 --- /dev/null +++ b/assets/js/games/engine/input-manager.js @@ -0,0 +1,215 @@ +// Input Manager - Handles text input and option selection modes +class InputManager { + constructor(adapter) { + this.adapter = adapter; + this.mode = "idle"; // "idle" | "text" | "options" + this.options = []; + this.selectedIndex = 0; + this.inputResolve = null; + this.optionsContainerId = "game-options-" + Date.now(); + this.keydownHandler = null; + + this._setupKeyboardListener(); + } + + _setupKeyboardListener() { + this.keydownHandler = (e) => { + if (this.mode !== "options") return; + + // Check if terminal input has text - if so, let user submit commands like "quit" + const terminalInput = document.getElementById("input"); + const hasInputText = + terminalInput && terminalInput.value.trim().length > 0; + + if (e.key === "ArrowUp") { + e.preventDefault(); + e.stopPropagation(); + this._selectPrevious(); + } else if (e.key === "ArrowDown") { + e.preventDefault(); + e.stopPropagation(); + this._selectNext(); + } else if (e.key === "Enter") { + // If user has typed something, let it through to submit the command + if (hasInputText) return; + e.preventDefault(); + e.stopPropagation(); + this._confirmSelection(); + } else if (/^[1-9]$/.test(e.key)) { + // Only intercept if input is empty (user isn't typing a command) + if (hasInputText) return; + const index = parseInt(e.key) - 1; + if (index < this.options.length) { + e.preventDefault(); + e.stopPropagation(); + this.selectedIndex = index; + this._confirmSelection(); + } + } + }; + + document.addEventListener("keydown", this.keydownHandler, true); + } + + // Text input mode - wait for user to type something + awaitText(prompt = "") { + return new Promise((resolve) => { + if (prompt) { + this.adapter.printInfo(prompt); + } + + this.mode = "text"; + this.inputResolve = resolve; + + this.adapter.captureInput((value) => { + this.adapter.print(`> ${value}`); + this.mode = "idle"; + this.adapter.releaseInput(); + if (this.inputResolve) { + const res = this.inputResolve; + this.inputResolve = null; + res(value); + } + }); + + this.adapter.focusInput(); + }); + } + + // Options selection mode - display choices and wait for selection + awaitOption(options, prompt = "") { + return new Promise((resolve) => { + this.mode = "options"; + this.options = options; + this.selectedIndex = 0; + this.optionsContainerId = "game-options-" + Date.now(); + + if (prompt) { + this.adapter.print(""); + this.adapter.printInfo("------------------"); + this.adapter.printInfo(prompt); + } + this.adapter.print(""); + + this._renderOptions(); + + this.inputResolve = (index) => { + this.mode = "idle"; + resolve({ + index, + option: this.options[index], + }); + }; + }); + } + + // Yes/No confirmation + awaitConfirm(prompt = "Continue?") { + return this.awaitOption( + [ + { text: "Yes", value: true }, + { text: "No", value: false }, + ], + prompt, + ).then((result) => result.option.value); + } + + // Handle text input from game engine + handleTextInput(value) { + if (this.mode === "text" && this.inputResolve) { + this.adapter.print(`> ${value}`); + this.mode = "idle"; + const res = this.inputResolve; + this.inputResolve = null; + res(value); + } + } + + _renderOptions() { + const optionsHTML = this.options + .map((opt, idx) => { + const selected = idx === this.selectedIndex; + const prefix = selected ? ">" : " "; + const className = selected ? "game-option-selected" : "game-option"; + const text = typeof opt === "string" ? opt : opt.text; + return `
${prefix} ${idx + 1}. ${text}
`; + }) + .join(""); + + this.adapter.printHTML( + `
${optionsHTML}
`, + ); + this.adapter.scrollToBottom(); + } + + _updateOptionsDisplay() { + const container = document.getElementById(this.optionsContainerId); + if (!container) return; + + const optionDivs = container.querySelectorAll("div"); + optionDivs.forEach((div, idx) => { + const selected = idx === this.selectedIndex; + div.className = selected ? "game-option-selected" : "game-option"; + const text = + typeof this.options[idx] === "string" + ? this.options[idx] + : this.options[idx].text; + div.textContent = `${selected ? ">" : " "} ${idx + 1}. ${text}`; + }); + } + + _selectPrevious() { + if (this.selectedIndex > 0) { + this.selectedIndex--; + this._updateOptionsDisplay(); + } + } + + _selectNext() { + if (this.selectedIndex < this.options.length - 1) { + this.selectedIndex++; + this._updateOptionsDisplay(); + } + } + + _confirmSelection() { + if (this.inputResolve) { + const res = this.inputResolve; + this.inputResolve = null; + + // Show what was selected + const selectedOpt = this.options[this.selectedIndex]; + const text = + typeof selectedOpt === "string" ? selectedOpt : selectedOpt.text; + this.adapter.print(""); + this.adapter.printSuccess(`> ${text}`); + + res(this.selectedIndex); + } + } + + // Check if currently waiting for input + isWaiting() { + return this.mode !== "idle"; + } + + // Get current mode + getMode() { + return this.mode; + } + + // Cancel current input (for cleanup) + cancel() { + this.mode = "idle"; + this.inputResolve = null; + this.adapter.releaseInput(); + } + + // Cleanup when game ends + destroy() { + if (this.keydownHandler) { + document.removeEventListener("keydown", this.keydownHandler, true); + } + this.cancel(); + } +} diff --git a/assets/js/games/engine/scene-manager.js b/assets/js/games/engine/scene-manager.js new file mode 100644 index 0000000..90ea77e --- /dev/null +++ b/assets/js/games/engine/scene-manager.js @@ -0,0 +1,754 @@ +// Scene Manager - Handles scene definitions, rendering, and transitions +class SceneManager { + constructor(adapter, stateManager, inputManager, soundManager = null) { + this.adapter = adapter; + this.state = stateManager; + this.input = inputManager; + this.sound = soundManager; + this.scenes = {}; + this.currentScene = null; + this.sceneHistory = []; + this.activeSounds = new Map(); // Track sounds started in current scene + } + + // Register scenes from game definition + registerScenes(sceneDefinitions) { + for (const [id, scene] of Object.entries(sceneDefinitions)) { + this.scenes[id] = { id, ...scene }; + } + } + + // Get scene by ID + getScene(sceneId) { + return this.scenes[sceneId]; + } + + // Navigate to a scene + async goTo(sceneId, options = {}) { + const scene = this.getScene(sceneId); + if (!scene) { + this.adapter.printError(`Scene not found: ${sceneId}`); + return; + } + + // Track history for back navigation + if (this.currentScene && !options.noHistory) { + this.sceneHistory.push(this.currentScene.id); + } + + // Stop scene-specific sounds from previous scene + await this._cleanupSceneSounds(); + + this.currentScene = scene; + + // Preload sounds for this scene + if (this.sound && scene.sounds) { + await this._preloadSceneSounds(scene.sounds); + } + + // Execute onEnter actions + if (scene.onEnter) { + await this._executeActions(scene.onEnter); + } + + // Render the scene + await this._renderScene(scene); + } + + // Go back to previous scene + async goBack() { + if (this.sceneHistory.length === 0) { + this.adapter.printWarning("No previous scene"); + return; + } + const previousId = this.sceneHistory.pop(); + await this.goTo(previousId, { noHistory: true }); + } + + // Render a scene + async _renderScene(scene) { + // Clear screen unless disabled + if (scene.clear !== false) { + this.adapter.clear(); + } + + // Render title + if (scene.title) { + this.adapter.printHTML( + `${scene.title}`, + ); + this.adapter.print(""); + } + + // Render content blocks + if (scene.content) { + await this._renderContent(scene.content); + } + + // Execute onAfterRender actions (after content, before options) + if (scene.onAfterRender) { + await this._executeActions(scene.onAfterRender); + } + + // Handle navigation + if (scene.options) { + await this._handleOptions(scene); + } else if (scene.input) { + await this._handleTextInput(scene); + } else if (scene.next) { + // Auto-advance with optional delay + const delay = scene.delay || 0; + if (delay > 0) { + await this._sleep(delay); + } + await this.goTo(scene.next); + } + } + + // Render content blocks (supports conditional content) + async _renderContent(content) { + const blocks = Array.isArray(content) ? content : [content]; + + for (const block of blocks) { + // Simple string + if (typeof block === "string") { + this._printText(block); + continue; + } + + // Conditional block + if (block.condition !== undefined) { + if (this.state.evaluate(block.condition)) { + if (block.content) { + await this._renderContent(block.content); + } + } else if (block.else) { + await this._renderContent(block.else); + } + continue; + } + + // Typed blocks + if (block.type === "ascii") { + this.adapter.print(block.art, block.className || "game-ascii"); + continue; + } + + if (block.type === "ansi") { + // Convert ANSI escape codes to HTML + const html = AnsiConverter.convertToBlock( + block.art, + block.className || "game-ansi-art", + ); + this.adapter.printHTML(html); + continue; + } + + if (block.type === "html") { + this.adapter.printHTML(block.html, block.className || ""); + continue; + } + + if (block.type === "delay") { + await this._sleep(block.ms || 1000); + continue; + } + + if (block.type === "typewriter") { + await this._typewriter(block.text, block.speed || 50, { + bold: block.bold, + italic: block.italic, + className: block.className, + }); + continue; + } + + if (block.type === "table") { + await this._renderTable(block); + continue; + } + + if (block.type === "sound") { + await this._handleSound(block); + continue; + } + + if (block.type === "glitch") { + await this._renderGlitch(block); + continue; + } + + // Text with optional className (supports html: true for HTML content) + if (block.text !== undefined) { + if (block.html) { + this._printHTML(block.text, block.className || ""); + } else { + this._printText(block.text, block.className || "", { + bold: block.bold, + italic: block.italic, + }); + } + continue; + } + } + } + + // Print text with variable interpolation + _printText(text, className = "", options = {}) { + // Support ${path} interpolation + const interpolated = text.replace(/\$\{([^}]+)\}/g, (match, path) => { + const value = this.state.get(path); + return value !== undefined ? String(value) : match; + }); + + // Build style classes based on options + let styleClasses = className; + if (options.bold) + styleClasses += (styleClasses ? " " : "") + "typewriter-bold"; + if (options.italic) + styleClasses += (styleClasses ? " " : "") + "typewriter-italic"; + + if (styleClasses) { + this.adapter.print(interpolated, styleClasses); + } else { + this.adapter.print(interpolated); + } + } + + // Print HTML with variable interpolation + _printHTML(html, className = "") { + // Support ${path} interpolation + const interpolated = html.replace(/\$\{([^}]+)\}/g, (match, path) => { + const value = this.state.get(path); + return value !== undefined ? String(value) : match; + }); + + if (className) { + this.adapter.printHTML( + `${interpolated}`, + ); + } else { + this.adapter.printHTML(interpolated); + } + } + + // Handle options/choices + async _handleOptions(scene) { + // Filter options based on conditions + const availableOptions = scene.options.filter((opt) => { + if (opt.condition !== undefined) { + return this.state.evaluate(opt.condition); + } + return true; + }); + + if (availableOptions.length === 0) { + if (scene.fallback) { + await this.goTo(scene.fallback); + } + return; + } + + const result = await this.input.awaitOption( + availableOptions.map((o) => ({ + text: this._interpolateText(o.text), + value: o, + })), + scene.prompt || "What do you do?", + ); + + const selected = result.option.value; + + // Execute option actions + if (selected.actions) { + await this._executeActions(selected.actions); + } + + // Navigate to next scene + if (selected.next) { + await this.goTo(selected.next); + } + } + + // Handle text input + async _handleTextInput(scene) { + const inputDef = scene.input; + const value = await this.input.awaitText(inputDef.prompt); + + // Store value if specified + if (inputDef.store) { + this.state.set(inputDef.store, value); + } + + // Check for pattern matches + if (inputDef.matches) { + for (const match of inputDef.matches) { + const pattern = + match.pattern instanceof RegExp + ? match.pattern + : new RegExp(match.pattern, "i"); + + if (pattern.test(value)) { + if (match.actions) { + await this._executeActions(match.actions); + } + if (match.next) { + await this.goTo(match.next); + } + return; + } + } + } + + // No match - use default + if (inputDef.default) { + if (inputDef.default.actions) { + await this._executeActions(inputDef.default.actions); + } + if (inputDef.default.next) { + await this.goTo(inputDef.default.next); + } + } else if (inputDef.next) { + await this.goTo(inputDef.next); + } + } + + // Execute action commands + async _executeActions(actions) { + const actionList = Array.isArray(actions) ? actions : [actions]; + + for (const action of actionList) { + if (action.set !== undefined) { + this.state.set(action.set, action.value); + } + + // Set value in shared state (for series games) + if (action.setShared !== undefined) { + this.state.setShared(action.setShared, action.value); + } + + // Mark a chapter as complete in shared state + if (action.markChapterComplete !== undefined) { + const sharedState = this.state.getSharedState(); + if (sharedState) { + sharedState.markChapterComplete(action.markChapterComplete); + } + } + + if (action.increment !== undefined) { + this.state.increment(action.increment, action.amount || 1); + } + + if (action.decrement !== undefined) { + this.state.decrement(action.decrement, action.amount || 1); + } + + if (action.addItem !== undefined) { + this.state.addToArray(action.to || "inventory", action.addItem); + } + + if (action.removeItem !== undefined) { + this.state.removeFromArray( + action.from || "inventory", + action.removeItem, + ); + } + + if (action.print !== undefined) { + this._printText(action.print, action.className || ""); + } + + if (action.printSuccess !== undefined) { + this.adapter.printSuccess(this._interpolateText(action.printSuccess)); + } + + if (action.printError !== undefined) { + this.adapter.printError(this._interpolateText(action.printError)); + } + + if (action.printWarning !== undefined) { + this.adapter.printWarning(this._interpolateText(action.printWarning)); + } + + if (action.printInfo !== undefined) { + this.adapter.printInfo(this._interpolateText(action.printInfo)); + } + + if (action.delay !== undefined) { + await this._sleep(action.delay); + } + + if (action.goTo !== undefined) { + await this.goTo(action.goTo); + return; // Stop processing further actions after navigation + } + + if (action.callback && typeof action.callback === "function") { + await action.callback(this.state, this.adapter, this); + } + } + } + + // Interpolate variables in text + _interpolateText(text) { + if (typeof text !== "string") return text; + return text.replace(/\$\{([^}]+)\}/g, (match, path) => { + const value = this.state.get(path); + return value !== undefined ? String(value) : match; + }); + } + + // Typewriter effect + async _typewriter(text, speed, options = {}) { + const interpolated = this._interpolateText(text); + let output = ""; + + // Build style classes based on options + let styleClasses = "typewriter-line"; + if (options.bold) styleClasses += " typewriter-bold"; + if (options.italic) styleClasses += " typewriter-italic"; + if (options.className) styleClasses += " " + options.className; + + for (const char of interpolated) { + output += char; + // Create a single updating line for typewriter + const typewriterSpan = + this.adapter.terminal.output.querySelector(".typewriter-line"); + + if (typewriterSpan) { + typewriterSpan.textContent = output; + } else { + this.adapter.printHTML( + `${output}`, + ); + } + + this.adapter.scrollToBottom(); + await this._sleep(speed); + } + + // Finalize the line - remove the typewriter-line class so future typewriters create new lines + const typewriterSpan = + this.adapter.terminal.output.querySelector(".typewriter-line"); + if (typewriterSpan) { + typewriterSpan.classList.remove("typewriter-line"); + } + } + + _sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + + // Render a dynamic table with conditional row support + async _renderTable(block) { + // Filter rows based on conditions + const filteredRows = []; + for (const row of block.rows || []) { + // Row can be: array of cells, or object with { cells, condition, className } + if (Array.isArray(row)) { + // Simple row - array of cells + filteredRows.push(row); + } else if (row.condition !== undefined) { + // Conditional row + if (this.state.evaluate(row.condition)) { + filteredRows.push(this._processTableRow(row)); + } + } else if (row.cells) { + // Object row without condition + filteredRows.push(this._processTableRow(row)); + } + } + + // Build table using TableHelper + const tableOutput = TableHelper.table({ + title: block.title ? this._interpolateText(block.title) : undefined, + headers: block.headers, + rows: filteredRows, + widths: block.widths, + align: block.align, + style: block.style || "single", + padding: block.padding, + }); + + // Render each line of the table + for (const line of tableOutput) { + if (typeof line === "string") { + this._printText(line); + } else if (line.text) { + this._printText(line.text, line.className || ""); + } + } + } + + // Process a table row object into cell array format for TableHelper + _processTableRow(row) { + // If row has className, apply it to cells that don't have their own + const cells = row.cells.map((cell) => { + if (typeof cell === "string" && row.className) { + return { text: this._interpolateText(cell), className: row.className }; + } else if (typeof cell === "object" && cell.text) { + return { + text: this._interpolateText(cell.text), + className: cell.className || row.className, + }; + } + return typeof cell === "string" ? this._interpolateText(cell) : cell; + }); + return cells; + } + + // Get current scene ID + getCurrentSceneId() { + return this.currentScene ? this.currentScene.id : null; + } + + // Reset scene history + resetHistory() { + this.sceneHistory = []; + } + + // Preload sounds for a scene + async _preloadSceneSounds(sounds) { + if (!this.sound) return; + + const soundList = Array.isArray(sounds) ? sounds : [sounds]; + let hasShownLoading = false; + + for (const soundDef of soundList) { + const soundId = soundDef.id; + const url = soundDef.url || soundDef.src; + + if (!soundId || !url) { + console.warn("Invalid sound definition:", soundDef); + continue; + } + + // Skip if already loaded + if (this.sound.isLoaded(soundId)) { + continue; + } + + // Show loading indicator if not shown yet + if (!hasShownLoading) { + this.adapter.printHTML( + 'Loading audio...', + ); + hasShownLoading = true; + } + + try { + await this.sound.preload(soundId, url); + } catch (error) { + console.error(`Failed to preload sound ${soundId}:`, error); + // Continue loading other sounds even if one fails + } + } + + // Remove loading indicator + if (hasShownLoading) { + const indicator = + this.adapter.terminal.output.querySelector(".sound-loading"); + if (indicator) { + indicator.remove(); + } + } + } + + // Handle sound playback in content blocks + async _handleSound(block) { + if (!this.sound) { + console.warn("Sound manager not available"); + return; + } + + const action = block.action || "play"; // play, stop, stopAll + const soundId = block.id || block.sound; + + try { + if (action === "play") { + const options = { + loop: block.loop || false, + volume: block.volume !== undefined ? block.volume : 1.0, + fade: block.fade || false, + fadeDuration: block.fadeDuration || 1000, + }; + + const controller = await this.sound.play(soundId, options); + + // Store reference for cleanup unless it's a one-shot sound + if (block.loop || block.persist) { + this.activeSounds.set(soundId, controller); + } + + // Auto-stop after duration if specified + if (block.duration) { + setTimeout(() => { + if (block.fadeOut !== false) { + controller.fadeOut(block.fadeDuration || 1000); + } else { + controller.stop(); + } + }, block.duration); + } + } else if (action === "stop") { + const controller = this.activeSounds.get(soundId); + if (controller) { + if (block.fadeOut !== false) { + await controller.fadeOut(block.fadeDuration || 1000); + } else { + controller.stop(); + } + this.activeSounds.delete(soundId); + } + } else if (action === "stopAll") { + await this._cleanupSceneSounds(); + } + } catch (error) { + console.error(`Sound error (${action} ${soundId}):`, error); + // Don't show error to user, just log it + } + } + + // Clean up sounds when leaving a scene + async _cleanupSceneSounds() { + if (!this.sound) return; + + const fadePromises = []; + + for (const [, controller] of this.activeSounds) { + if (controller.fadeOut) { + fadePromises.push( + controller.fadeOut(500).catch((e) => console.error("Fade error:", e)), + ); + } else { + controller.stop(); + } + } + + // Wait for all fades to complete + await Promise.all(fadePromises); + this.activeSounds.clear(); + } + + // Render glitching text effect + async _renderGlitch(block) { + const text = this._interpolateText(block.text || ""); + const intensity = block.intensity || 0.3; // How much glitch (0-1) + const spread = block.spread || 2; // How many lines above/below to infect + const speed = block.speed || 50; // Animation speed in ms + const duration = block.duration || 2000; // How long the glitch lasts + const className = block.className || "glitch-text"; + + // Glitch character pool - mix of unicode, symbols, and corrupted chars + const glitchChars = [ + "▓", "▒", "░", "█", "▀", "▄", "▌", "▐", "║", "╬", "╣", "╠", + "¡", "¿", "‽", "※", "§", "¶", "†", "‡", "∞", "≈", "≠", "±", + "░", "▒", "▓", "█", "▀", "▄", "▌", "▐", "╔", "╗", "╚", "╝", + "Ω", "∑", "∏", "∫", "√", "∂", "∆", "∇", "∈", "∉", "∩", "∪", + "̴", "̵", "̶", "̷", "̸", "̡", "̢", "̧", "̨", "̛", "̖", "̗", + "É", "È", "Ê", "Ë", "Á", "À", "Â", "Ã", "Ä", "Å", "Æ", "Ç", + "Ñ", "Õ", "Ö", "Ø", "Ú", "Ù", "Û", "Ü", "Ý", "Þ", "ß", "ð", + "!", "@", "#", "$", "%", "^", "&", "*", "?", "~", "`", "|" + ]; + + // Generate the glitched text + const generateGlitch = (baseText, glitchAmount) => { + let result = ""; + for (let i = 0; i < baseText.length; i++) { + if (Math.random() < glitchAmount && baseText[i] !== " ") { + // Replace character with glitch + result += glitchChars[Math.floor(Math.random() * glitchChars.length)]; + } else { + result += baseText[i]; + } + } + return result; + }; + + // Generate random glitch lines that "infect" surrounding area + const generateInfectionLines = (baseLength) => { + const lines = []; + for (let i = 0; i < spread; i++) { + const lineLength = Math.floor(baseLength * Math.random() * 0.7); + const offset = Math.floor(Math.random() * baseLength * 0.3); + const glitchLine = " ".repeat(offset) + + Array.from({ length: lineLength }, () => + glitchChars[Math.floor(Math.random() * glitchChars.length)] + ).join(""); + lines.push(glitchLine); + } + return lines; + }; + + // Create container for animated glitch + const containerId = `glitch-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`; + this.adapter.printHTML( + `
` + ); + + const container = this.adapter.terminal.output.querySelector(`#${containerId}`); + if (!container) return; + + // Animation loop + const startTime = Date.now(); + let finalLinesAbove = []; + let finalLinesBelow = []; + + const animate = () => { + const elapsed = Date.now() - startTime; + + if (elapsed >= duration) { + // Final state - show original text with minimal glitch, keep infection lines + const finalGlitch = generateGlitch(text, intensity * 0.1); + + let output = ""; + finalLinesAbove.forEach(line => { + output += `
${line}
`; + }); + output += `
${finalGlitch}
`; + finalLinesBelow.forEach(line => { + output += `
${line}
`; + }); + + container.innerHTML = output; + return; + } + + // Current glitch intensity (ramps up then down) + const progress = elapsed / duration; + const currentIntensity = intensity * Math.sin(progress * Math.PI); + + // Generate infected lines above + const linesAbove = generateInfectionLines(text.length); + const linesBelow = generateInfectionLines(text.length); + + // Store for final state + finalLinesAbove = linesAbove; + finalLinesBelow = linesBelow; + + // Generate glitched main text + const glitchedText = generateGlitch(text, currentIntensity); + + // Build output + let output = ""; + linesAbove.forEach(line => { + output += `
${line}
`; + }); + output += `
${glitchedText}
`; + linesBelow.forEach(line => { + output += `
${line}
`; + }); + + container.innerHTML = output; + + // Continue animation + setTimeout(animate, speed); + }; + + // Start animation + animate(); + + // Wait for animation to complete + await this._sleep(duration); + } +} diff --git a/assets/js/games/engine/scene-registry.js b/assets/js/games/engine/scene-registry.js new file mode 100644 index 0000000..87d7e22 --- /dev/null +++ b/assets/js/games/engine/scene-registry.js @@ -0,0 +1,66 @@ +// Scene Registry - Global registry for shared scene factories +// Scene factories are functions that take a context and return scene definitions + +// Initialize global scene factories object +window.SceneFactories = window.SceneFactories || {}; + +// Helper class for working with scene factories +class SceneRegistry { + // Register a scene factory + static register(id, factory) { + if (typeof factory !== "function") { + console.error(`Scene factory must be a function: ${id}`); + return false; + } + window.SceneFactories[id] = factory; + return true; + } + + // Get a scene factory + static get(id) { + return window.SceneFactories[id] || null; + } + + // Check if a factory exists + static has(id) { + return id in window.SceneFactories; + } + + // List all registered factories + static list() { + return Object.keys(window.SceneFactories); + } + + // Unregister a factory + static unregister(id) { + delete window.SceneFactories[id]; + } + + // Create scenes from a factory with context + static createScenes(id, context) { + const factory = this.get(id); + if (!factory) { + console.warn(`Scene factory not found: ${id}`); + return {}; + } + try { + return factory(context); + } catch (e) { + console.error(`Error creating scenes from factory ${id}:`, e); + return {}; + } + } + + // Merge multiple factories into one scene object + static mergeFactories(factoryIds, context) { + const merged = {}; + for (const id of factoryIds) { + const scenes = this.createScenes(id, context); + Object.assign(merged, scenes); + } + return merged; + } +} + +// Make available globally +window.SceneRegistry = SceneRegistry; diff --git a/assets/js/games/engine/shared-state-manager.js b/assets/js/games/engine/shared-state-manager.js new file mode 100644 index 0000000..974dc8e --- /dev/null +++ b/assets/js/games/engine/shared-state-manager.js @@ -0,0 +1,190 @@ +// Shared State Manager - Manages game state across multiple chapters in a series +class SharedStateManager { + constructor(seriesId) { + this.seriesId = seriesId; + this.state = {}; + this.storageKey = `series_${seriesId}_state`; + } + + // Initialize with default state (only sets values not already in storage) + init(defaultState = {}) { + this.state = this._deepClone(defaultState); + this._loadFromStorage(); + } + + // Get value using dot notation path (e.g., "inventory.sword") + get(path, defaultValue = undefined) { + const parts = path.split("."); + let current = this.state; + + for (const part of parts) { + if (current === undefined || current === null) { + return defaultValue; + } + current = current[part]; + } + + return current !== undefined ? current : defaultValue; + } + + // Set value using dot notation path + set(path, value) { + const parts = path.split("."); + let current = this.state; + + for (let i = 0; i < parts.length - 1; i++) { + const part = parts[i]; + if (current[part] === undefined) { + current[part] = {}; + } + current = current[part]; + } + + current[parts[parts.length - 1]] = value; + this._saveToStorage(); + } + + // Increment a numeric value + increment(path, amount = 1) { + const current = this.get(path, 0); + this.set(path, current + amount); + } + + // Decrement a numeric value + decrement(path, amount = 1) { + this.increment(path, -amount); + } + + // Add item to an array (if not already present) + addToArray(path, item) { + const arr = this.get(path, []); + if (!arr.includes(item)) { + arr.push(item); + this.set(path, arr); + } + } + + // Remove item from an array + removeFromArray(path, item) { + const arr = this.get(path, []); + const index = arr.indexOf(item); + if (index > -1) { + arr.splice(index, 1); + this.set(path, arr); + } + } + + // Check if array contains item + hasItem(path, item) { + const arr = this.get(path, []); + return arr.includes(item); + } + + // Check if a specific chapter is complete + isChapterComplete(chapterNumber) { + const completed = this.get("chapters_completed", []); + return completed.includes(chapterNumber); + } + + // Mark a chapter as complete + markChapterComplete(chapterNumber) { + this.addToArray("chapters_completed", chapterNumber); + } + + // Check if chapter can be played (previous chapters complete) + canPlayChapter(chapterNumber) { + if (chapterNumber <= 1) return true; + return this.isChapterComplete(chapterNumber - 1); + } + + // Get the highest completed chapter number + getHighestCompletedChapter() { + const completed = this.get("chapters_completed", []); + return completed.length > 0 ? Math.max(...completed) : 0; + } + + // Get entire state (for debugging) + getAll() { + return this._deepClone(this.state); + } + + // Reset all series state + reset() { + this.state = {}; + try { + localStorage.removeItem(this.storageKey); + } catch (e) { + console.warn("Failed to clear series state from storage:", e); + } + } + + // Check if there is saved state + hasSavedState() { + try { + return localStorage.getItem(this.storageKey) !== null; + } catch (e) { + return false; + } + } + + // Export state for debugging or backup + exportState() { + return JSON.stringify(this.state, null, 2); + } + + // Import state from backup + importState(jsonString) { + try { + const data = JSON.parse(jsonString); + this.state = data; + this._saveToStorage(); + return true; + } catch (e) { + console.error("Failed to import state:", e); + return false; + } + } + + _saveToStorage() { + try { + localStorage.setItem(this.storageKey, JSON.stringify(this.state)); + } catch (e) { + console.warn("Failed to save series state:", e); + } + } + + _loadFromStorage() { + try { + const saved = localStorage.getItem(this.storageKey); + if (saved) { + const parsed = JSON.parse(saved); + this.state = this._mergeDeep(this.state, parsed); + } + } catch (e) { + console.warn("Failed to load series state:", e); + } + } + + _deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + + _mergeDeep(target, source) { + const result = { ...target }; + for (const key of Object.keys(source)) { + if ( + source[key] && + typeof source[key] === "object" && + !Array.isArray(source[key]) + ) { + result[key] = this._mergeDeep(result[key] || {}, source[key]); + } else { + result[key] = source[key]; + } + } + return result; + } +} + +// Make available globally +window.SharedStateManager = SharedStateManager; diff --git a/assets/js/games/engine/sound-manager.js b/assets/js/games/engine/sound-manager.js new file mode 100644 index 0000000..ce4cfa8 --- /dev/null +++ b/assets/js/games/engine/sound-manager.js @@ -0,0 +1,247 @@ +// Sound Manager - Handles audio loading, caching, and playback for games +class SoundManager { + constructor(adapter) { + this.adapter = adapter; + this.sounds = new Map(); // soundId -> { audio, loaded, loading, error } + this.currentlyPlaying = new Set(); // Track currently playing sounds + this.globalVolume = 1.0; + } + + // Preload a sound file + async preload(soundId, url) { + // If already loaded or loading, return existing promise + if (this.sounds.has(soundId)) { + const sound = this.sounds.get(soundId); + if (sound.loaded) { + return sound.audio; + } + if (sound.loading) { + return sound.loadingPromise; + } + if (sound.error) { + throw new Error(`Sound ${soundId} failed to load: ${sound.error}`); + } + } + + // Create new audio element + const audio = new Audio(); + const soundEntry = { + audio, + loaded: false, + loading: true, + error: null, + url, + }; + + // Create promise for loading + const loadingPromise = new Promise((resolve, reject) => { + const onLoad = () => { + soundEntry.loaded = true; + soundEntry.loading = false; + audio.removeEventListener("canplaythrough", onLoad); + audio.removeEventListener("error", onError); + resolve(audio); + }; + + const onError = (e) => { + soundEntry.loading = false; + soundEntry.error = e.message || "Failed to load audio"; + audio.removeEventListener("canplaythrough", onLoad); + audio.removeEventListener("error", onError); + reject(new Error(`Failed to load sound ${soundId}: ${soundEntry.error}`)); + }; + + audio.addEventListener("canplaythrough", onLoad, { once: true }); + audio.addEventListener("error", onError, { once: true }); + audio.preload = "auto"; + audio.src = url; + audio.load(); + }); + + soundEntry.loadingPromise = loadingPromise; + this.sounds.set(soundId, soundEntry); + + return loadingPromise; + } + + // Play a sound (will load if not already loaded) + async play(soundId, options = {}) { + const { + loop = false, + volume = 1.0, + onEnd = null, + fade = false, + fadeDuration = 1000, + } = options; + + let soundEntry = this.sounds.get(soundId); + + if (!soundEntry) { + throw new Error(`Sound ${soundId} not preloaded. Use preload() first.`); + } + + // Wait for loading if still loading + if (soundEntry.loading) { + await soundEntry.loadingPromise; + } + + if (soundEntry.error) { + throw new Error(`Sound ${soundId} failed to load: ${soundEntry.error}`); + } + + const audio = soundEntry.audio; + + // Clone the audio element for concurrent playback + const playInstance = audio.cloneNode(); + playInstance.loop = loop; + playInstance.volume = fade ? 0 : volume * this.globalVolume; + + // Track this instance + const trackingId = `${soundId}_${Date.now()}`; + this.currentlyPlaying.add(trackingId); + + // Handle end event + const cleanup = () => { + this.currentlyPlaying.delete(trackingId); + playInstance.removeEventListener("ended", cleanup); + if (onEnd) onEnd(); + }; + + playInstance.addEventListener("ended", cleanup); + + // Play the sound + try { + await playInstance.play(); + + // Fade in if requested + if (fade) { + this._fadeIn(playInstance, volume * this.globalVolume, fadeDuration); + } + + return { + instance: playInstance, + stop: () => { + playInstance.pause(); + playInstance.currentTime = 0; + cleanup(); + }, + fadeOut: (duration = fadeDuration) => { + return this._fadeOut(playInstance, duration).then(() => { + playInstance.pause(); + cleanup(); + }); + }, + }; + } catch (error) { + cleanup(); + throw new Error(`Failed to play sound ${soundId}: ${error.message}`); + } + } + + // Fade in audio + _fadeIn(audio, targetVolume, duration) { + const steps = 20; + const stepDuration = duration / steps; + const volumeStep = targetVolume / steps; + let currentStep = 0; + + const interval = setInterval(() => { + currentStep++; + audio.volume = Math.min(volumeStep * currentStep, targetVolume); + + if (currentStep >= steps) { + clearInterval(interval); + audio.volume = targetVolume; + } + }, stepDuration); + } + + // Fade out audio + _fadeOut(audio, duration) { + return new Promise((resolve) => { + const steps = 20; + const stepDuration = duration / steps; + const startVolume = audio.volume; + const volumeStep = startVolume / steps; + let currentStep = 0; + + const interval = setInterval(() => { + currentStep++; + audio.volume = Math.max(startVolume - volumeStep * currentStep, 0); + + if (currentStep >= steps) { + clearInterval(interval); + audio.volume = 0; + resolve(); + } + }, stepDuration); + }); + } + + // Stop all currently playing sounds + stopAll() { + for (const soundId of Array.from(this.currentlyPlaying)) { + const [id] = soundId.split("_"); + const soundEntry = this.sounds.get(id); + if (soundEntry && soundEntry.audio) { + soundEntry.audio.pause(); + soundEntry.audio.currentTime = 0; + } + } + this.currentlyPlaying.clear(); + } + + // Set global volume (0.0 to 1.0) + setGlobalVolume(volume) { + this.globalVolume = Math.max(0, Math.min(1, volume)); + } + + // Check if a sound is loaded + isLoaded(soundId) { + const sound = this.sounds.get(soundId); + return sound && sound.loaded; + } + + // Check if a sound is currently loading + isLoading(soundId) { + const sound = this.sounds.get(soundId); + return sound && sound.loading; + } + + // Get loading progress for all sounds + getLoadingStatus() { + const status = { + total: this.sounds.size, + loaded: 0, + loading: 0, + failed: 0, + }; + + for (const [, sound] of this.sounds) { + if (sound.loaded) status.loaded++; + else if (sound.loading) status.loading++; + else if (sound.error) status.failed++; + } + + return status; + } + + // Clear all sounds (useful for cleanup) + clear() { + this.stopAll(); + this.sounds.clear(); + } + + // Remove a specific sound from cache + unload(soundId) { + const sound = this.sounds.get(soundId); + if (sound && sound.audio) { + sound.audio.pause(); + sound.audio.src = ""; + } + this.sounds.delete(soundId); + } +} + +// Make available globally +window.SoundManager = SoundManager; diff --git a/assets/js/games/engine/state-manager.js b/assets/js/games/engine/state-manager.js new file mode 100644 index 0000000..9b9600e --- /dev/null +++ b/assets/js/games/engine/state-manager.js @@ -0,0 +1,248 @@ +// State Manager - Manages game state with persistence and conditions +class StateManager { + constructor(gameId, sharedState = null) { + this.gameId = gameId; + this.sharedState = sharedState; // Optional SharedStateManager for series games + this.state = {}; + this.storageKey = `game_${gameId}_state`; + } + + // Initialize with default state + init(defaultState = {}) { + this.state = this._deepClone(defaultState); + this._loadFromStorage(); + } + + // Get value using dot notation path (e.g., "inventory.sword") + // Checks local state first, then falls back to shared state if available + get(path, defaultValue = undefined) { + // First check local state + const localValue = this._getFromState(this.state, path); + if (localValue !== undefined) { + return localValue; + } + + // Fall back to shared state if available + if (this.sharedState) { + const sharedValue = this.sharedState.get(path); + if (sharedValue !== undefined) { + return sharedValue; + } + } + + return defaultValue; + } + + // Internal helper to get value from a specific state object + _getFromState(stateObj, path) { + const parts = path.split("."); + let current = stateObj; + + for (const part of parts) { + if (current === undefined || current === null) { + return undefined; + } + current = current[part]; + } + + return current; + } + + // Set value using dot notation path + set(path, value) { + const parts = path.split("."); + let current = this.state; + + for (let i = 0; i < parts.length - 1; i++) { + const part = parts[i]; + if (current[part] === undefined) { + current[part] = {}; + } + current = current[part]; + } + + current[parts[parts.length - 1]] = value; + this._saveToStorage(); + } + + // Increment a numeric value + increment(path, amount = 1) { + const current = this.get(path, 0); + this.set(path, current + amount); + } + + // Decrement a numeric value + decrement(path, amount = 1) { + this.increment(path, -amount); + } + + // Add item to an array (if not already present) + addToArray(path, item) { + const arr = this.get(path, []); + if (!arr.includes(item)) { + arr.push(item); + this.set(path, arr); + } + } + + // Remove item from an array + removeFromArray(path, item) { + const arr = this.get(path, []); + const index = arr.indexOf(item); + if (index > -1) { + arr.splice(index, 1); + this.set(path, arr); + } + } + + // Check if array contains item + hasItem(path, item) { + const arr = this.get(path, []); + return arr.includes(item); + } + + // Set value in shared state (for series games) + setShared(path, value) { + if (!this.sharedState) { + console.warn("No shared state manager - setting locally instead"); + return this.set(path, value); + } + this.sharedState.set(path, value); + } + + // Check if path exists in shared state + hasShared(path) { + return this.sharedState?.get(path) !== undefined; + } + + // Get reference to shared state manager + getSharedState() { + return this.sharedState; + } + + // Evaluate a condition against current state + evaluate(condition) { + if (typeof condition === "boolean") { + return condition; + } + + if (typeof condition === "string") { + // Simple path check - truthy value + return !!this.get(condition); + } + + if (typeof condition === "object" && condition !== null) { + return this._evaluateConditionObject(condition); + } + + return true; + } + + _evaluateConditionObject(cond) { + // Logical operators + if (cond.and) { + return cond.and.every((c) => this.evaluate(c)); + } + if (cond.or) { + return cond.or.some((c) => this.evaluate(c)); + } + if (cond.not) { + return !this.evaluate(cond.not); + } + + // Value comparisons + const value = this.get(cond.path); + + if ("equals" in cond) { + return value === cond.equals; + } + if ("notEquals" in cond) { + return value !== cond.notEquals; + } + if ("greaterThan" in cond) { + return value > cond.greaterThan; + } + if ("greaterThanOrEqual" in cond) { + return value >= cond.greaterThanOrEqual; + } + if ("lessThan" in cond) { + return value < cond.lessThan; + } + if ("lessThanOrEqual" in cond) { + return value <= cond.lessThanOrEqual; + } + if ("contains" in cond) { + return Array.isArray(value) && value.includes(cond.contains); + } + if ("notContains" in cond) { + return !Array.isArray(value) || !value.includes(cond.notContains); + } + + // Default: check truthiness of path + return !!value; + } + + // Get entire state (for debugging) + getAll() { + return this._deepClone(this.state); + } + + // Reset state and clear storage + reset() { + this.state = {}; + try { + localStorage.removeItem(this.storageKey); + } catch (e) { + console.warn("Failed to clear game state from storage:", e); + } + } + + // Check if there is saved state + hasSavedState() { + try { + return localStorage.getItem(this.storageKey) !== null; + } catch (e) { + return false; + } + } + + _saveToStorage() { + try { + localStorage.setItem(this.storageKey, JSON.stringify(this.state)); + } catch (e) { + console.warn("Failed to save game state:", e); + } + } + + _loadFromStorage() { + try { + const saved = localStorage.getItem(this.storageKey); + if (saved) { + const parsed = JSON.parse(saved); + this.state = this._mergeDeep(this.state, parsed); + } + } catch (e) { + console.warn("Failed to load game state:", e); + } + } + + _deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + + _mergeDeep(target, source) { + const result = { ...target }; + for (const key of Object.keys(source)) { + if ( + source[key] && + typeof source[key] === "object" && + !Array.isArray(source[key]) + ) { + result[key] = this._mergeDeep(result[key] || {}, source[key]); + } else { + result[key] = source[key]; + } + } + return result; + } +} diff --git a/assets/js/games/engine/table-helper.js b/assets/js/games/engine/table-helper.js new file mode 100644 index 0000000..65f4ab0 --- /dev/null +++ b/assets/js/games/engine/table-helper.js @@ -0,0 +1,241 @@ +// Table Helper - Generates monospace box-drawn tables for terminal games + +const TableHelper = { + // Box drawing characters + chars: { + single: { + topLeft: "┌", + topRight: "┐", + bottomLeft: "└", + bottomRight: "┘", + horizontal: "─", + vertical: "│", + leftT: "├", + rightT: "┤", + topT: "┬", + bottomT: "┴", + cross: "┼", + }, + double: { + topLeft: "╔", + topRight: "╗", + bottomLeft: "╚", + bottomRight: "╝", + horizontal: "═", + vertical: "║", + leftT: "╠", + rightT: "╣", + topT: "╦", + bottomT: "╩", + cross: "╬", + }, + ascii: { + topLeft: "+", + topRight: "+", + bottomLeft: "+", + bottomRight: "+", + horizontal: "-", + vertical: "|", + leftT: "+", + rightT: "+", + topT: "+", + bottomT: "+", + cross: "+", + }, + }, + + /** + * Generate a complete table with headers and rows + * @param {Object} options - Table configuration + * @param {string} [options.title] - Optional title for the table + * @param {string[]} [options.headers] - Column headers + * @param {Array>} options.rows - Table data rows + * @param {number[]} [options.widths] - Column widths (auto-calculated if not provided) + * @param {string[]} [options.align] - Column alignments ('left', 'right', 'center') + * @param {string} [options.style='single'] - Border style ('single', 'double', 'ascii') + * @param {number} [options.padding=1] - Cell padding + * @returns {Array} Array of content blocks + */ + table(options) { + const { + title, + headers, + rows = [], + widths: customWidths, + align = [], + style = "single", + padding = 1, + } = options; + + const c = this.chars[style] || this.chars.single; + const output = []; + + // Calculate column widths + const widths = customWidths || this._calculateWidths(headers, rows, padding); + const totalWidth = widths.reduce((a, b) => a + b, 0) + widths.length + 1; + + // Top border + output.push(c.topLeft + c.horizontal.repeat(totalWidth - 2) + c.topRight); + + // Title (if provided) + if (title) { + output.push(this._centerText(title, totalWidth, c.vertical)); + output.push(c.leftT + c.horizontal.repeat(totalWidth - 2) + c.rightT); + } + + // Headers (if provided) + if (headers) { + output.push(this._formatRow(headers, widths, align, c.vertical, padding)); + output.push(c.leftT + c.horizontal.repeat(totalWidth - 2) + c.rightT); + } + + // Data rows + for (const row of rows) { + const formattedRow = this._formatRow(row, widths, align, c.vertical, padding); + + // Check if any cell has a className + const hasClassName = row.some(cell => cell && typeof cell === "object" && cell.className); + + if (hasClassName) { + // Find the className from the row (use first one found) + const className = row.find(cell => cell && typeof cell === "object" && cell.className)?.className; + output.push({ text: formattedRow, className }); + } else { + output.push(formattedRow); + } + } + + // Bottom border + output.push(c.bottomLeft + c.horizontal.repeat(totalWidth - 2) + c.bottomRight); + + return output; + }, + + /** + * Generate a simple bordered box with text + * @param {string|string[]} content - Content to display + * @param {Object} [options] - Box options + * @param {number} [options.width] - Box width (auto if not set) + * @param {string} [options.style='single'] - Border style + * @param {string} [options.align='left'] - Text alignment + * @returns {string[]} Array of strings + */ + box(content, options = {}) { + const { width: customWidth, style = "single", align = "left" } = options; + const c = this.chars[style] || this.chars.single; + const lines = Array.isArray(content) ? content : [content]; + + const maxLineWidth = Math.max(...lines.map(l => this._textLength(l))); + const width = customWidth || maxLineWidth + 4; + const innerWidth = width - 2; + + const output = []; + output.push(c.topLeft + c.horizontal.repeat(innerWidth) + c.topRight); + + for (const line of lines) { + const text = typeof line === "string" ? line : line.text || ""; + const padded = this._alignText(text, innerWidth - 2, align); + output.push(c.vertical + " " + padded + " " + c.vertical); + } + + output.push(c.bottomLeft + c.horizontal.repeat(innerWidth) + c.bottomRight); + return output; + }, + + /** + * Generate a separator line + * @param {number} width - Line width + * @param {string} [style='single'] - Border style + * @param {string} [type='middle'] - 'top', 'middle', 'bottom' + * @returns {string} + */ + separator(width, style = "single", type = "middle") { + const c = this.chars[style] || this.chars.single; + const inner = c.horizontal.repeat(width - 2); + + switch (type) { + case "top": + return c.topLeft + inner + c.topRight; + case "bottom": + return c.bottomLeft + inner + c.bottomRight; + default: + return c.leftT + inner + c.rightT; + } + }, + + /** + * Pad or truncate text to exact width + * @param {string} text - Input text + * @param {number} width - Target width + * @param {string} [align='left'] - Alignment + * @returns {string} + */ + pad(text, width, align = "left") { + return this._alignText(text, width, align); + }, + + // Internal helpers + + _calculateWidths(headers, rows, padding) { + const allRows = headers ? [headers, ...rows] : rows; + const numCols = Math.max(...allRows.map(r => r.length)); + const widths = new Array(numCols).fill(0); + + for (const row of allRows) { + for (let i = 0; i < row.length; i++) { + const cell = row[i]; + const text = typeof cell === "object" ? (cell.text || "") : String(cell || ""); + widths[i] = Math.max(widths[i], text.length + padding * 2); + } + } + + return widths; + }, + + _formatRow(row, widths, alignments, verticalChar, padding) { + const cells = []; + for (let i = 0; i < widths.length; i++) { + const cell = row[i]; + const text = typeof cell === "object" ? (cell.text || "") : String(cell || ""); + const align = alignments[i] || "left"; + const cellWidth = widths[i] - padding * 2; + const padChar = " ".repeat(padding); + cells.push(padChar + this._alignText(text, cellWidth, align) + padChar); + } + return verticalChar + cells.join(verticalChar) + verticalChar; + }, + + _centerText(text, totalWidth, verticalChar) { + const innerWidth = totalWidth - 2; + const padded = this._alignText(text, innerWidth, "center"); + return verticalChar + padded + verticalChar; + }, + + _alignText(text, width, align) { + const len = text.length; + if (len >= width) { + return text.substring(0, width); + } + + const diff = width - len; + switch (align) { + case "right": + return " ".repeat(diff) + text; + case "center": + const left = Math.floor(diff / 2); + const right = diff - left; + return " ".repeat(left) + text + " ".repeat(right); + default: + return text + " ".repeat(diff); + } + }, + + _textLength(item) { + if (typeof item === "string") return item.length; + if (item && item.text) return item.text.length; + return 0; + }, +}; + +// Make available globally +window.TableHelper = TableHelper; diff --git a/assets/js/games/engine/terminal-adapter.js b/assets/js/games/engine/terminal-adapter.js new file mode 100644 index 0000000..d63877e --- /dev/null +++ b/assets/js/games/engine/terminal-adapter.js @@ -0,0 +1,76 @@ +// Terminal Adapter - Bridges game engine to existing TerminalShell +class TerminalAdapter { + constructor(terminal) { + this.terminal = terminal; + this.inputCallback = null; + } + + // Output methods - delegate to terminal + print(text, className = "") { + this.terminal.print(text, className); + this.scrollToBottom(); + } + + printHTML(html, className = "") { + this.terminal.printHTML(html, className); + this.scrollToBottom(); + } + + printError(text) { + this.terminal.printError(text); + this.scrollToBottom(); + } + + printSuccess(text) { + this.terminal.printSuccess(text); + this.scrollToBottom(); + } + + printInfo(text) { + this.terminal.printInfo(text); + this.scrollToBottom(); + } + + printWarning(text) { + this.terminal.printWarning(text); + this.scrollToBottom(); + } + + clear() { + this.terminal.clear(); + } + + scrollToBottom() { + this.terminal.scrollToBottom(); + } + + // Input capture - allows game to intercept terminal input + captureInput(callback) { + this.inputCallback = callback; + } + + releaseInput() { + this.inputCallback = null; + } + + // Called by game engine when input is received + handleInput(value) { + if (this.inputCallback) { + this.inputCallback(value); + return true; + } + return false; + } + + // Get the input element for focus management + getInputElement() { + return this.terminal.input; + } + + // Focus the input + focusInput() { + if (this.terminal.input) { + this.terminal.input.focus(); + } + } +} diff --git a/assets/js/games/games/ascii-art.js b/assets/js/games/games/ascii-art.js new file mode 100644 index 0000000..17d6b03 --- /dev/null +++ b/assets/js/games/games/ascii-art.js @@ -0,0 +1,128 @@ +const BOXING_DAY_TITLE1 = ` +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;233;48;5;0m▄▄▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;233;48;5;0m▄▄▄▄▄\x1b[38;5;234;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;233;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;235;48;5;0m▄▄▄\x1b[38;5;234;48;5;0m▄▄▄▄▄\x1b[38;5;233;48;5;0m▄▄▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;233;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄▄▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;232;48;5;232m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;38;48;5;233m▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;38;48;5;233m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;31;48;5;0m▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;44;48;5;0m▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;17;48;5;235m▄\x1b[38;5;17;48;5;17m▄▄▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;23;48;5;6m▄\x1b[38;5;23;48;5;80m▄\x1b[38;5;23;48;5;14m▄\x1b[38;5;24;48;5;14m▄\x1b[38;5;24;48;5;44m▄\x1b[38;5;24;48;5;45m▄▄\x1b[38;5;24;48;5;14m▄\x1b[38;5;31;48;5;17m▄\x1b[38;5;86;48;5;23m▄\x1b[38;5;37;48;5;17m▄\x1b[38;5;44;48;5;17m▄\x1b[38;5;87;48;5;72m▄\x1b[38;5;86;48;5;78m▄\x1b[38;5;80;48;5;23m▄\x1b[38;5;81;48;5;17m▄▄\x1b[38;5;14;48;5;17m▄▄\x1b[38;5;45;48;5;17m▄▄\x1b[38;5;44;48;5;17m▄▄▄\x1b[38;5;38;48;5;17m▄\x1b[38;5;31;48;5;38m▄\x1b[38;5;31;48;5;17m▄\x1b[38;5;24;48;5;17m▄▄▄\x1b[38;5;23;48;5;31m▄\x1b[38;5;80;48;5;23m▄\x1b[38;5;45;48;5;17m▄\x1b[38;5;23;48;5;24m▄\x1b[38;5;23;48;5;17m▄▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;236m▄\x1b[38;5;17;48;5;235m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;17;48;5;0m▄▄▄▄▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;72;48;5;232m▄\x1b[38;5;17;48;5;232m▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[m +\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;31;48;5;17m▄\x1b[38;5;17;48;5;74m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;23;48;5;31m▄\x1b[38;5;87;48;5;14m▄\x1b[38;5;17;48;5;45m▄\x1b[38;5;233;48;5;14m▄▄▄\x1b[38;5;232;48;5;14m▄\x1b[38;5;232;48;5;44m▄\x1b[38;5;232;48;5;14m▄\x1b[38;5;232;48;5;81m▄\x1b[38;5;232;48;5;6m▄\x1b[38;5;232;48;5;23m▄▄\x1b[38;5;233;48;5;23m▄▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;234;48;5;17m▄\x1b[38;5;233;48;5;17m▄▄▄▄▄▄▄▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;17m▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;233;48;5;17m▄▄▄▄\x1b[38;5;233;48;5;234m▄▄▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;234;48;5;17m▄▄▄▄\x1b[38;5;233;48;5;17m▄▄▄▄▄▄\x1b[38;5;233;48;5;23m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;232;48;5;23m▄▄\x1b[38;5;232;48;5;24m▄\x1b[38;5;232;48;5;37m▄\x1b[38;5;232;48;5;87m▄\x1b[38;5;232;48;5;14m▄▄▄\x1b[38;5;233;48;5;14m▄▄\x1b[38;5;234;48;5;14m▄\x1b[38;5;14;48;5;14m▄\x1b[38;5;32;48;5;17m▄\x1b[38;5;38;48;5;17m▄▄\x1b[38;5;32;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;233;48;5;232m▄▄\x1b[38;5;0;48;5;0m▄▄\x1b[m +\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;44;48;5;86m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;23;48;5;38m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;158;48;5;233m▄\x1b[38;5;158;48;5;236m▄▄\x1b[38;5;194;48;5;236m▄\x1b[38;5;195;48;5;236m▄\x1b[38;5;22;48;5;235m▄\x1b[38;5;72;48;5;236m▄\x1b[38;5;195;48;5;236m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;194;48;5;22m▄\x1b[38;5;23;48;5;235m▄\x1b[38;5;194;48;5;236m▄\x1b[38;5;195;48;5;29m▄\x1b[38;5;195;48;5;65m▄\x1b[38;5;194;48;5;72m▄▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;72;48;5;22m▄\x1b[38;5;71;48;5;23m▄\x1b[38;5;78;48;5;23m▄\x1b[38;5;72;48;5;23m▄\x1b[38;5;115;48;5;23m▄\x1b[38;5;158;48;5;23m▄▄\x1b[38;5;195;48;5;23m▄▄▄▄\x1b[38;5;194;48;5;23m▄\x1b[38;5;29;48;5;236m▄\x1b[38;5;194;48;5;23m▄\x1b[38;5;194;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;158;48;5;234m▄\x1b[38;5;194;48;5;236m▄\x1b[38;5;22;48;5;234m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;30;48;5;87m▄\x1b[38;5;17;48;5;17m▄▄▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;0;48;5;0m▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;0m \x1b[38;5;17;48;5;17m▄\x1b[38;5;23;48;5;80m▄\x1b[38;5;31;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;17;48;5;23m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;194;48;5;194m▄\x1b[38;5;194;48;5;158m▄\x1b[38;5;194;48;5;237m▄\x1b[38;5;194;48;5;236m▄▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;236;48;5;115m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;195;48;5;194m▄\x1b[38;5;195;48;5;237m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;23;48;5;195m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;158;48;5;195m▄\x1b[38;5;195;48;5;23m▄▄\x1b[38;5;195;48;5;237m▄▄\x1b[38;5;72;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;115;48;5;78m▄\x1b[38;5;78;48;5;78m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;65;48;5;152m▄\x1b[38;5;78;48;5;255m▄\x1b[38;5;71;48;5;237m▄\x1b[38;5;71;48;5;236m▄\x1b[38;5;35;48;5;236m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;235;48;5;23m▄\x1b[38;5;71;48;5;194m▄\x1b[38;5;115;48;5;194m▄\x1b[38;5;78;48;5;29m▄\x1b[38;5;78;48;5;195m▄\x1b[38;5;78;48;5;194m▄\x1b[38;5;22;48;5;23m▄\x1b[48;5;233m \x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;23;48;5;25m▄\x1b[38;5;17;48;5;17m▄▄▄▄\x1b[48;5;0m \x1b[38;5;233;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[m +\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;23m▄\x1b[38;5;38;48;5;74m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;24;48;5;23m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;65;48;5;235m▄\x1b[38;5;115;48;5;23m▄\x1b[38;5;158;48;5;23m▄▄\x1b[38;5;194;48;5;158m▄\x1b[38;5;195;48;5;194m▄\x1b[38;5;234;48;5;235m▄▄\x1b[38;5;72;48;5;71m▄\x1b[38;5;255;48;5;195m▄\x1b[38;5;236;48;5;23m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;195;48;5;236m▄\x1b[38;5;195;48;5;23m▄\x1b[38;5;195;48;5;237m▄\x1b[38;5;195;48;5;23m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;115;48;5;115m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;195;48;5;115m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;65;48;5;29m▄\x1b[38;5;255;48;5;78m▄\x1b[38;5;195;48;5;237m▄\x1b[38;5;195;48;5;236m▄\x1b[38;5;194;48;5;236m▄\x1b[38;5;194;48;5;235m▄\x1b[38;5;23;48;5;237m▄\x1b[38;5;194;48;5;71m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;234;48;5;195m▄\x1b[38;5;235;48;5;23m▄\x1b[38;5;158;48;5;72m▄\x1b[38;5;115;48;5;23m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;23;48;5;23m▄▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;32;48;5;38m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;80;48;5;31m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;234;48;5;232m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;158m▄\x1b[38;5;235;48;5;194m▄▄\x1b[38;5;236;48;5;195m▄▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;233;48;5;233m▄▄\x1b[38;5;235;48;5;72m▄\x1b[38;5;236;48;5;255m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;23;48;5;195m▄▄▄\x1b[38;5;237;48;5;195m▄\x1b[38;5;23;48;5;195m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;237;48;5;234m▄▄\x1b[38;5;236;48;5;195m▄\x1b[38;5;235;48;5;195m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;23;48;5;255m▄▄\x1b[38;5;237;48;5;195m▄\x1b[38;5;236;48;5;195m▄▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;235;48;5;195m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;235;48;5;194m▄\x1b[38;5;235;48;5;158m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;233;48;5;232m▄▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;44;48;5;24m▄\x1b[38;5;23;48;5;23m▄▄▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;233;48;5;233m▄▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;24;48;5;31m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;87;48;5;87m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;158;48;5;235m▄\x1b[38;5;29;48;5;158m▄\x1b[38;5;23;48;5;194m▄▄\x1b[38;5;23;48;5;158m▄\x1b[38;5;237;48;5;235m▄\x1b[38;5;195;48;5;194m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;158;48;5;195m▄\x1b[38;5;255;48;5;195m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;194;48;5;158m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;237;48;5;23m▄\x1b[38;5;23;48;5;195m▄▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;23;48;5;195m▄▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;115;48;5;195m▄\x1b[38;5;23;48;5;195m▄▄\x1b[38;5;15;48;5;72m▄\x1b[38;5;195;48;5;236m▄\x1b[38;5;115;48;5;29m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;23;48;5;195m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;15;48;5;115m▄\x1b[38;5;23;48;5;237m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;195;48;5;194m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;194;48;5;23m▄\x1b[38;5;65;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;195;48;5;158m▄\x1b[38;5;23;48;5;22m▄\x1b[38;5;236;48;5;233m▄\x1b[38;5;158;48;5;233m▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;87;48;5;81m▄\x1b[38;5;23;48;5;23m▄▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;233;48;5;233m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;44;48;5;17m▄\x1b[38;5;17;48;5;50m▄\x1b[38;5;24;48;5;31m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;24;48;5;38m▄\x1b[38;5;14;48;5;87m▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;22;48;5;158m▄\x1b[38;5;158;48;5;115m▄\x1b[38;5;194;48;5;115m▄\x1b[38;5;194;48;5;122m▄\x1b[38;5;195;48;5;122m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;158;48;5;72m▄▄\x1b[38;5;121;48;5;78m▄\x1b[38;5;115;48;5;115m▄\x1b[38;5;78;48;5;79m▄\x1b[38;5;115;48;5;72m▄\x1b[38;5;194;48;5;195m▄▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;195;48;5;194m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;15;48;5;255m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;15;48;5;255m▄\x1b[38;5;115;48;5;115m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;15;48;5;255m▄\x1b[38;5;72;48;5;79m▄\x1b[38;5;15;48;5;255m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;195;48;5;255m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;195;48;5;195m▄▄\x1b[38;5;195;48;5;23m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;29;48;5;23m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;23;48;5;195m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;195;48;5;23m▄\x1b[38;5;194;48;5;194m▄\x1b[38;5;72;48;5;29m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;235;48;5;158m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;14;48;5;14m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;17;48;5;23m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[48;5;233m \x1b[38;5;233;48;5;232m▄\x1b[38;5;31;48;5;17m▄\x1b[38;5;38;48;5;24m▄\x1b[38;5;17;48;5;75m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;87;48;5;14m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;158;48;5;236m▄▄▄\x1b[38;5;158;48;5;23m▄\x1b[38;5;158;48;5;194m▄\x1b[38;5;236;48;5;23m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;72;48;5;115m▄\x1b[38;5;23;48;5;195m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;195;48;5;23m▄▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;23;48;5;195m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;237;48;5;23m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;15;48;5;115m▄\x1b[38;5;15;48;5;23m▄\x1b[38;5;15;48;5;29m▄\x1b[38;5;29;48;5;195m▄\x1b[38;5;237;48;5;195m▄\x1b[38;5;23;48;5;72m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;15;48;5;23m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;194;48;5;195m▄\x1b[38;5;236;48;5;23m▄\x1b[38;5;195;48;5;195m▄▄\x1b[38;5;23;48;5;195m▄\x1b[38;5;236;48;5;23m▄\x1b[38;5;195;48;5;195m▄▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;195;48;5;195m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;235;48;5;195m▄\x1b[38;5;158;48;5;195m▄\x1b[38;5;72;48;5;72m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;158;48;5;158m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;87;48;5;87m▄\x1b[38;5;23;48;5;23m▄▄▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;232;48;5;232m▄▄\x1b[38;5;17;48;5;74m▄\x1b[38;5;17;48;5;17m▄▄▄▄\x1b[38;5;14;48;5;14m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;232;48;5;235m▄▄▄\x1b[38;5;232;48;5;236m▄\x1b[38;5;232;48;5;235m▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;232;48;5;235m▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;232;48;5;233m▄▄\x1b[38;5;232;48;5;235m▄▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;233;48;5;236m▄▄▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;194;48;5;236m▄\x1b[38;5;158;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;72;48;5;237m▄\x1b[38;5;72;48;5;236m▄\x1b[38;5;115;48;5;236m▄\x1b[38;5;194;48;5;236m▄\x1b[38;5;66;48;5;237m▄\x1b[38;5;237;48;5;23m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;158;48;5;23m▄\x1b[38;5;78;48;5;23m▄\x1b[38;5;72;48;5;237m▄\x1b[38;5;78;48;5;236m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;23;48;5;237m▄\x1b[38;5;115;48;5;23m▄\x1b[38;5;158;48;5;23m▄\x1b[38;5;158;48;5;237m▄\x1b[38;5;78;48;5;236m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;233;48;5;236m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;232;48;5;235m▄▄▄▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;232;48;5;235m▄\x1b[38;5;232;48;5;234m▄▄▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;14;48;5;87m▄\x1b[38;5;17;48;5;23m▄\x1b[38;5;17;48;5;17m▄▄▄▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;234;48;5;233m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;23;48;5;17m▄▄▄▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;14;48;5;14m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;0;48;5;232m▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;234;48;5;72m▄\x1b[38;5;29;48;5;78m▄\x1b[38;5;115;48;5;158m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;151;48;5;157m▄\x1b[38;5;152;48;5;23m▄\x1b[38;5;115;48;5;23m▄\x1b[38;5;79;48;5;23m▄\x1b[38;5;115;48;5;158m▄\x1b[38;5;23;48;5;237m▄\x1b[38;5;195;48;5;158m▄\x1b[38;5;158;48;5;23m▄\x1b[38;5;115;48;5;23m▄\x1b[38;5;78;48;5;23m▄\x1b[38;5;115;48;5;122m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;79;48;5;115m▄\x1b[38;5;78;48;5;23m▄▄\x1b[38;5;79;48;5;23m▄\x1b[38;5;115;48;5;115m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;232m▄▄▄▄▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;14;48;5;87m▄\x1b[38;5;17;48;5;17m▄\x1b[48;5;17m \x1b[38;5;17;48;5;17m▄▄\x1b[38;5;31;48;5;17m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;24;48;5;23m▄▄\x1b[38;5;31;48;5;23m▄\x1b[38;5;37;48;5;24m▄\x1b[38;5;44;48;5;24m▄\x1b[38;5;14;48;5;87m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;115;48;5;234m▄\x1b[38;5;71;48;5;23m▄\x1b[38;5;72;48;5;72m▄\x1b[38;5;35;48;5;235m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;78;48;5;23m▄\x1b[38;5;195;48;5;23m▄▄\x1b[38;5;78;48;5;23m▄\x1b[38;5;79;48;5;78m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;236;48;5;23m▄\x1b[38;5;158;48;5;23m▄\x1b[38;5;115;48;5;23m▄\x1b[38;5;72;48;5;23m▄\x1b[38;5;78;48;5;72m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;72;48;5;23m▄▄\x1b[38;5;78;48;5;23m▄\x1b[38;5;158;48;5;158m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;14;48;5;14m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;75;48;5;17m▄\x1b[38;5;4;48;5;74m▄\x1b[38;5;17;48;5;25m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;233;48;5;232m▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;37;48;5;6m▄\x1b[38;5;44;48;5;38m▄\x1b[38;5;14;48;5;81m▄\x1b[38;5;14;48;5;14m▄▄\x1b[38;5;14;48;5;44m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;232m▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;233;48;5;121m▄\x1b[38;5;233;48;5;72m▄\x1b[38;5;233;48;5;35m▄▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;233;48;5;115m▄\x1b[38;5;233;48;5;195m▄▄\x1b[38;5;234;48;5;78m▄\x1b[38;5;233;48;5;237m▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;158m▄\x1b[38;5;234;48;5;79m▄\x1b[38;5;233;48;5;29m▄▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;232;48;5;235m▄\x1b[38;5;233;48;5;71m▄\x1b[38;5;233;48;5;29m▄\x1b[38;5;233;48;5;35m▄\x1b[38;5;232;48;5;72m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;0;48;5;232m▄▄▄▄▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;87;48;5;87m▄\x1b[38;5;74;48;5;75m▄\x1b[38;5;74;48;5;31m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;50;48;5;17m▄\x1b[38;5;17;48;5;50m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;233;48;5;233m▄\x1b[48;5;0m \x1b[m +\x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;65;48;5;79m▄\x1b[38;5;85;48;5;85m▄\x1b[38;5;79;48;5;85m▄\x1b[38;5;85;48;5;79m▄▄\x1b[38;5;87;48;5;14m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;23;48;5;232m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;232;48;5;232m▄▄▄▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;31;48;5;234m▄\x1b[38;5;87;48;5;23m▄▄\x1b[38;5;6;48;5;234m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;232;48;5;232m▄▄\x1b[38;5;0;48;5;232m▄▄▄▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;87;48;5;14m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;38;48;5;38m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;233m▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;232m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;84;48;5;78m▄▄\x1b[38;5;85;48;5;85m▄\x1b[38;5;72;48;5;79m▄\x1b[38;5;37;48;5;80m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;80;48;5;17m▄\x1b[38;5;24;48;5;87m▄\x1b[38;5;17;48;5;87m▄\x1b[38;5;87;48;5;87m▄▄\x1b[38;5;17;48;5;87m▄\x1b[38;5;24;48;5;87m▄\x1b[38;5;81;48;5;17m▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;31;48;5;81m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;74;48;5;38m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[48;5;0m \x1b[m +\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;23;48;5;79m▄\x1b[38;5;17;48;5;84m▄\x1b[38;5;17;48;5;85m▄\x1b[38;5;17;48;5;66m▄\x1b[38;5;24;48;5;23m▄\x1b[38;5;17;48;5;234m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;232;48;5;80m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;158;48;5;23m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;87;48;5;87m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;87m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;87;48;5;87m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;24;48;5;31m▄\x1b[38;5;31;48;5;23m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[m +\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;233m▄\x1b[48;5;0m \x1b[38;5;17;48;5;17m▄▄▄▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;232;48;5;236m▄\x1b[38;5;232;48;5;158m▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;233;48;5;23m▄\x1b[38;5;23;48;5;87m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;87;48;5;23m▄▄\x1b[38;5;23;48;5;24m▄\x1b[38;5;23;48;5;87m▄\x1b[38;5;233;48;5;23m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;75;48;5;4m▄\x1b[38;5;39;48;5;44m▄\x1b[38;5;32;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;0;48;5;0m▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[48;5;0m \x1b[38;5;38;48;5;17m▄\x1b[38;5;17;48;5;17m▄▄▄▄\x1b[38;5;44;48;5;23m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;232;48;5;0m▄▄▄▄▄▄▄▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄▄▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;0m▄▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;232;48;5;17m▄▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄▄▄▄▄▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;233;48;5;232m▄▄\x1b[38;5;44;48;5;23m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;17;48;5;17m▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;31;48;5;39m▄\x1b[38;5;17;48;5;17m▄▄▄▄\x1b[38;5;17;48;5;14m▄▄\x1b[38;5;23;48;5;14m▄\x1b[38;5;25;48;5;44m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;4;48;5;23m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;24;48;5;17m▄▄▄\x1b[38;5;24;48;5;234m▄\x1b[38;5;38;48;5;234m▄\x1b[38;5;87;48;5;234m▄▄\x1b[38;5;14;48;5;234m▄\x1b[38;5;14;48;5;233m▄▄\x1b[38;5;87;48;5;233m▄\x1b[38;5;14;48;5;233m▄\x1b[38;5;14;48;5;234m▄\x1b[38;5;14;48;5;233m▄\x1b[38;5;45;48;5;233m▄\x1b[38;5;14;48;5;233m▄\x1b[38;5;87;48;5;233m▄▄▄▄▄▄\x1b[38;5;87;48;5;234m▄\x1b[38;5;87;48;5;17m▄\x1b[38;5;87;48;5;233m▄▄▄▄▄▄▄\x1b[38;5;14;48;5;233m▄▄\x1b[38;5;14;48;5;234m▄▄\x1b[38;5;87;48;5;234m▄\x1b[38;5;14;48;5;233m▄▄\x1b[38;5;14;48;5;234m▄\x1b[38;5;87;48;5;234m▄▄▄\x1b[38;5;37;48;5;234m▄\x1b[38;5;6;48;5;17m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;23;48;5;17m▄▄\x1b[38;5;23;48;5;23m▄▄\x1b[38;5;17;48;5;23m▄\x1b[38;5;23;48;5;37m▄\x1b[38;5;17;48;5;45m▄\x1b[38;5;17;48;5;14m▄▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;236;48;5;17m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;79;48;5;17m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;232;48;5;232m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;37m▄\x1b[38;5;232;48;5;31m▄\x1b[38;5;17;48;5;17m▄▄▄▄\x1b[38;5;45;48;5;38m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;38;48;5;32m▄\x1b[38;5;45;48;5;24m▄\x1b[38;5;38;48;5;38m▄\x1b[38;5;23;48;5;45m▄▄▄▄\x1b[38;5;23;48;5;31m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;31;48;5;23m▄\x1b[38;5;81;48;5;23m▄\x1b[38;5;14;48;5;17m▄\x1b[38;5;45;48;5;17m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;80;48;5;17m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;17;48;5;38m▄\x1b[38;5;38;48;5;17m▄\x1b[38;5;17;48;5;17m▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;17;48;5;23m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;121;48;5;121m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;79;48;5;72m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;23m▄\x1b[38;5;23;48;5;79m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;235;48;5;23m▄\x1b[38;5;29;48;5;85m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;78;48;5;78m▄\x1b[38;5;17;48;5;85m▄\x1b[38;5;17;48;5;79m▄\x1b[38;5;236;48;5;85m▄\x1b[38;5;23;48;5;78m▄\x1b[38;5;79;48;5;23m▄\x1b[38;5;78;48;5;236m▄\x1b[38;5;84;48;5;17m▄\x1b[38;5;72;48;5;17m▄\x1b[38;5;237;48;5;17m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;234;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;233m▄▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;232m▄▄▄\x1b[38;5;0;48;5;233m▄▄\x1b[38;5;0;48;5;232m▄▄▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;234;48;5;0m▄▄▄▄\x1b[38;5;235;48;5;0m▄▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;235;48;5;233m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;235;48;5;44m▄\x1b[38;5;235;48;5;17m▄▄\x1b[38;5;234;48;5;17m▄▄\x1b[38;5;235;48;5;14m▄\x1b[38;5;233;48;5;17m▄▄▄\x1b[38;5;234;48;5;32m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;232;48;5;17m▄▄▄▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;232;48;5;17m▄▄▄▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;234;48;5;17m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;235;48;5;84m▄\x1b[38;5;234;48;5;17m▄\x1b[38;5;235;48;5;79m▄\x1b[38;5;234;48;5;17m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;235;48;5;72m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;235;48;5;232m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;234;48;5;0m▄▄▄▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;234m▄▄▄▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[m +`; + +const BOXING_DAY_TITLE = ` +\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;235m \x1b[38;5;60;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;239;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;235;48;5;235m▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;110;48;5;234m▄▄\x1b[38;5;74;48;5;234m▄▄▄▄\x1b[38;5;74;48;5;235m▄▄▄\x1b[38;5;73;48;5;234m▄\x1b[38;5;67;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;253;48;5;234m▄▄▄\x1b[38;5;188;48;5;234m▄▄▄\x1b[38;5;252;48;5;234m▄▄\x1b[38;5;188;48;5;234m▄▄\x1b[38;5;252;48;5;234m▄▄▄\x1b[38;5;8;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄\x1b[38;5;234;48;5;235m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;239;48;5;234m▄\x1b[38;5;60;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;239;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;239;48;5;234m▄\x1b[m +\x1b[48;5;234m \x1b[38;5;235;48;5;60m▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;238m▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;239;48;5;60m▄\x1b[38;5;238;48;5;60m▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[38;5;74;48;5;234m▄▄\x1b[38;5;103;48;5;238m▄\x1b[38;5;234;48;5;74m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;234;48;5;74m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;252;48;5;234m▄\x1b[38;5;151;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;109;48;5;151m▄▄\x1b[38;5;115;48;5;151m▄▄\x1b[38;5;109;48;5;151m▄\x1b[38;5;110;48;5;151m▄\x1b[38;5;109;48;5;151m▄\x1b[38;5;103;48;5;110m▄▄▄▄\x1b[38;5;104;48;5;110m▄\x1b[38;5;103;48;5;116m▄\x1b[38;5;110;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;97m \x1b[38;5;97;48;5;97m▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;103;48;5;235m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;61m▄\x1b[m +\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;103m▄\x1b[38;5;237;48;5;103m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;61m▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;235m▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;151;48;5;59m▄\x1b[38;5;151;48;5;247m▄\x1b[38;5;151;48;5;248m▄\x1b[38;5;151;48;5;247m▄▄▄\x1b[38;5;151;48;5;248m▄\x1b[38;5;151;48;5;247m▄\x1b[38;5;151;48;5;246m▄\x1b[38;5;151;48;5;247m▄▄\x1b[38;5;151;48;5;246m▄▄\x1b[38;5;151;48;5;245m▄\x1b[38;5;151;48;5;246m▄▄▄\x1b[38;5;151;48;5;247m▄▄▄▄▄▄\x1b[38;5;151;48;5;249m▄\x1b[38;5;151;48;5;152m▄\x1b[38;5;151;48;5;145m▄\x1b[38;5;151;48;5;247m▄\x1b[38;5;151;48;5;246m▄\x1b[38;5;151;48;5;247m▄▄▄▄▄\x1b[38;5;151;48;5;248m▄\x1b[38;5;151;48;5;144m▄\x1b[38;5;151;48;5;248m▄\x1b[38;5;151;48;5;145m▄▄▄▄\x1b[38;5;151;48;5;249m▄\x1b[38;5;151;48;5;145m▄▄\x1b[38;5;151;48;5;252m▄\x1b[38;5;151;48;5;251m▄\x1b[38;5;151;48;5;7m▄\x1b[38;5;151;48;5;250m▄▄\x1b[38;5;151;48;5;187m▄▄\x1b[38;5;151;48;5;251m▄\x1b[38;5;151;48;5;152m▄\x1b[38;5;7;48;5;152m▄\x1b[38;5;251;48;5;152m▄▄▄\x1b[38;5;252;48;5;152m▄▄▄▄\x1b[38;5;188;48;5;152m▄▄\x1b[38;5;188;48;5;252m▄\x1b[38;5;152;48;5;252m▄▄\x1b[38;5;252;48;5;251m▄\x1b[38;5;252;48;5;7m▄\x1b[38;5;74;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;61m▄▄\x1b[38;5;234;48;5;60m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;61;48;5;104m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;97;48;5;60m▄\x1b[38;5;235;48;5;60m▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;238;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[m +\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;235m▄\x1b[48;5;235m \x1b[38;5;60;48;5;60m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;247;48;5;108m▄\x1b[38;5;150;48;5;108m▄▄▄▄▄\x1b[38;5;151;48;5;108m▄\x1b[38;5;150;48;5;108m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;239m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;253;48;5;187m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄▄▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;115;48;5;151m▄\x1b[38;5;116;48;5;151m▄▄\x1b[38;5;110;48;5;151m▄▄\x1b[38;5;110;48;5;251m▄▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;239m▄\x1b[38;5;234;48;5;60m▄▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;103;48;5;110m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;238;48;5;238m▄\x1b[38;5;61;48;5;60m▄\x1b[38;5;236;48;5;97m▄\x1b[38;5;237;48;5;235m▄\x1b[38;5;238;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[m +\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;97;48;5;238m▄\x1b[38;5;60;48;5;237m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;60;48;5;235m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;97;48;5;238m▄\x1b[38;5;97;48;5;237m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;194;48;5;194m▄\x1b[38;5;151;48;5;151m▄▄▄\x1b[38;5;151;48;5;103m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;115;48;5;151m▄\x1b[38;5;109;48;5;151m▄▄▄▄▄▄▄▄\x1b[38;5;110;48;5;115m▄\x1b[38;5;74;48;5;115m▄▄\x1b[38;5;110;48;5;115m▄▄\x1b[38;5;74;48;5;110m▄\x1b[38;5;110;48;5;110m▄▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄▄▄▄▄\x1b[38;5;73;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄\x1b[38;5;67;48;5;234m▄\x1b[38;5;236;48;5;103m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;61;48;5;237m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;60;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;239;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[m +\x1b[38;5;238;48;5;60m▄▄\x1b[38;5;237;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;235m▄▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;60;48;5;235m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;235m▄▄\x1b[38;5;60;48;5;236m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;194;48;5;194m▄\x1b[38;5;151;48;5;151m▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;103;48;5;103m▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;104;48;5;103m▄\x1b[38;5;110;48;5;103m▄▄▄▄\x1b[38;5;74;48;5;103m▄\x1b[38;5;234;48;5;103m▄▄\x1b[38;5;235;48;5;103m▄▄▄▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;235;48;5;103m▄\x1b[38;5;234;48;5;103m▄▄▄▄▄\x1b[38;5;235;48;5;103m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;235;48;5;103m▄▄\x1b[38;5;234;48;5;103m▄▄▄\x1b[38;5;235;48;5;97m▄\x1b[38;5;110;48;5;97m▄\x1b[38;5;73;48;5;235m▄▄\x1b[38;5;104;48;5;235m▄▄▄\x1b[38;5;103;48;5;235m▄\x1b[38;5;97;48;5;235m▄▄\x1b[38;5;237;48;5;235m▄▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;236;48;5;234m▄▄▄▄\x1b[38;5;236;48;5;235m▄▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;103;48;5;60m▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[38;5;97;48;5;110m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;110;48;5;103m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;110;48;5;234m▄\x1b[38;5;74;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[m +\x1b[38;5;61;48;5;238m▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;238m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;234;48;5;96m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;248;48;5;234m▄\x1b[38;5;151;48;5;235m▄\x1b[38;5;187;48;5;193m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;103;48;5;103m▄▄\x1b[38;5;103;48;5;237m▄\x1b[38;5;61;48;5;103m▄\x1b[38;5;110;48;5;103m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;234;48;5;110m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;170;48;5;234m▄\x1b[38;5;206;48;5;234m▄\x1b[38;5;170;48;5;234m▄\x1b[38;5;212;48;5;234m▄\x1b[38;5;206;48;5;234m▄\x1b[38;5;176;48;5;234m▄\x1b[38;5;170;48;5;235m▄\x1b[38;5;212;48;5;235m▄\x1b[38;5;212;48;5;234m▄\x1b[38;5;170;48;5;235m▄▄\x1b[38;5;206;48;5;235m▄\x1b[38;5;176;48;5;234m▄\x1b[38;5;170;48;5;234m▄▄▄\x1b[38;5;206;48;5;234m▄\x1b[38;5;170;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;110m▄▄▄\x1b[38;5;234;48;5;104m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;73;48;5;103m▄\x1b[38;5;74;48;5;103m▄\x1b[38;5;103;48;5;103m▄▄▄\x1b[38;5;253;48;5;251m▄\x1b[38;5;110;48;5;110m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄\x1b[38;5;235;48;5;97m▄\x1b[38;5;103;48;5;110m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;61;48;5;60m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;74m▄\x1b[38;5;104;48;5;74m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[m +\x1b[38;5;234;48;5;236m▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄▄▄\x1b[38;5;238;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;151;48;5;235m▄\x1b[38;5;151;48;5;151m▄▄▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄\x1b[38;5;103;48;5;103m▄▄\x1b[38;5;110;48;5;103m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;236;48;5;65m▄\x1b[38;5;237;48;5;66m▄\x1b[38;5;241;48;5;66m▄\x1b[38;5;241;48;5;236m▄\x1b[38;5;242;48;5;235m▄\x1b[38;5;242;48;5;236m▄\x1b[38;5;96;48;5;236m▄\x1b[38;5;96;48;5;237m▄\x1b[38;5;96;48;5;236m▄▄\x1b[38;5;96;48;5;235m▄\x1b[38;5;132;48;5;235m▄\x1b[38;5;132;48;5;234m▄\x1b[38;5;132;48;5;235m▄\x1b[38;5;132;48;5;234m▄▄▄\x1b[38;5;133;48;5;234m▄\x1b[38;5;169;48;5;235m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;169;48;5;235m▄\x1b[38;5;237;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;253;48;5;103m▄\x1b[38;5;253;48;5;253m▄▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;97;48;5;235m▄\x1b[38;5;103;48;5;110m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;103;48;5;234m▄\x1b[38;5;237;48;5;60m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;235;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;61;48;5;74m▄\x1b[38;5;67;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;239;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[m +\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄\x1b[38;5;103;48;5;103m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;238;48;5;72m▄\x1b[38;5;60;48;5;114m▄\x1b[38;5;60;48;5;110m▄\x1b[38;5;239;48;5;110m▄\x1b[38;5;235;48;5;170m▄▄▄▄▄▄▄▄▄▄\x1b[38;5;235;48;5;206m▄\x1b[38;5;235;48;5;170m▄\x1b[38;5;235;48;5;169m▄\x1b[38;5;235;48;5;235m▄▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄▄\x1b[38;5;235;48;5;235m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;67;48;5;110m▄\x1b[48;5;253m \x1b[48;5;110m \x1b[38;5;110;48;5;110m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;60;48;5;239m▄\x1b[38;5;97;48;5;103m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;68;48;5;68m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[m +\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;61m▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;61m▄▄▄\x1b[38;5;234;48;5;60m▄▄\x1b[38;5;234;48;5;97m▄▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;235;48;5;61m▄\x1b[38;5;235;48;5;97m▄\x1b[48;5;235m \x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;71;48;5;238m▄\x1b[38;5;110;48;5;240m▄\x1b[38;5;110;48;5;60m▄▄\x1b[38;5;133;48;5;97m▄\x1b[38;5;169;48;5;133m▄\x1b[38;5;170;48;5;133m▄\x1b[38;5;133;48;5;133m▄▄▄▄▄▄▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;235m▄▄\x1b[38;5;235;48;5;235m▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;73;48;5;73m▄\x1b[38;5;253;48;5;253m▄▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;60m▄▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;97;48;5;103m▄\x1b[38;5;74;48;5;74m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;104;48;5;68m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;60;48;5;233m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[m +\x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;61;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;237m▄\x1b[48;5;235m \x1b[38;5;187;48;5;187m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;71;48;5;234m▄\x1b[38;5;72;48;5;234m▄\x1b[38;5;74;48;5;235m▄▄\x1b[38;5;176;48;5;235m▄▄\x1b[38;5;151;48;5;250m▄▄\x1b[38;5;151;48;5;249m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;249m▄\x1b[38;5;65;48;5;242m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[38;5;150;48;5;151m▄\x1b[48;5;235m \x1b[38;5;151;48;5;151m▄▄▄▄▄▄\x1b[38;5;240;48;5;59m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;235m \x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;152;48;5;152m▄\x1b[48;5;253m \x1b[48;5;110m \x1b[38;5;110;48;5;110m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;60m▄\x1b[38;5;97;48;5;60m▄▄\x1b[38;5;97;48;5;103m▄\x1b[38;5;103;48;5;74m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;74;48;5;234m▄\x1b[38;5;97;48;5;104m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;235;48;5;60m▄\x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[m +\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;97;48;5;236m▄\x1b[38;5;206;48;5;237m▄▄\x1b[38;5;206;48;5;236m▄\x1b[38;5;206;48;5;235m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;74m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;65m▄\x1b[38;5;242;48;5;109m▄\x1b[38;5;60;48;5;67m▄▄\x1b[38;5;96;48;5;96m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;234m▄▄▄\x1b[38;5;150;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;239m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;151;48;5;108m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;151;48;5;234m▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[48;5;235m \x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;237;48;5;236m▄\x1b[48;5;235m \x1b[38;5;240;48;5;240m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;150;48;5;234m▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;151m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;116;48;5;152m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;110;48;5;110m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;110;48;5;234m▄\x1b[38;5;104;48;5;68m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;60;48;5;60m▄▄\x1b[38;5;60;48;5;238m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[m +\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;60m▄▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;206;48;5;206m▄▄▄▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[48;5;235m \x1b[38;5;187;48;5;187m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;253;48;5;253m▄\x1b[38;5;151;48;5;151m▄▄▄\x1b[48;5;151m \x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;233;48;5;71m▄\x1b[38;5;234;48;5;110m▄▄▄\x1b[38;5;234;48;5;140m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;151m▄▄\x1b[38;5;234;48;5;247m▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;108;48;5;151m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;150m▄▄▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;234;48;5;235m▄▄\x1b[38;5;240;48;5;240m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;108m▄\x1b[38;5;234;48;5;108m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;116;48;5;116m▄\x1b[48;5;253m \x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;61;48;5;240m▄\x1b[38;5;61;48;5;60m▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;103;48;5;67m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[m +\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;236m▄▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;97;48;5;206m▄▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;97;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;103;48;5;103m▄\x1b[48;5;234m \x1b[38;5;239;48;5;71m▄\x1b[38;5;65;48;5;71m▄\x1b[38;5;67;48;5;73m▄\x1b[38;5;66;48;5;110m▄\x1b[38;5;234;48;5;67m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;151m▄▄▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;108m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;151m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;240m▄\x1b[38;5;234;48;5;151m▄▄\x1b[38;5;234;48;5;150m▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[48;5;235m \x1b[38;5;116;48;5;116m▄\x1b[48;5;253m \x1b[38;5;110;48;5;110m▄▄▄▄\x1b[48;5;110m \x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;236m▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;61;48;5;238m▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;97;48;5;234m▄▄\x1b[38;5;97;48;5;238m▄\x1b[38;5;234;48;5;74m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄▄\x1b[38;5;235;48;5;239m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;235;48;5;239m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;239m▄▄\x1b[38;5;234;48;5;234m▄\x1b[m +\x1b[38;5;61;48;5;234m▄\x1b[38;5;97;48;5;234m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;239m▄▄\x1b[38;5;60;48;5;237m▄▄\x1b[38;5;60;48;5;235m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;60;48;5;236m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;238;48;5;236m▄\x1b[38;5;239;48;5;237m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;187;48;5;187m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;71;48;5;239m▄\x1b[38;5;71;48;5;238m▄\x1b[38;5;74;48;5;240m▄\x1b[38;5;67;48;5;239m▄\x1b[38;5;108;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄▄▄\x1b[38;5;237;48;5;235m▄\x1b[38;5;151;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄\x1b[48;5;235m \x1b[38;5;151;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄\x1b[38;5;65;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄▄▄▄\x1b[38;5;247;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄▄\x1b[38;5;150;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;108;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄▄\x1b[38;5;108;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;151;48;5;234m▄▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;116;48;5;116m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;235;48;5;97m▄\x1b[38;5;238;48;5;97m▄\x1b[38;5;97;48;5;103m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;60;48;5;235m▄\x1b[38;5;60;48;5;61m▄▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;60m▄▄\x1b[m +\x1b[38;5;238;48;5;237m▄\x1b[38;5;237;48;5;238m▄\x1b[38;5;234;48;5;237m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;235;48;5;60m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;235;48;5;60m▄▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;71;48;5;234m▄▄\x1b[38;5;110;48;5;236m▄\x1b[38;5;67;48;5;236m▄\x1b[38;5;108;48;5;108m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;235m▄▄▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;151;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;151;48;5;151m▄▄\x1b[48;5;235m \x1b[38;5;234;48;5;235m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;235;48;5;235m▄▄\x1b[38;5;247;48;5;108m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;234m \x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;59;48;5;59m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;237;48;5;238m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;150;48;5;151m▄\x1b[38;5;144;48;5;234m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;65m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;116;48;5;116m▄\x1b[48;5;253m \x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;61;48;5;60m▄▄\x1b[38;5;97;48;5;97m▄▄\x1b[38;5;238;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;97;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;236;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[m +\x1b[38;5;234;48;5;60m▄▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;237;48;5;61m▄\x1b[38;5;237;48;5;60m▄▄\x1b[38;5;237;48;5;61m▄\x1b[38;5;237;48;5;235m▄\x1b[38;5;236;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;239m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;65;48;5;238m▄\x1b[38;5;65;48;5;237m▄\x1b[38;5;67;48;5;60m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;235;48;5;108m▄▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;238;48;5;238m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;243m▄\x1b[38;5;235;48;5;243m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;151;48;5;151m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[38;5;247;48;5;247m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;235m \x1b[38;5;151;48;5;151m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;65;48;5;241m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[38;5;116;48;5;116m▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;60;48;5;236m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;237m▄▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;60;48;5;234m▄▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;61;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[m +\x1b[38;5;234;48;5;239m▄▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;239m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;235m \x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;187m \x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;103m \x1b[48;5;234m \x1b[38;5;234;48;5;71m▄▄\x1b[38;5;235;48;5;110m▄\x1b[38;5;235;48;5;109m▄\x1b[38;5;234;48;5;8m▄\x1b[38;5;235;48;5;151m▄▄\x1b[38;5;234;48;5;151m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;151m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[38;5;235;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;235;48;5;238m▄\x1b[38;5;235;48;5;151m▄▄\x1b[38;5;235;48;5;150m▄\x1b[38;5;235;48;5;237m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;151m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;247m▄\x1b[38;5;234;48;5;151m▄▄▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;235;48;5;238m▄\x1b[38;5;235;48;5;151m▄▄▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;108m▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;234;48;5;240m▄\x1b[38;5;235;48;5;243m▄\x1b[38;5;235;48;5;151m▄\x1b[38;5;235;48;5;237m▄\x1b[38;5;235;48;5;238m▄\x1b[38;5;235;48;5;150m▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;237m▄\x1b[38;5;235;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;116;48;5;116m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;110;48;5;110m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;237;48;5;237m▄\x1b[38;5;235;48;5;234m▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;235;48;5;60m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[m +\x1b[38;5;74;48;5;234m▄\x1b[38;5;66;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;239m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;60m▄\x1b[48;5;234m \x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄\x1b[48;5;151m \x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;239m▄\x1b[38;5;65;48;5;71m▄\x1b[38;5;67;48;5;74m▄\x1b[38;5;67;48;5;73m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;65;48;5;234m▄\x1b[38;5;8;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[38;5;243;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄▄▄▄\x1b[38;5;239;48;5;234m▄\x1b[38;5;240;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄▄▄\x1b[38;5;151;48;5;233m▄\x1b[38;5;108;48;5;235m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;150;48;5;234m▄\x1b[38;5;151;48;5;234m▄▄▄\x1b[38;5;151;48;5;233m▄\x1b[38;5;108;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[48;5;235m \x1b[38;5;116;48;5;116m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;60;48;5;60m▄\x1b[38;5;60;48;5;61m▄▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;60;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[m +\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;97m▄▄\x1b[38;5;235;48;5;74m▄\x1b[38;5;97;48;5;74m▄\x1b[38;5;103;48;5;234m▄▄\x1b[38;5;67;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;151m▄▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;151;48;5;151m▄▄\x1b[48;5;151m \x1b[38;5;103;48;5;103m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;71;48;5;237m▄\x1b[38;5;72;48;5;237m▄\x1b[38;5;74;48;5;237m▄\x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;108m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;235;48;5;235m▄▄\x1b[38;5;108;48;5;108m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;240;48;5;240m▄\x1b[38;5;65;48;5;240m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;151;48;5;151m▄\x1b[38;5;108;48;5;108m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;235m \x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[48;5;235m \x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄▄▄▄\x1b[48;5;235m \x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;110;48;5;116m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;110;48;5;110m▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;61;48;5;236m▄▄\x1b[38;5;97;48;5;237m▄\x1b[38;5;60;48;5;60m▄\x1b[48;5;234m \x1b[38;5;60;48;5;234m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;238;48;5;238m▄\x1b[38;5;60;48;5;234m▄▄▄▄\x1b[38;5;238;48;5;235m▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[m +\x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;104m▄\x1b[38;5;235;48;5;74m▄\x1b[38;5;104;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;237;48;5;151m▄▄\x1b[38;5;236;48;5;151m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;110;48;5;110m▄\x1b[48;5;234m \x1b[38;5;71;48;5;234m▄▄\x1b[38;5;67;48;5;238m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;108m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;239;48;5;239m▄\x1b[38;5;234;48;5;65m▄\x1b[38;5;108;48;5;151m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[38;5;108;48;5;108m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;8;48;5;151m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[48;5;235m \x1b[38;5;235;48;5;234m▄\x1b[48;5;235m \x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;188;48;5;188m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;236;48;5;60m▄▄▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;238;48;5;238m▄\x1b[38;5;234;48;5;239m▄\x1b[38;5;234;48;5;60m▄▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[m +\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;235m \x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;67m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;235m▄▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;65m▄\x1b[38;5;236;48;5;71m▄\x1b[38;5;236;48;5;110m▄\x1b[38;5;235;48;5;110m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;65;48;5;234m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;65;48;5;234m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;239;48;5;234m▄\x1b[38;5;65;48;5;234m▄▄▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;240;48;5;239m▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;65;48;5;234m▄▄▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;108;48;5;108m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;65;48;5;234m▄▄▄▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;66;48;5;235m▄\x1b[38;5;252;48;5;188m▄\x1b[48;5;253m \x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;60;48;5;61m▄▄▄\x1b[38;5;60;48;5;60m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;237;48;5;238m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;60;48;5;61m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄▄\x1b[48;5;235m \x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[m +\x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄\x1b[48;5;234m \x1b[48;5;235m \x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;97;48;5;110m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;235m▄▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;187;48;5;253m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;103;48;5;103m▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;238;48;5;71m▄\x1b[38;5;237;48;5;71m▄\x1b[38;5;67;48;5;74m▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;151m▄▄▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;234;48;5;65m▄\x1b[38;5;234;48;5;108m▄\x1b[38;5;234;48;5;151m▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;59m▄\x1b[38;5;234;48;5;151m▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;151m▄▄▄▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;116;48;5;110m▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;253m \x1b[38;5;110;48;5;110m▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;61;48;5;235m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;60;48;5;60m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[48;5;235m \x1b[38;5;235;48;5;235m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[m +\x1b[38;5;234;48;5;74m▄\x1b[38;5;103;48;5;234m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;68m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;67;48;5;234m▄\x1b[38;5;109;48;5;234m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;235;48;5;151m▄▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;187m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;103;48;5;103m▄▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;152;48;5;116m▄\x1b[48;5;253m \x1b[38;5;253;48;5;253m▄\x1b[38;5;110;48;5;110m▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;60m▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;235;48;5;60m▄\x1b[38;5;60;48;5;60m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;239m▄▄▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[48;5;235m \x1b[38;5;234;48;5;234m▄▄\x1b[m +\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;104m▄\x1b[38;5;235;48;5;110m▄\x1b[38;5;103;48;5;234m▄\x1b[38;5;66;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;73;48;5;234m▄\x1b[38;5;103;48;5;234m▄\x1b[38;5;236;48;5;74m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;187;48;5;187m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;238;48;5;150m▄\x1b[38;5;237;48;5;150m▄▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;103;48;5;103m▄▄▄\x1b[38;5;110;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;253;48;5;109m▄\x1b[38;5;253;48;5;253m▄▄▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;61;48;5;234m▄▄\x1b[38;5;97;48;5;235m▄▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[48;5;234m \x1b[48;5;235m \x1b[38;5;235;48;5;235m▄\x1b[48;5;235m \x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[m +\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;235;48;5;74m▄\x1b[38;5;110;48;5;234m▄\x1b[38;5;67;48;5;234m▄\x1b[38;5;67;48;5;66m▄\x1b[38;5;234;48;5;74m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;193;48;5;187m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[48;5;151m \x1b[38;5;253;48;5;253m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;103;48;5;103m▄▄\x1b[38;5;252;48;5;103m▄\x1b[38;5;253;48;5;104m▄\x1b[38;5;253;48;5;188m▄\x1b[38;5;253;48;5;252m▄\x1b[38;5;253;48;5;110m▄\x1b[38;5;253;48;5;241m▄\x1b[38;5;188;48;5;234m▄\x1b[38;5;152;48;5;234m▄\x1b[38;5;116;48;5;234m▄▄\x1b[38;5;110;48;5;235m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;235;48;5;234m▄\x1b[38;5;239;48;5;234m▄▄▄▄▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;110;48;5;234m▄▄\x1b[38;5;252;48;5;234m▄\x1b[38;5;252;48;5;235m▄\x1b[38;5;188;48;5;237m▄\x1b[38;5;253;48;5;237m▄\x1b[38;5;253;48;5;116m▄▄\x1b[38;5;253;48;5;253m▄▄▄\x1b[38;5;253;48;5;251m▄\x1b[38;5;253;48;5;253m▄\x1b[38;5;188;48;5;253m▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;239m▄▄\x1b[38;5;237;48;5;239m▄\x1b[38;5;97;48;5;239m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;61m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄▄▄\x1b[m +\x1b[38;5;236;48;5;234m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;234m▄▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;74;48;5;234m▄\x1b[38;5;235;48;5;74m▄\x1b[38;5;234;48;5;67m▄\x1b[38;5;240;48;5;234m▄\x1b[38;5;239;48;5;234m▄\x1b[38;5;237;48;5;234m▄▄\x1b[38;5;238;48;5;234m▄▄▄▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;235;48;5;238m▄\x1b[38;5;234;48;5;248m▄\x1b[38;5;235;48;5;151m▄\x1b[38;5;247;48;5;151m▄\x1b[38;5;150;48;5;151m▄\x1b[38;5;187;48;5;253m▄\x1b[38;5;151;48;5;151m▄▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;103m▄\x1b[38;5;151;48;5;252m▄\x1b[38;5;151;48;5;188m▄\x1b[38;5;151;48;5;253m▄▄▄▄▄▄▄▄▄\x1b[38;5;151;48;5;188m▄▄\x1b[38;5;151;48;5;253m▄\x1b[38;5;151;48;5;188m▄\x1b[38;5;7;48;5;188m▄\x1b[38;5;251;48;5;253m▄\x1b[38;5;152;48;5;253m▄\x1b[38;5;252;48;5;152m▄▄\x1b[38;5;152;48;5;116m▄\x1b[38;5;252;48;5;116m▄▄▄▄▄▄\x1b[38;5;188;48;5;116m▄▄\x1b[38;5;252;48;5;116m▄▄▄▄▄\x1b[38;5;152;48;5;116m▄\x1b[38;5;152;48;5;152m▄\x1b[38;5;152;48;5;188m▄▄▄▄\x1b[38;5;152;48;5;253m▄▄\x1b[38;5;116;48;5;253m▄\x1b[38;5;110;48;5;253m▄▄▄▄▄▄▄▄▄▄\x1b[38;5;110;48;5;188m▄▄▄▄\x1b[38;5;110;48;5;146m▄\x1b[38;5;110;48;5;110m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;237;48;5;61m▄\x1b[38;5;238;48;5;61m▄\x1b[38;5;60;48;5;61m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;238;48;5;97m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;236;48;5;234m▄▄\x1b[38;5;237;48;5;234m▄▄\x1b[38;5;236;48;5;234m▄▄\x1b[38;5;238;48;5;234m▄\x1b[38;5;237;48;5;234m▄▄\x1b[m +\x1b[38;5;235;48;5;97m▄\x1b[38;5;60;48;5;239m▄\x1b[38;5;240;48;5;97m▄\x1b[38;5;60;48;5;97m▄▄\x1b[38;5;60;48;5;103m▄\x1b[38;5;109;48;5;236m▄\x1b[38;5;234;48;5;73m▄\x1b[38;5;243;48;5;235m▄\x1b[38;5;108;48;5;242m▄\x1b[38;5;243;48;5;150m▄\x1b[38;5;239;48;5;151m▄\x1b[38;5;65;48;5;151m▄\x1b[38;5;65;48;5;150m▄\x1b[38;5;59;48;5;150m▄\x1b[38;5;240;48;5;151m▄\x1b[38;5;59;48;5;150m▄\x1b[38;5;65;48;5;150m▄\x1b[38;5;238;48;5;150m▄\x1b[38;5;243;48;5;236m▄\x1b[38;5;65;48;5;150m▄\x1b[38;5;65;48;5;236m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;187;48;5;193m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄▄▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄▄▄▄\x1b[38;5;151;48;5;115m▄\x1b[38;5;115;48;5;115m▄▄▄▄▄\x1b[38;5;115;48;5;110m▄▄▄▄\x1b[38;5;110;48;5;110m▄▄▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;61;48;5;236m▄\x1b[38;5;97;48;5;236m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;234;48;5;97m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;234;48;5;60m▄\x1b[38;5;234;48;5;97m▄▄\x1b[38;5;237;48;5;97m▄\x1b[38;5;238;48;5;97m▄\x1b[38;5;237;48;5;97m▄\x1b[38;5;238;48;5;97m▄\x1b[38;5;238;48;5;237m▄\x1b[38;5;237;48;5;97m▄▄▄\x1b[38;5;238;48;5;97m▄▄▄▄\x1b[38;5;234;48;5;97m▄\x1b[m +\x1b[38;5;238;48;5;97m▄\x1b[38;5;237;48;5;97m▄\x1b[38;5;236;48;5;109m▄\x1b[38;5;235;48;5;115m▄\x1b[38;5;237;48;5;151m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;110;48;5;74m▄\x1b[38;5;241;48;5;151m▄\x1b[38;5;237;48;5;151m▄\x1b[38;5;238;48;5;151m▄\x1b[38;5;239;48;5;150m▄\x1b[38;5;239;48;5;151m▄▄▄▄\x1b[38;5;237;48;5;151m▄▄\x1b[38;5;240;48;5;108m▄\x1b[38;5;239;48;5;150m▄\x1b[38;5;59;48;5;150m▄\x1b[38;5;65;48;5;150m▄\x1b[38;5;240;48;5;150m▄▄\x1b[38;5;235;48;5;234m▄▄\x1b[38;5;253;48;5;188m▄\x1b[38;5;151;48;5;151m▄▄▄▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;60;48;5;243m▄\x1b[38;5;150;48;5;239m▄\x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄▄▄\x1b[48;5;151m \x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;115m▄\x1b[38;5;151;48;5;109m▄\x1b[38;5;109;48;5;109m▄\x1b[38;5;73;48;5;109m▄▄▄▄▄\x1b[38;5;109;48;5;109m▄\x1b[38;5;110;48;5;109m▄▄▄▄▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;116;48;5;110m▄\x1b[38;5;110;48;5;110m▄▄▄▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄▄▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;97;48;5;234m▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;110;48;5;110m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[38;5;152;48;5;152m▄\x1b[38;5;110;48;5;110m▄▄▄▄▄\x1b[38;5;97;48;5;234m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;60m▄▄▄▄\x1b[38;5;239;48;5;97m▄\x1b[38;5;238;48;5;97m▄\x1b[38;5;60;48;5;97m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;238;48;5;97m▄\x1b[38;5;239;48;5;97m▄\x1b[38;5;240;48;5;97m▄▄\x1b[m +\x1b[38;5;234;48;5;109m▄\x1b[38;5;233;48;5;114m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;233;48;5;150m▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;60;48;5;151m▄\x1b[38;5;233;48;5;240m▄\x1b[38;5;234;48;5;150m▄▄\x1b[38;5;233;48;5;150m▄\x1b[38;5;233;48;5;151m▄▄\x1b[38;5;233;48;5;150m▄\x1b[38;5;234;48;5;108m▄\x1b[38;5;233;48;5;150m▄▄▄▄▄\x1b[38;5;233;48;5;151m▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;233;48;5;150m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;103;48;5;188m▄\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;151;48;5;248m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;248m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;115;48;5;151m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;115;48;5;151m▄▄\x1b[38;5;115;48;5;115m▄\x1b[38;5;151;48;5;115m▄\x1b[38;5;115;48;5;109m▄▄\x1b[38;5;115;48;5;115m▄▄\x1b[38;5;115;48;5;109m▄▄\x1b[38;5;109;48;5;109m▄\x1b[38;5;115;48;5;109m▄\x1b[38;5;116;48;5;110m▄▄▄▄\x1b[38;5;110;48;5;110m▄▄▄\x1b[48;5;110m \x1b[38;5;110;48;5;110m▄▄\x1b[38;5;152;48;5;237m▄\x1b[38;5;152;48;5;235m▄\x1b[38;5;152;48;5;234m▄▄\x1b[38;5;152;48;5;235m▄\x1b[38;5;152;48;5;234m▄▄▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;110;48;5;104m▄\x1b[38;5;188;48;5;234m▄\x1b[38;5;188;48;5;109m▄\x1b[38;5;252;48;5;109m▄\x1b[38;5;188;48;5;109m▄\x1b[38;5;188;48;5;73m▄▄\x1b[38;5;152;48;5;73m▄\x1b[38;5;253;48;5;152m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;110;48;5;103m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;103;48;5;110m▄\x1b[38;5;110;48;5;110m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;234;48;5;67m▄\x1b[38;5;236;48;5;66m▄\x1b[38;5;234;48;5;74m▄▄▄\x1b[38;5;233;48;5;74m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;232;48;5;110m▄\x1b[38;5;233;48;5;110m▄▄\x1b[m +\x1b[38;5;108;48;5;241m▄\x1b[38;5;108;48;5;151m▄\x1b[38;5;8;48;5;151m▄\x1b[38;5;243;48;5;151m▄\x1b[38;5;65;48;5;235m▄\x1b[38;5;59;48;5;234m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;67m▄\x1b[38;5;97;48;5;239m▄\x1b[38;5;110;48;5;151m▄\x1b[38;5;110;48;5;150m▄\x1b[38;5;234;48;5;150m▄\x1b[38;5;237;48;5;151m▄\x1b[38;5;65;48;5;151m▄\x1b[38;5;240;48;5;150m▄▄▄▄\x1b[38;5;237;48;5;151m▄\x1b[38;5;240;48;5;151m▄\x1b[38;5;59;48;5;150m▄▄\x1b[38;5;65;48;5;150m▄\x1b[38;5;243;48;5;150m▄▄\x1b[38;5;65;48;5;61m▄\x1b[38;5;243;48;5;151m▄\x1b[38;5;234;48;5;151m▄\x1b[38;5;234;48;5;248m▄▄▄▄▄▄▄▄▄▄\x1b[38;5;235;48;5;248m▄▄▄\x1b[38;5;234;48;5;248m▄▄\x1b[38;5;235;48;5;248m▄▄\x1b[38;5;234;48;5;248m▄\x1b[38;5;234;48;5;145m▄\x1b[38;5;235;48;5;248m▄\x1b[38;5;234;48;5;248m▄\x1b[38;5;234;48;5;145m▄\x1b[38;5;235;48;5;145m▄\x1b[38;5;235;48;5;248m▄\x1b[38;5;235;48;5;145m▄▄\x1b[38;5;235;48;5;249m▄▄\x1b[38;5;234;48;5;109m▄\x1b[38;5;234;48;5;250m▄\x1b[38;5;234;48;5;109m▄▄▄\x1b[38;5;235;48;5;109m▄\x1b[38;5;235;48;5;110m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;235;48;5;110m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;235;48;5;110m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;235;48;5;110m▄▄\x1b[38;5;234;48;5;110m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;234;48;5;104m▄\x1b[38;5;103;48;5;103m▄\x1b[38;5;234;48;5;110m▄\x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;235;48;5;66m▄\x1b[38;5;67;48;5;67m▄▄\x1b[38;5;73;48;5;73m▄▄\x1b[38;5;73;48;5;74m▄\x1b[38;5;73;48;5;66m▄\x1b[38;5;236;48;5;74m▄\x1b[38;5;67;48;5;74m▄▄\x1b[38;5;67;48;5;110m▄\x1b[38;5;67;48;5;74m▄\x1b[38;5;66;48;5;74m▄\x1b[38;5;66;48;5;240m▄\x1b[m +\x1b[38;5;151;48;5;151m▄▄\x1b[38;5;150;48;5;150m▄\x1b[38;5;237;48;5;150m▄\x1b[38;5;150;48;5;65m▄\x1b[38;5;151;48;5;150m▄\x1b[38;5;151;48;5;151m▄\x1b[38;5;151;48;5;236m▄\x1b[38;5;150;48;5;234m▄\x1b[38;5;151;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;240;48;5;237m▄\x1b[38;5;234;48;5;103m▄▄\x1b[38;5;234;48;5;104m▄\x1b[38;5;234;48;5;110m▄▄▄\x1b[38;5;65;48;5;110m▄\x1b[38;5;65;48;5;109m▄▄\x1b[38;5;65;48;5;103m▄\x1b[38;5;243;48;5;247m▄\x1b[38;5;150;48;5;150m▄▄▄▄\x1b[38;5;150;48;5;237m▄\x1b[38;5;236;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;97;48;5;234m▄\x1b[38;5;60;48;5;234m▄▄\x1b[38;5;61;48;5;234m▄\x1b[38;5;60;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;97;48;5;234m▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;237;48;5;235m▄\x1b[38;5;234;48;5;97m▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;66;48;5;234m▄\x1b[38;5;66;48;5;240m▄\x1b[38;5;67;48;5;240m▄\x1b[38;5;110;48;5;59m▄\x1b[38;5;74;48;5;74m▄\x1b[38;5;74;48;5;110m▄▄\x1b[38;5;66;48;5;74m▄\x1b[38;5;74;48;5;74m▄▄\x1b[38;5;110;48;5;74m▄▄▄\x1b[38;5;110;48;5;73m▄\x1b[38;5;236;48;5;74m▄\x1b[38;5;74;48;5;74m▄▄▄\x1b[m +\x1b[38;5;151;48;5;151m▄\x1b[38;5;243;48;5;151m▄\x1b[38;5;151;48;5;243m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;238;48;5;151m▄\x1b[38;5;151;48;5;236m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;114;48;5;151m▄\x1b[38;5;151;48;5;108m▄\x1b[38;5;151;48;5;150m▄\x1b[38;5;150;48;5;150m▄\x1b[38;5;151;48;5;151m▄▄▄▄▄\x1b[38;5;151;48;5;108m▄\x1b[38;5;150;48;5;151m▄▄\x1b[38;5;150;48;5;234m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;97;48;5;97m▄▄\x1b[38;5;97;48;5;239m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;97;48;5;60m▄\x1b[38;5;238;48;5;239m▄\x1b[38;5;237;48;5;239m▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;237;48;5;238m▄▄\x1b[38;5;236;48;5;238m▄▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;236;48;5;238m▄▄▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄▄▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄▄\x1b[38;5;236;48;5;238m▄▄\x1b[38;5;236;48;5;237m▄▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;236;48;5;237m▄▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;236;48;5;237m▄▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄▄▄\x1b[38;5;236;48;5;238m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;238;48;5;238m▄▄\x1b[38;5;97;48;5;239m▄\x1b[38;5;61;48;5;239m▄\x1b[38;5;97;48;5;60m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;97;48;5;60m▄\x1b[38;5;97;48;5;97m▄\x1b[38;5;234;48;5;97m▄\x1b[48;5;234m \x1b[38;5;67;48;5;234m▄\x1b[38;5;67;48;5;74m▄\x1b[38;5;67;48;5;73m▄\x1b[38;5;67;48;5;74m▄▄\x1b[38;5;74;48;5;239m▄\x1b[38;5;74;48;5;74m▄▄\x1b[38;5;110;48;5;74m▄▄▄▄▄\x1b[38;5;74;48;5;66m▄\x1b[38;5;236;48;5;74m▄\x1b[38;5;74;48;5;74m▄▄▄▄▄\x1b[38;5;110;48;5;237m▄\x1b[38;5;110;48;5;74m▄\x1b[38;5;74;48;5;74m▄\x1b[m +\x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;237m▄▄\x1b[38;5;234;48;5;236m▄▄▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;237m▄▄▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;237m▄▄▄\x1b[38;5;234;48;5;236m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;234;48;5;237m▄▄▄▄▄▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;97m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄\x1b[38;5;235;48;5;235m▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;234;48;5;235m▄▄▄\x1b[38;5;234;48;5;236m▄▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;236m▄▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;235;48;5;236m▄\x1b[38;5;234;48;5;236m▄▄▄▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;234;48;5;236m▄\x1b[m +\x1b[38;5;234;48;5;234m▄▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;235;48;5;234m▄▄▄\x1b[38;5;234;48;5;234m▄▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;234;48;5;234m▄▄▄▄▄\x1b[38;5;235;48;5;234m▄▄\x1b[38;5;234;48;5;234m▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄\x1b[38;5;235;48;5;234m▄▄▄▄▄▄▄\x1b[38;5;234;48;5;234m▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄▄\x1b[48;5;234m \x1b[38;5;234;48;5;234m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[m + +`; + +const DARK_TOWER_HEADER1 = ` +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;235;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;52;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[48;5;0m \x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;202;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄\x1b[38;5;124;48;5;0m▄\x1b[38;5;124;48;5;232m▄\x1b[38;5;202;48;5;124m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;152;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;239;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;124;48;5;232m▄\x1b[38;5;202;48;5;233m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;4;48;5;103m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;144;48;5;0m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;20;48;5;0m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;20;48;5;18m▄\x1b[38;5;237;48;5;109m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;14;48;5;19m▄\x1b[38;5;19;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;24;48;5;18m▄\x1b[38;5;232;48;5;17m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;1;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;124m▄\x1b[38;5;9;48;5;160m▄\x1b[38;5;228;48;5;214m▄\x1b[38;5;9;48;5;52m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;1;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;1;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;232;48;5;52m▄\x1b[38;5;202;48;5;52m▄\x1b[38;5;208;48;5;202m▄\x1b[38;5;202;48;5;1m▄\x1b[38;5;232;48;5;52m▄\x1b[48;5;0m \x1b[38;5;232;48;5;233m▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;233m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;60;48;5;237m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;246;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;241;48;5;234m▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;153;48;5;0m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;124m▄\x1b[38;5;15;48;5;220m▄\x1b[38;5;15;48;5;214m▄\x1b[38;5;233;48;5;202m▄\x1b[38;5;0;48;5;202m▄▄\x1b[38;5;215;48;5;220m▄\x1b[38;5;15;48;5;15m▄\x1b[38;5;230;48;5;124m▄\x1b[38;5;52;48;5;52m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;58m▄\x1b[38;5;214;48;5;11m▄\x1b[38;5;137;48;5;220m▄\x1b[38;5;255;48;5;220m▄\x1b[38;5;0;48;5;208m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;172m▄\x1b[38;5;15;48;5;11m▄\x1b[38;5;230;48;5;11m▄\x1b[38;5;0;48;5;11m▄▄\x1b[38;5;15;48;5;166m▄\x1b[38;5;15;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;220m▄\x1b[38;5;249;48;5;220m▄\x1b[38;5;187;48;5;228m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;255;48;5;227m▄\x1b[38;5;130;48;5;227m▄\x1b[38;5;0;48;5;214m▄\x1b[38;5;0;48;5;220m▄▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;17m▄▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;20;48;5;189m▄\x1b[38;5;27;48;5;20m▄\x1b[48;5;0m \x1b[38;5;241;48;5;254m▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;25;48;5;20m▄\x1b[38;5;27;48;5;27m▄\x1b[38;5;20;48;5;0m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;19;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;188;48;5;246m▄\x1b[38;5;246;48;5;255m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;255;48;5;246m▄\x1b[38;5;251;48;5;255m▄\x1b[38;5;221;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;208;48;5;139m▄\x1b[38;5;0;48;5;136m▄\x1b[38;5;145;48;5;253m▄\x1b[38;5;223;48;5;136m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;214;48;5;222m▄\x1b[38;5;251;48;5;15m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;230;48;5;58m▄\x1b[38;5;102;48;5;254m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;145;48;5;247m▄\x1b[38;5;8;48;5;249m▄\x1b[38;5;255;48;5;0m▄\x1b[38;5;214;48;5;144m▄\x1b[38;5;0;48;5;130m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;26;48;5;235m▄\x1b[38;5;239;48;5;253m▄\x1b[38;5;234;48;5;7m▄\x1b[38;5;24;48;5;242m▄\x1b[38;5;23;48;5;239m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;39;48;5;0m▄\x1b[38;5;33;48;5;45m▄\x1b[38;5;0;48;5;32m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;19m▄▄\x1b[38;5;4;48;5;19m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;243;48;5;236m▄\x1b[38;5;253;48;5;145m▄\x1b[38;5;233;48;5;235m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;95m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;240;48;5;251m▄\x1b[38;5;239;48;5;252m▄\x1b[38;5;0;48;5;230m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;247;48;5;243m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;246;48;5;249m▄\x1b[38;5;248;48;5;247m▄\x1b[38;5;240;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;245;48;5;245m▄\x1b[38;5;235;48;5;8m▄\x1b[38;5;0;48;5;240m▄\x1b[38;5;245;48;5;239m▄\x1b[38;5;102;48;5;255m▄\x1b[38;5;251;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;242;48;5;236m▄\x1b[38;5;59;48;5;59m▄\x1b[38;5;0;48;5;102m▄\x1b[38;5;245;48;5;243m▄\x1b[38;5;242;48;5;235m▄\x1b[38;5;52;48;5;233m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;4m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;4;48;5;19m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;25;48;5;19m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;26m▄\x1b[38;5;69;48;5;20m▄\x1b[38;5;69;48;5;33m▄\x1b[38;5;26;48;5;12m▄\x1b[38;5;235;48;5;243m▄\x1b[38;5;236;48;5;243m▄\x1b[38;5;6;48;5;102m▄\x1b[38;5;245;48;5;0m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;0;48;5;67m▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;33;48;5;75m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;24;48;5;12m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;31;48;5;0m▄\x1b[38;5;23;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;9;48;5;0m▄\x1b[38;5;160;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;137;48;5;59m▄\x1b[38;5;240;48;5;241m▄\x1b[38;5;234;48;5;233m▄\x1b[38;5;241;48;5;0m▄▄\x1b[38;5;249;48;5;102m▄\x1b[38;5;0;48;5;236m▄\x1b[38;5;0;48;5;7m▄\x1b[38;5;145;48;5;0m▄\x1b[38;5;243;48;5;243m▄\x1b[38;5;188;48;5;251m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;239;48;5;0m▄\x1b[38;5;243;48;5;233m▄\x1b[38;5;239;48;5;241m▄\x1b[38;5;255;48;5;0m▄\x1b[38;5;59;48;5;8m▄\x1b[38;5;102;48;5;236m▄\x1b[38;5;248;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;242m▄\x1b[38;5;237;48;5;249m▄\x1b[38;5;241;48;5;0m▄\x1b[38;5;239;48;5;0m▄\x1b[38;5;242;48;5;239m▄\x1b[38;5;234;48;5;239m▄\x1b[38;5;245;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;238m▄\x1b[38;5;187;48;5;172m▄\x1b[38;5;230;48;5;52m▄\x1b[38;5;9;48;5;17m▄\x1b[38;5;124;48;5;233m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;88;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;52;48;5;17m▄\x1b[38;5;52;48;5;4m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;233;48;5;220m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;4;48;5;26m▄\x1b[38;5;19;48;5;27m▄\x1b[38;5;238;48;5;246m▄\x1b[38;5;8;48;5;245m▄\x1b[38;5;239;48;5;11m▄\x1b[38;5;103;48;5;232m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;220;48;5;208m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;26;48;5;19m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;24;48;5;232m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;20;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;243;48;5;202m▄\x1b[38;5;0;48;5;202m▄▄\x1b[38;5;235;48;5;208m▄\x1b[38;5;173;48;5;202m▄\x1b[38;5;239;48;5;208m▄\x1b[38;5;0;48;5;214m▄\x1b[38;5;222;48;5;220m▄\x1b[38;5;181;48;5;214m▄\x1b[38;5;233;48;5;1m▄\x1b[38;5;95;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;220;48;5;0m▄\x1b[38;5;11;48;5;0m▄\x1b[38;5;220;48;5;0m▄\x1b[38;5;227;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;208;48;5;0m▄\x1b[38;5;214;48;5;0m▄\x1b[38;5;220;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;227;48;5;0m▄\x1b[38;5;227;48;5;232m▄\x1b[38;5;220;48;5;52m▄\x1b[38;5;228;48;5;0m▄\x1b[38;5;220;48;5;0m▄\x1b[38;5;214;48;5;0m▄\x1b[38;5;208;48;5;0m▄\x1b[38;5;214;48;5;0m▄▄▄\x1b[38;5;227;48;5;0m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;0;48;5;172m▄\x1b[38;5;15;48;5;208m▄\x1b[38;5;230;48;5;202m▄\x1b[38;5;101;48;5;202m▄\x1b[38;5;0;48;5;202m▄\x1b[38;5;0;48;5;208m▄\x1b[38;5;230;48;5;208m▄\x1b[38;5;15;48;5;220m▄\x1b[38;5;220;48;5;229m▄\x1b[38;5;214;48;5;52m▄\x1b[38;5;232;48;5;130m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;17;48;5;236m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;4;48;5;25m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;246;48;5;248m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;0;48;5;243m▄▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;239;48;5;0m▄\x1b[38;5;0;48;5;237m▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;25;48;5;38m▄\x1b[38;5;24;48;5;74m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;25;48;5;17m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;223;48;5;144m▄\x1b[38;5;242;48;5;138m▄\x1b[38;5;144;48;5;143m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;247m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;246;48;5;166m▄\x1b[38;5;7;48;5;220m▄\x1b[38;5;246;48;5;214m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;240;48;5;221m▄\x1b[38;5;145;48;5;220m▄\x1b[38;5;249;48;5;208m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;247;48;5;221m▄\x1b[38;5;8;48;5;187m▄\x1b[38;5;221;48;5;3m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;246;48;5;181m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;52;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;248;48;5;223m▄\x1b[38;5;59;48;5;187m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;249;48;5;179m▄\x1b[38;5;249;48;5;180m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;8m▄\x1b[38;5;247;48;5;186m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;247;48;5;252m▄\x1b[38;5;242;48;5;242m▄\x1b[38;5;7;48;5;222m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;101m▄\x1b[38;5;247;48;5;254m▄\x1b[38;5;8;48;5;253m▄\x1b[38;5;187;48;5;143m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;20;48;5;17m▄\x1b[38;5;27;48;5;27m▄\x1b[38;5;103;48;5;236m▄\x1b[38;5;239;48;5;237m▄\x1b[38;5;240;48;5;241m▄\x1b[38;5;60;48;5;59m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;27;48;5;17m▄\x1b[38;5;25;48;5;0m▄▄\x1b[38;5;237;48;5;0m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;20m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;245;48;5;248m▄\x1b[38;5;245;48;5;59m▄\x1b[38;5;247;48;5;251m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;250;48;5;229m▄\x1b[38;5;238;48;5;8m▄\x1b[38;5;250;48;5;252m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;240;48;5;248m▄\x1b[38;5;248;48;5;241m▄\x1b[38;5;241;48;5;143m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;236;48;5;247m▄\x1b[38;5;240;48;5;243m▄\x1b[48;5;0m \x1b[38;5;0;48;5;52m▄\x1b[38;5;237;48;5;187m▄\x1b[38;5;236;48;5;188m▄\x1b[38;5;237;48;5;144m▄\x1b[38;5;0;48;5;88m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;248;48;5;239m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[48;5;0m \x1b[38;5;250;48;5;242m▄\x1b[38;5;242;48;5;253m▄\x1b[38;5;144;48;5;0m▄\x1b[38;5;180;48;5;0m▄\x1b[38;5;229;48;5;0m▄\x1b[38;5;187;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;243;48;5;234m▄\x1b[38;5;238;48;5;237m▄\x1b[38;5;239;48;5;248m▄\x1b[48;5;0m \x1b[38;5;145;48;5;0m▄\x1b[38;5;241;48;5;255m▄\x1b[38;5;102;48;5;249m▄\x1b[38;5;0;48;5;145m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;25;48;5;20m▄\x1b[38;5;18;48;5;19m▄\x1b[38;5;66;48;5;234m▄\x1b[38;5;66;48;5;237m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;66;48;5;60m▄\x1b[38;5;235;48;5;239m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;220;48;5;208m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;17;48;5;27m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;234;48;5;233m▄\x1b[m +\x1b[38;5;0;48;5;0m▄\x1b[38;5;31;48;5;0m▄\x1b[38;5;66;48;5;0m▄\x1b[38;5;24;48;5;235m▄\x1b[38;5;25;48;5;0m▄▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;248;48;5;255m▄\x1b[38;5;60;48;5;240m▄\x1b[38;5;249;48;5;62m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;239;48;5;242m▄\x1b[38;5;62;48;5;240m▄\x1b[38;5;67;48;5;246m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;62;48;5;249m▄\x1b[38;5;61;48;5;247m▄\x1b[38;5;25;48;5;235m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;61;48;5;246m▄\x1b[38;5;60;48;5;249m▄\x1b[38;5;68;48;5;7m▄\x1b[38;5;68;48;5;243m▄\x1b[38;5;62;48;5;248m▄\x1b[38;5;81;48;5;246m▄\x1b[38;5;24;48;5;241m▄\x1b[38;5;75;48;5;250m▄\x1b[38;5;104;48;5;145m▄\x1b[38;5;26;48;5;251m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;8;48;5;241m▄\x1b[38;5;236;48;5;8m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;250m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;111m▄\x1b[38;5;63;48;5;242m▄\x1b[38;5;62;48;5;243m▄\x1b[38;5;251;48;5;250m▄\x1b[38;5;0;48;5;250m▄\x1b[38;5;25;48;5;59m▄\x1b[38;5;61;48;5;242m▄\x1b[38;5;61;48;5;145m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;24;48;5;235m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;236;48;5;103m▄\x1b[38;5;60;48;5;239m▄\x1b[38;5;66;48;5;60m▄\x1b[38;5;67;48;5;60m▄\x1b[38;5;66;48;5;238m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;237;48;5;234m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;26;48;5;4m▄\x1b[38;5;32;48;5;0m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;32;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;152m▄\x1b[38;5;0;48;5;241m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;24;48;5;25m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;117;48;5;69m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;81;48;5;110m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;110m▄\x1b[38;5;39;48;5;60m▄\x1b[38;5;74;48;5;67m▄\x1b[38;5;81;48;5;235m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;32;48;5;103m▄\x1b[38;5;45;48;5;238m▄\x1b[38;5;0;48;5;249m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;24;48;5;249m▄\x1b[38;5;23;48;5;245m▄\x1b[38;5;117;48;5;60m▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;45;48;5;249m▄\x1b[38;5;39;48;5;239m▄\x1b[38;5;45;48;5;247m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;19m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;24;48;5;243m▄\x1b[38;5;31;48;5;240m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;4m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;123;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;27;48;5;101m▄\x1b[38;5;26;48;5;242m▄\x1b[38;5;87;48;5;253m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;7m▄\x1b[38;5;68;48;5;239m▄\x1b[38;5;69;48;5;61m▄\x1b[38;5;25;48;5;61m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;234;48;5;234m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;17m▄\x1b[38;5;59;48;5;66m▄\x1b[38;5;0;48;5;103m▄\x1b[38;5;60;48;5;232m▄\x1b[38;5;238;48;5;232m▄\x1b[38;5;214;48;5;24m▄\x1b[38;5;66;48;5;232m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;235;48;5;23m▄\x1b[38;5;236;48;5;60m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;239m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;25;48;5;232m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;25;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;17;48;5;232m▄\x1b[48;5;0m \x1b[38;5;17;48;5;17m▄\x1b[38;5;27;48;5;19m▄\x1b[38;5;14;48;5;195m▄\x1b[38;5;18;48;5;25m▄\x1b[38;5;26;48;5;81m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;98;48;5;0m▄\x1b[38;5;75;48;5;0m▄\x1b[38;5;0;48;5;44m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;27;48;5;67m▄\x1b[38;5;26;48;5;19m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;0;48;5;45m▄\x1b[38;5;0;48;5;159m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;4;48;5;18m▄\x1b[38;5;17;48;5;87m▄\x1b[38;5;38;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;0;48;5;123m▄\x1b[38;5;14;48;5;87m▄\x1b[38;5;17;48;5;123m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;159;48;5;0m▄\x1b[38;5;15;48;5;4m▄\x1b[38;5;15;48;5;45m▄\x1b[38;5;15;48;5;24m▄\x1b[38;5;15;48;5;123m▄▄▄\x1b[38;5;195;48;5;81m▄\x1b[38;5;15;48;5;74m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;15;48;5;24m▄\x1b[38;5;39;48;5;69m▄\x1b[38;5;39;48;5;27m▄\x1b[38;5;14;48;5;159m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;87m▄\x1b[38;5;45;48;5;27m▄\x1b[38;5;33;48;5;26m▄\x1b[38;5;39;48;5;87m▄\x1b[38;5;38;48;5;17m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;25;48;5;236m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;236m▄\x1b[38;5;238;48;5;220m▄\x1b[38;5;60;48;5;59m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;24;48;5;23m▄\x1b[38;5;30;48;5;233m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;25;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;87;48;5;233m▄\x1b[38;5;25;48;5;18m▄\x1b[38;5;25;48;5;45m▄\x1b[38;5;26;48;5;87m▄\x1b[38;5;26;48;5;159m▄\x1b[38;5;19;48;5;123m▄\x1b[38;5;17;48;5;195m▄\x1b[38;5;0;48;5;15m▄▄\x1b[38;5;0;48;5;152m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;20;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;4;48;5;14m▄\x1b[38;5;0;48;5;159m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;32;48;5;26m▄\x1b[38;5;39;48;5;45m▄\x1b[38;5;25;48;5;25m▄\x1b[38;5;0;48;5;15m▄\x1b[38;5;20;48;5;14m▄\x1b[38;5;0;48;5;39m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;0;48;5;87m▄\x1b[38;5;17;48;5;15m▄\x1b[38;5;233;48;5;15m▄\x1b[38;5;0;48;5;195m▄▄\x1b[38;5;0;48;5;87m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;4;48;5;20m▄\x1b[38;5;81;48;5;45m▄\x1b[38;5;25;48;5;32m▄\x1b[38;5;15;48;5;45m▄\x1b[38;5;123;48;5;27m▄\x1b[38;5;159;48;5;18m▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;25;48;5;25m▄▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;24;48;5;236m▄\x1b[38;5;25;48;5;240m▄\x1b[38;5;237;48;5;60m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;23;48;5;4m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;234;48;5;23m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;233m▄▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;19;48;5;26m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;4;48;5;18m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;60;48;5;18m▄\x1b[38;5;67;48;5;235m▄\x1b[38;5;241;48;5;0m▄\x1b[38;5;240;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;237;48;5;0m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;236;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;17;48;5;26m▄\x1b[38;5;27;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;32;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;236;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;232;48;5;24m▄\x1b[38;5;60;48;5;235m▄\x1b[38;5;24;48;5;233m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;19;48;5;232m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;25;48;5;232m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;26m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;25m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;0;48;5;45m▄\x1b[38;5;232;48;5;38m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;23;48;5;237m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;23;48;5;73m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;233;48;5;249m▄\x1b[38;5;245;48;5;145m▄\x1b[38;5;0;48;5;8m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;8m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;60;48;5;24m▄\x1b[38;5;235;48;5;17m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;60;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;235;48;5;24m▄\x1b[38;5;235;48;5;66m▄\x1b[38;5;0;48;5;245m▄\x1b[38;5;233;48;5;240m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;67m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;59;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;234;48;5;17m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;81m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[m +\x1b[49;38;5;0m▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\x1b[49;38;5;239m▀\x1b[49;38;5;0m▀\x1b[49;38;5;232m▀\x1b[49;38;5;24m▀\x1b[49;38;5;0m▀\x1b[49;38;5;235m▀\x1b[49;38;5;232m▀\x1b[49;38;5;0m▀▀▀▀\x1b[49;38;5;116m▀\x1b[49;38;5;0m▀▀▀▀▀▀▀▀▀\x1b[49;38;5;234m▀\x1b[49;38;5;0m▀\x1b[49;38;5;233m▀\x1b[49;38;5;60m▀\x1b[49;38;5;80m▀\x1b[49;38;5;17m▀\x1b[49;38;5;0m▀\x1b[49;38;5;23m▀\x1b[49;38;5;232m▀\x1b[49;38;5;0m▀▀\x1b[49;38;5;232m▀\x1b[49;38;5;0m▀▀▀\x1b[49;38;5;24m▀\x1b[49;38;5;23m▀\x1b[49;38;5;0m▀\x1b[49;38;5;234m▀\x1b[49;38;5;0m▀\x1b[49;38;5;233m▀\x1b[49;38;5;17m▀\x1b[49;38;5;0m▀\x1b[49;38;5;234m▀▀\x1b[49;38;5;23m▀\x1b[49;38;5;24m▀\x1b[49;38;5;23m▀\x1b[49;38;5;0m▀\x1b[49;38;5;235m▀\x1b[49;38;5;24m▀\x1b[49;38;5;232m▀\x1b[49;38;5;0m▀▀▀▀▀▀▀▀▀▀▀\x1b[m +`; + +const DARK_TOWER_HEADER = ` +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;0;48;5;245m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;144m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;166;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;222;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;19;48;5;4m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;87m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;243;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;232;48;5;235m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄\x1b[38;5;88;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;185m▄\x1b[48;5;0m \x1b[38;5;238;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;45;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;17;48;5;0m▄▄\x1b[38;5;18;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;238m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;124;48;5;0m▄\x1b[38;5;0;48;5;88m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;248;48;5;234m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;255;48;5;4m▄\x1b[38;5;18;48;5;4m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;172;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;52;48;5;160m▄\x1b[38;5;124;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;202;48;5;160m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;61;48;5;19m▄\x1b[38;5;4;48;5;18m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;19;48;5;18m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;18;48;5;12m▄\x1b[38;5;20;48;5;20m▄\x1b[38;5;17;48;5;20m▄\x1b[38;5;246;48;5;245m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;232;48;5;19m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[m +\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;94m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;58m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;0;48;5;124m▄\x1b[38;5;227;48;5;202m▄\x1b[38;5;9;48;5;9m▄\x1b[38;5;1;48;5;52m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;255;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;94;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;232m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;214;48;5;160m▄\x1b[38;5;11;48;5;202m▄\x1b[38;5;88;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;62;48;5;19m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;0;48;5;236m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;19;48;5;20m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;19;48;5;20m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;12;48;5;12m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;239;48;5;0m▄\x1b[38;5;245;48;5;246m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;19;48;5;19m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;243;48;5;0m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;23m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;88;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;160;48;5;0m▄\x1b[38;5;15;48;5;229m▄\x1b[38;5;229;48;5;220m▄\x1b[38;5;9;48;5;0m▄\x1b[38;5;124;48;5;52m▄\x1b[38;5;124;48;5;0m▄▄\x1b[38;5;88;48;5;0m▄\x1b[38;5;1;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;124;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;0;48;5;130m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;95;48;5;232m▄\x1b[38;5;124;48;5;17m▄\x1b[38;5;125;48;5;0m▄\x1b[38;5;160;48;5;0m▄\x1b[38;5;52;48;5;202m▄\x1b[38;5;9;48;5;202m▄\x1b[38;5;15;48;5;229m▄\x1b[38;5;202;48;5;202m▄\x1b[38;5;0;48;5;130m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;20;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;232;48;5;19m▄\x1b[38;5;4;48;5;18m▄\x1b[38;5;19;48;5;18m▄\x1b[38;5;20;48;5;4m▄\x1b[38;5;12;48;5;4m▄\x1b[38;5;247;48;5;0m▄\x1b[38;5;17;48;5;20m▄\x1b[38;5;0;48;5;59m▄\x1b[38;5;0;48;5;247m▄\x1b[38;5;59;48;5;243m▄\x1b[38;5;23;48;5;240m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;103;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;12;48;5;19m▄\x1b[38;5;236;48;5;102m▄\x1b[38;5;12;48;5;20m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;17;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;4;48;5;0m▄\x1b[38;5;17;48;5;17m▄▄\x1b[48;5;0m \x1b[38;5;17;48;5;18m▄\x1b[38;5;0;48;5;17m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;208m▄\x1b[38;5;1;48;5;220m▄\x1b[38;5;208;48;5;221m▄\x1b[38;5;214;48;5;229m▄\x1b[38;5;173;48;5;222m▄\x1b[38;5;0;48;5;215m▄\x1b[38;5;0;48;5;221m▄\x1b[38;5;233;48;5;230m▄\x1b[38;5;172;48;5;15m▄\x1b[38;5;221;48;5;15m▄\x1b[38;5;227;48;5;15m▄\x1b[38;5;220;48;5;9m▄\x1b[38;5;215;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;220;48;5;0m▄\x1b[38;5;227;48;5;124m▄\x1b[38;5;15;48;5;88m▄\x1b[38;5;15;48;5;1m▄\x1b[38;5;130;48;5;52m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;17;48;5;0m▄▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;208;48;5;0m▄\x1b[38;5;215;48;5;0m▄\x1b[38;5;214;48;5;0m▄\x1b[38;5;202;48;5;0m▄▄▄\x1b[38;5;215;48;5;0m▄\x1b[38;5;229;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;178m▄\x1b[38;5;166;48;5;208m▄\x1b[38;5;230;48;5;208m▄▄\x1b[38;5;214;48;5;172m▄\x1b[38;5;0;48;5;214m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;227;48;5;228m▄\x1b[38;5;221;48;5;229m▄\x1b[38;5;202;48;5;15m▄\x1b[38;5;202;48;5;229m▄\x1b[38;5;0;48;5;228m▄\x1b[38;5;0;48;5;230m▄\x1b[38;5;52;48;5;15m▄\x1b[38;5;0;48;5;15m▄\x1b[38;5;0;48;5;230m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;1;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;19m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;63;48;5;104m▄\x1b[38;5;20;48;5;20m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;12;48;5;12m▄\x1b[38;5;242;48;5;238m▄\x1b[38;5;233;48;5;254m▄\x1b[38;5;248;48;5;240m▄\x1b[38;5;238;48;5;102m▄\x1b[38;5;234;48;5;245m▄\x1b[38;5;233;48;5;239m▄\x1b[38;5;59;48;5;102m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;233;48;5;239m▄\x1b[38;5;27;48;5;20m▄\x1b[38;5;12;48;5;0m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;61;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;0;48;5;232m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;153m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;17;48;5;68m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;248;48;5;138m▄\x1b[38;5;248;48;5;242m▄\x1b[38;5;251;48;5;255m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;94m▄\x1b[38;5;215;48;5;15m▄\x1b[38;5;255;48;5;187m▄\x1b[38;5;243;48;5;222m▄\x1b[38;5;187;48;5;232m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;253;48;5;229m▄\x1b[38;5;130;48;5;215m▄\x1b[38;5;222;48;5;187m▄\x1b[38;5;15;48;5;15m▄\x1b[38;5;181;48;5;221m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;248;48;5;185m▄\x1b[38;5;250;48;5;222m▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;208;48;5;253m▄\x1b[38;5;255;48;5;15m▄\x1b[38;5;15;48;5;223m▄\x1b[38;5;172;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;255;48;5;15m▄\x1b[38;5;254;48;5;15m▄\x1b[38;5;208;48;5;214m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;187;48;5;0m▄\x1b[38;5;208;48;5;230m▄\x1b[38;5;0;48;5;137m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;19;48;5;20m▄▄\x1b[38;5;12;48;5;12m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;0;48;5;12m▄\x1b[38;5;233;48;5;236m▄\x1b[38;5;250;48;5;233m▄\x1b[38;5;243;48;5;251m▄\x1b[38;5;102;48;5;238m▄\x1b[38;5;247;48;5;232m▄\x1b[38;5;236;48;5;232m▄\x1b[38;5;242;48;5;238m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;239;48;5;0m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;27;48;5;12m▄\x1b[38;5;27;48;5;20m▄\x1b[38;5;26;48;5;19m▄\x1b[38;5;18;48;5;20m▄\x1b[38;5;18;48;5;19m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;3m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;0m▄▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;130;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;255;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;237m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;145;48;5;245m▄\x1b[38;5;242;48;5;241m▄\x1b[38;5;243;48;5;238m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;234;48;5;236m▄\x1b[38;5;249;48;5;248m▄\x1b[38;5;242;48;5;254m▄\x1b[38;5;246;48;5;248m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;228;48;5;0m▄\x1b[38;5;137;48;5;59m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;179m▄\x1b[38;5;239;48;5;241m▄\x1b[38;5;250;48;5;246m▄\x1b[38;5;221;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;238;48;5;58m▄\x1b[38;5;7;48;5;145m▄\x1b[38;5;252;48;5;247m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;230;48;5;0m▄\x1b[38;5;243;48;5;241m▄\x1b[38;5;250;48;5;240m▄\x1b[38;5;0;48;5;94m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;247;48;5;246m▄\x1b[38;5;243;48;5;241m▄\x1b[38;5;178;48;5;208m▄\x1b[38;5;7;48;5;0m▄\x1b[38;5;246;48;5;248m▄\x1b[38;5;130;48;5;239m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;173;48;5;137m▄\x1b[38;5;17;48;5;232m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;20;48;5;0m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;23;48;5;19m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;20;48;5;20m▄\x1b[38;5;27;48;5;0m▄\x1b[38;5;236;48;5;15m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;238;48;5;246m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;239;48;5;0m▄\x1b[38;5;233;48;5;236m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;24m▄\x1b[48;5;0m \x1b[38;5;27;48;5;33m▄\x1b[38;5;27;48;5;69m▄\x1b[38;5;18;48;5;12m▄\x1b[38;5;4;48;5;19m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;4;48;5;4m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;0;48;5;236m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;18;48;5;19m▄\x1b[38;5;19;48;5;19m▄▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;238;48;5;243m▄\x1b[38;5;236;48;5;242m▄\x1b[38;5;251;48;5;243m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;238;48;5;243m▄\x1b[38;5;238;48;5;250m▄\x1b[38;5;235;48;5;102m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;243;48;5;248m▄\x1b[38;5;254;48;5;234m▄\x1b[38;5;255;48;5;0m▄\x1b[38;5;15;48;5;0m▄\x1b[38;5;15;48;5;251m▄\x1b[38;5;248;48;5;249m▄\x1b[38;5;249;48;5;246m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;238;48;5;236m▄\x1b[38;5;236;48;5;243m▄\x1b[38;5;102;48;5;243m▄\x1b[38;5;232;48;5;247m▄\x1b[38;5;243;48;5;248m▄\x1b[38;5;237;48;5;8m▄\x1b[38;5;245;48;5;243m▄\x1b[38;5;15;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;246;48;5;241m▄\x1b[38;5;242;48;5;248m▄\x1b[38;5;243;48;5;59m▄\x1b[38;5;0;48;5;242m▄\x1b[38;5;59;48;5;249m▄\x1b[38;5;247;48;5;247m▄\x1b[38;5;221;48;5;232m▄\x1b[38;5;0;48;5;94m▄\x1b[38;5;236;48;5;232m▄\x1b[38;5;235;48;5;232m▄\x1b[38;5;232;48;5;4m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;18;48;5;19m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;20;48;5;17m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;17;48;5;17m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;19m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;20;48;5;20m▄\x1b[38;5;26;48;5;19m▄\x1b[38;5;12;48;5;20m▄\x1b[38;5;20;48;5;12m▄\x1b[38;5;33;48;5;12m▄\x1b[38;5;26;48;5;27m▄\x1b[38;5;0;48;5;241m▄\x1b[38;5;233;48;5;238m▄\x1b[38;5;102;48;5;246m▄\x1b[38;5;8;48;5;243m▄\x1b[38;5;0;48;5;59m▄\x1b[38;5;233;48;5;102m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;60;48;5;232m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;26;48;5;33m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;25;48;5;17m▄\x1b[38;5;17;48;5;12m▄\x1b[38;5;31;48;5;20m▄\x1b[38;5;17;48;5;20m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;61;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;17m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;18;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;247;48;5;248m▄\x1b[38;5;243;48;5;251m▄\x1b[38;5;246;48;5;240m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;247;48;5;187m▄\x1b[38;5;59;48;5;239m▄\x1b[38;5;239;48;5;238m▄\x1b[38;5;234;48;5;253m▄\x1b[48;5;0m \x1b[38;5;233;48;5;0m▄\x1b[38;5;240;48;5;242m▄\x1b[38;5;0;48;5;242m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;240;48;5;241m▄\x1b[38;5;8;48;5;145m▄\x1b[38;5;7;48;5;248m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;246;48;5;249m▄\x1b[38;5;8;48;5;242m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;250m▄\x1b[38;5;243;48;5;245m▄\x1b[38;5;243;48;5;8m▄\x1b[38;5;245;48;5;7m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;242;48;5;243m▄\x1b[38;5;237;48;5;248m▄\x1b[38;5;145;48;5;59m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;188m▄\x1b[38;5;249;48;5;242m▄\x1b[38;5;237;48;5;8m▄\x1b[38;5;8;48;5;208m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;236m▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;52;48;5;17m▄\x1b[38;5;232;48;5;17m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;232;48;5;24m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;25;48;5;69m▄\x1b[38;5;33;48;5;69m▄\x1b[38;5;27;48;5;0m▄\x1b[38;5;233;48;5;32m▄\x1b[38;5;240;48;5;7m▄\x1b[38;5;235;48;5;232m▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;220;48;5;130m▄\x1b[38;5;237;48;5;246m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;232;48;5;237m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;233;48;5;234m▄\x1b[38;5;26;48;5;27m▄\x1b[38;5;25;48;5;32m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;24m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\x1b[38;5;232;48;5;52m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;88;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;9;48;5;233m▄▄\x1b[38;5;124;48;5;232m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;230;48;5;0m▄\x1b[38;5;144;48;5;245m▄\x1b[38;5;239;48;5;250m▄\x1b[38;5;246;48;5;250m▄\x1b[38;5;237;48;5;0m▄\x1b[38;5;246;48;5;0m▄\x1b[38;5;242;48;5;0m▄\x1b[38;5;59;48;5;0m▄\x1b[38;5;251;48;5;254m▄\x1b[38;5;252;48;5;239m▄\x1b[38;5;0;48;5;8m▄\x1b[38;5;0;48;5;247m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;7;48;5;0m▄\x1b[38;5;239;48;5;252m▄\x1b[38;5;240;48;5;238m▄\x1b[38;5;252;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;243;48;5;247m▄\x1b[38;5;235;48;5;243m▄\x1b[38;5;240;48;5;238m▄\x1b[38;5;245;48;5;0m▄\x1b[38;5;238;48;5;0m▄\x1b[38;5;250;48;5;239m▄\x1b[38;5;247;48;5;240m▄\x1b[38;5;8;48;5;242m▄\x1b[38;5;243;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;249;48;5;240m▄\x1b[38;5;239;48;5;240m▄\x1b[38;5;238;48;5;248m▄\x1b[38;5;246;48;5;0m▄\x1b[38;5;253;48;5;0m▄\x1b[38;5;242;48;5;237m▄\x1b[38;5;248;48;5;236m▄\x1b[38;5;233;48;5;246m▄\x1b[38;5;249;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;8m▄\x1b[38;5;188;48;5;246m▄\x1b[38;5;255;48;5;180m▄\x1b[38;5;215;48;5;52m▄\x1b[38;5;208;48;5;233m▄\x1b[38;5;160;48;5;0m▄\x1b[38;5;160;48;5;232m▄\x1b[38;5;1;48;5;233m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;124;48;5;0m▄\x1b[38;5;52;48;5;233m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;88;48;5;67m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;235;48;5;232m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;236m▄\x1b[38;5;235;48;5;232m▄\x1b[38;5;24;48;5;4m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;17;48;5;12m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;30;48;5;20m▄\x1b[38;5;20;48;5;20m▄\x1b[38;5;246;48;5;246m▄\x1b[38;5;238;48;5;242m▄\x1b[38;5;59;48;5;239m▄\x1b[38;5;241;48;5;235m▄\x1b[38;5;246;48;5;178m▄\x1b[38;5;66;48;5;240m▄\x1b[38;5;232;48;5;232m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;184;48;5;220m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;12;48;5;20m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;25;48;5;20m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;1;48;5;0m▄\x1b[38;5;166;48;5;220m▄\x1b[38;5;216;48;5;220m▄\x1b[38;5;255;48;5;220m▄\x1b[38;5;181;48;5;214m▄\x1b[38;5;8;48;5;214m▄\x1b[38;5;101;48;5;214m▄\x1b[38;5;214;48;5;220m▄\x1b[38;5;208;48;5;220m▄\x1b[38;5;215;48;5;11m▄\x1b[38;5;222;48;5;227m▄\x1b[38;5;221;48;5;227m▄\x1b[38;5;215;48;5;11m▄\x1b[38;5;220;48;5;227m▄\x1b[38;5;208;48;5;227m▄\x1b[38;5;0;48;5;202m▄\x1b[38;5;0;48;5;53m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;52;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄▄\x1b[48;5;0m \x1b[38;5;232;48;5;1m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;237;48;5;0m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;52m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;0;48;5;11m▄\x1b[38;5;202;48;5;11m▄\x1b[38;5;208;48;5;227m▄▄\x1b[38;5;214;48;5;227m▄\x1b[38;5;172;48;5;11m▄\x1b[38;5;138;48;5;220m▄\x1b[38;5;215;48;5;11m▄\x1b[38;5;208;48;5;227m▄\x1b[38;5;202;48;5;227m▄\x1b[38;5;202;48;5;230m▄\x1b[38;5;208;48;5;131m▄\x1b[38;5;214;48;5;124m▄\x1b[38;5;255;48;5;160m▄\x1b[38;5;160;48;5;160m▄\x1b[38;5;124;48;5;52m▄\x1b[38;5;232;48;5;52m▄\x1b[38;5;233;48;5;18m▄\x1b[38;5;238;48;5;237m▄\x1b[38;5;94;48;5;241m▄\x1b[38;5;18;48;5;25m▄\x1b[38;5;20;48;5;67m▄\x1b[38;5;20;48;5;17m▄\x1b[38;5;240;48;5;17m▄\x1b[38;5;242;48;5;17m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;245;48;5;247m▄\x1b[38;5;66;48;5;247m▄\x1b[38;5;66;48;5;245m▄\x1b[38;5;66;48;5;240m▄\x1b[38;5;235;48;5;102m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;60;48;5;233m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;237;48;5;235m▄\x1b[38;5;19;48;5;26m▄\x1b[38;5;27;48;5;17m▄\x1b[38;5;81;48;5;24m▄\x1b[38;5;74;48;5;25m▄\x1b[38;5;31;48;5;32m▄\x1b[38;5;0;48;5;32m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;60m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;62m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;12m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;245;48;5;188m▄\x1b[38;5;0;48;5;241m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;101;48;5;238m▄\x1b[38;5;144;48;5;179m▄\x1b[38;5;180;48;5;179m▄\x1b[38;5;180;48;5;173m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;239m▄\x1b[38;5;179;48;5;208m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;208;48;5;0m▄\x1b[38;5;202;48;5;0m▄\x1b[38;5;208;48;5;11m▄▄\x1b[38;5;173;48;5;220m▄\x1b[38;5;209;48;5;11m▄\x1b[38;5;208;48;5;227m▄\x1b[38;5;208;48;5;11m▄\x1b[38;5;208;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;234;48;5;214m▄\x1b[38;5;202;48;5;214m▄\x1b[38;5;221;48;5;220m▄\x1b[38;5;222;48;5;11m▄\x1b[38;5;131;48;5;220m▄\x1b[38;5;0;48;5;1m▄\x1b[38;5;0;48;5;124m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;130;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;215;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;52m▄\x1b[38;5;130;48;5;11m▄\x1b[38;5;214;48;5;11m▄\x1b[38;5;166;48;5;11m▄\x1b[38;5;0;48;5;214m▄\x1b[38;5;0;48;5;52m▄\x1b[38;5;239;48;5;221m▄\x1b[38;5;222;48;5;227m▄\x1b[38;5;222;48;5;11m▄\x1b[38;5;227;48;5;220m▄\x1b[38;5;242;48;5;214m▄\x1b[38;5;247;48;5;208m▄\x1b[38;5;245;48;5;214m▄\x1b[38;5;101;48;5;214m▄\x1b[38;5;179;48;5;208m▄\x1b[38;5;208;48;5;208m▄\x1b[38;5;180;48;5;227m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;144;48;5;180m▄\x1b[38;5;180;48;5;223m▄\x1b[38;5;187;48;5;230m▄\x1b[38;5;188;48;5;230m▄\x1b[38;5;222;48;5;143m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;130m▄\x1b[38;5;234;48;5;179m▄\x1b[38;5;255;48;5;229m▄\x1b[38;5;230;48;5;220m▄\x1b[38;5;255;48;5;214m▄▄\x1b[38;5;94;48;5;0m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;236;48;5;17m▄\x1b[38;5;18;48;5;20m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;18;48;5;20m▄\x1b[38;5;33;48;5;20m▄\x1b[38;5;39;48;5;0m▄\x1b[38;5;233;48;5;248m▄\x1b[38;5;59;48;5;232m▄\x1b[38;5;245;48;5;233m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;66;48;5;239m▄\x1b[38;5;11;48;5;0m▄\x1b[38;5;237;48;5;232m▄\x1b[38;5;236;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;220;48;5;220m▄\x1b[48;5;0m \x1b[38;5;0;48;5;232m▄\x1b[38;5;18;48;5;39m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;26;48;5;25m▄\x1b[38;5;26;48;5;4m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;0;48;5;32m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;237m▄\x1b[38;5;0;48;5;0m▄▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄\x1b[38;5;0;48;5;250m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;255;48;5;223m▄\x1b[38;5;248;48;5;246m▄\x1b[38;5;240;48;5;248m▄\x1b[38;5;247;48;5;246m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;233;48;5;233m▄\x1b[48;5;0m \x1b[38;5;27;48;5;186m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;214;48;5;0m▄\x1b[38;5;248;48;5;166m▄\x1b[38;5;246;48;5;222m▄\x1b[38;5;249;48;5;187m▄\x1b[38;5;102;48;5;144m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;101m▄\x1b[38;5;251;48;5;186m▄\x1b[38;5;7;48;5;221m▄\x1b[38;5;7;48;5;208m▄\x1b[38;5;220;48;5;0m▄\x1b[48;5;0m \x1b[38;5;101;48;5;187m▄\x1b[38;5;247;48;5;249m▄\x1b[38;5;246;48;5;7m▄\x1b[38;5;254;48;5;221m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;94;48;5;233m▄\x1b[38;5;232;48;5;52m▄\x1b[38;5;172;48;5;0m▄\x1b[38;5;251;48;5;253m▄\x1b[38;5;215;48;5;214m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;180;48;5;186m▄\x1b[38;5;252;48;5;180m▄\x1b[38;5;235;48;5;101m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;252;48;5;187m▄\x1b[38;5;250;48;5;187m▄\x1b[38;5;245;48;5;7m▄\x1b[38;5;186;48;5;143m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;251m▄\x1b[38;5;243;48;5;179m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;243;48;5;247m▄\x1b[38;5;246;48;5;249m▄\x1b[38;5;8;48;5;241m▄\x1b[38;5;59;48;5;248m▄\x1b[38;5;187;48;5;223m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;137;48;5;137m▄\x1b[38;5;7;48;5;252m▄\x1b[38;5;251;48;5;250m▄\x1b[38;5;238;48;5;8m▄\x1b[38;5;144;48;5;179m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;18;48;5;233m▄\x1b[38;5;20;48;5;17m▄\x1b[38;5;27;48;5;25m▄\x1b[38;5;12;48;5;20m▄\x1b[38;5;32;48;5;17m▄\x1b[38;5;20;48;5;18m▄\x1b[38;5;102;48;5;246m▄\x1b[38;5;109;48;5;247m▄\x1b[38;5;235;48;5;59m▄\x1b[38;5;66;48;5;60m▄\x1b[38;5;59;48;5;234m▄\x1b[38;5;66;48;5;233m▄\x1b[38;5;240;48;5;245m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;233;48;5;0m▄\x1b[48;5;0m \x1b[38;5;60;48;5;0m▄\x1b[38;5;12;48;5;20m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;25;48;5;233m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;239;48;5;24m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;18;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;20;48;5;17m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;254;48;5;254m▄\x1b[38;5;249;48;5;243m▄\x1b[38;5;102;48;5;247m▄\x1b[38;5;240;48;5;102m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;250;48;5;247m▄\x1b[38;5;241;48;5;7m▄\x1b[38;5;248;48;5;253m▄\x1b[38;5;255;48;5;247m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;252;48;5;254m▄\x1b[38;5;249;48;5;251m▄\x1b[38;5;249;48;5;188m▄\x1b[38;5;249;48;5;145m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;145;48;5;247m▄\x1b[38;5;237;48;5;247m▄\x1b[38;5;188;48;5;250m▄\x1b[38;5;228;48;5;179m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;1;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;188;48;5;188m▄\x1b[38;5;250;48;5;8m▄\x1b[38;5;145;48;5;247m▄\x1b[38;5;223;48;5;208m▄\x1b[48;5;0m \x1b[38;5;0;48;5;52m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;240;48;5;245m▄\x1b[38;5;253;48;5;253m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;188;48;5;254m▄\x1b[38;5;15;48;5;251m▄\x1b[38;5;241;48;5;255m▄\x1b[38;5;241;48;5;186m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;242;48;5;248m▄\x1b[38;5;245;48;5;8m▄\x1b[38;5;247;48;5;245m▄\x1b[38;5;241;48;5;246m▄\x1b[38;5;247;48;5;187m▄\x1b[48;5;0m \x1b[38;5;0;48;5;19m▄\x1b[38;5;18;48;5;0m▄\x1b[48;5;0m \x1b[38;5;232;48;5;0m▄\x1b[38;5;249;48;5;254m▄\x1b[38;5;7;48;5;247m▄\x1b[38;5;145;48;5;247m▄\x1b[38;5;247;48;5;236m▄\x1b[38;5;0;48;5;251m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;4;48;5;18m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;20;48;5;20m▄\x1b[38;5;20;48;5;12m▄\x1b[38;5;26;48;5;12m▄\x1b[38;5;17;48;5;27m▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;239;48;5;246m▄\x1b[38;5;241;48;5;232m▄\x1b[38;5;233;48;5;67m▄\x1b[38;5;66;48;5;66m▄\x1b[38;5;59;48;5;66m▄\x1b[38;5;242;48;5;245m▄\x1b[38;5;60;48;5;243m▄\x1b[38;5;23;48;5;60m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;23;48;5;233m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;12;48;5;27m▄\x1b[38;5;26;48;5;27m▄\x1b[38;5;4;48;5;26m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;237m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;25;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;4m▄▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;15;48;5;145m▄\x1b[38;5;241;48;5;241m▄\x1b[38;5;240;48;5;246m▄\x1b[38;5;188;48;5;251m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;239;48;5;188m▄\x1b[38;5;241;48;5;245m▄\x1b[38;5;8;48;5;242m▄\x1b[38;5;238;48;5;243m▄\x1b[38;5;237;48;5;238m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;7;48;5;249m▄\x1b[38;5;241;48;5;239m▄\x1b[38;5;239;48;5;245m▄\x1b[38;5;247;48;5;8m▄\x1b[38;5;250;48;5;240m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;251m▄\x1b[38;5;145;48;5;243m▄\x1b[38;5;246;48;5;102m▄\x1b[38;5;145;48;5;240m▄\x1b[48;5;0m \x1b[38;5;0;48;5;52m▄\x1b[38;5;248;48;5;240m▄\x1b[38;5;242;48;5;239m▄\x1b[38;5;238;48;5;245m▄\x1b[38;5;241;48;5;246m▄\x1b[38;5;247;48;5;243m▄\x1b[38;5;8;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;249;48;5;250m▄\x1b[38;5;248;48;5;243m▄\x1b[38;5;0;48;5;248m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;255;48;5;239m▄\x1b[38;5;243;48;5;59m▄\x1b[38;5;246;48;5;239m▄\x1b[38;5;242;48;5;241m▄\x1b[38;5;245;48;5;186m▄\x1b[38;5;243;48;5;137m▄\x1b[38;5;239;48;5;229m▄\x1b[38;5;243;48;5;193m▄\x1b[38;5;0;48;5;187m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;255;48;5;248m▄\x1b[38;5;239;48;5;239m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;242;48;5;237m▄\x1b[38;5;145;48;5;102m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;252;48;5;0m▄\x1b[38;5;251;48;5;0m▄\x1b[38;5;245;48;5;0m▄\x1b[38;5;250;48;5;8m▄\x1b[38;5;233;48;5;240m▄\x1b[38;5;0;48;5;245m▄\x1b[38;5;0;48;5;254m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;31;48;5;232m▄\x1b[38;5;110;48;5;0m▄\x1b[38;5;60;48;5;17m▄\x1b[38;5;232;48;5;18m▄\x1b[38;5;66;48;5;0m▄\x1b[38;5;240;48;5;109m▄\x1b[38;5;59;48;5;109m▄\x1b[38;5;60;48;5;66m▄\x1b[38;5;239;48;5;240m▄\x1b[38;5;60;48;5;241m▄\x1b[38;5;233;48;5;66m▄\x1b[38;5;0;48;5;59m▄\x1b[38;5;0;48;5;66m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;238m▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;232;48;5;25m▄\x1b[38;5;220;48;5;25m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;32m▄\x1b[38;5;233;48;5;24m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;23;48;5;31m▄\x1b[38;5;31;48;5;25m▄\x1b[38;5;232;48;5;25m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;23;48;5;0m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;67;48;5;0m▄\x1b[38;5;31;48;5;23m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;188;48;5;153m▄\x1b[38;5;61;48;5;240m▄\x1b[38;5;61;48;5;237m▄\x1b[38;5;238;48;5;239m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;248;48;5;145m▄\x1b[38;5;25;48;5;238m▄\x1b[38;5;60;48;5;236m▄\x1b[38;5;25;48;5;60m▄\x1b[38;5;61;48;5;239m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;247;48;5;250m▄\x1b[38;5;62;48;5;59m▄\x1b[38;5;101;48;5;240m▄\x1b[38;5;237;48;5;242m▄\x1b[38;5;68;48;5;145m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;249;48;5;59m▄\x1b[38;5;24;48;5;103m▄\x1b[38;5;61;48;5;248m▄\x1b[38;5;103;48;5;246m▄\x1b[38;5;187;48;5;0m▄\x1b[38;5;103;48;5;243m▄\x1b[38;5;0;48;5;245m▄\x1b[38;5;23;48;5;247m▄\x1b[38;5;237;48;5;237m▄\x1b[38;5;236;48;5;245m▄\x1b[38;5;249;48;5;59m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;103;48;5;239m▄\x1b[38;5;62;48;5;248m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;237;48;5;249m▄\x1b[38;5;61;48;5;239m▄\x1b[38;5;237;48;5;246m▄\x1b[38;5;7;48;5;248m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;247m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;61;48;5;247m▄\x1b[38;5;60;48;5;234m▄\x1b[38;5;18;48;5;238m▄\x1b[38;5;234;48;5;243m▄\x1b[38;5;250;48;5;250m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;145;48;5;243m▄\x1b[38;5;60;48;5;239m▄\x1b[38;5;60;48;5;8m▄\x1b[38;5;60;48;5;243m▄\x1b[38;5;18;48;5;251m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;24;48;5;23m▄\x1b[38;5;24;48;5;235m▄\x1b[38;5;31;48;5;25m▄\x1b[38;5;0;48;5;109m▄\x1b[38;5;24;48;5;232m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;240;48;5;66m▄\x1b[38;5;235;48;5;60m▄\x1b[38;5;235;48;5;233m▄\x1b[38;5;103;48;5;232m▄\x1b[38;5;67;48;5;237m▄\x1b[38;5;60;48;5;237m▄\x1b[38;5;67;48;5;66m▄\x1b[38;5;67;48;5;238m▄\x1b[38;5;23;48;5;59m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;23;48;5;232m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;25;48;5;24m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;234;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;234m▄\x1b[m +\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;66m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;25;48;5;234m▄\x1b[38;5;235;48;5;67m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;237;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;195;48;5;254m▄\x1b[38;5;60;48;5;24m▄\x1b[38;5;18;48;5;68m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;20;48;5;18m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;237;48;5;26m▄\x1b[38;5;60;48;5;62m▄\x1b[38;5;239;48;5;67m▄\x1b[38;5;236;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;75;48;5;237m▄\x1b[38;5;236;48;5;19m▄\x1b[38;5;103;48;5;18m▄\x1b[38;5;233;48;5;103m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;109m▄\x1b[38;5;243;48;5;69m▄\x1b[38;5;250;48;5;249m▄\x1b[38;5;240;48;5;238m▄\x1b[38;5;246;48;5;249m▄\x1b[38;5;32;48;5;68m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;75;48;5;7m▄\x1b[38;5;249;48;5;248m▄\x1b[38;5;239;48;5;238m▄\x1b[38;5;237;48;5;253m▄\x1b[38;5;8;48;5;8m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;60;48;5;4m▄\x1b[38;5;237;48;5;60m▄\x1b[38;5;236;48;5;24m▄\x1b[38;5;7;48;5;250m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;20;48;5;17m▄\x1b[38;5;110;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;60;48;5;103m▄\x1b[38;5;101;48;5;60m▄\x1b[38;5;237;48;5;63m▄\x1b[38;5;239;48;5;236m▄\x1b[38;5;251;48;5;7m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;59;48;5;8m▄\x1b[38;5;237;48;5;60m▄\x1b[38;5;60;48;5;8m▄\x1b[38;5;237;48;5;240m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;66;48;5;0m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;31;48;5;0m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;109;48;5;241m▄\x1b[38;5;67;48;5;66m▄\x1b[38;5;234;48;5;103m▄\x1b[38;5;60;48;5;66m▄\x1b[38;5;66;48;5;66m▄\x1b[38;5;66;48;5;60m▄\x1b[38;5;11;48;5;0m▄\x1b[38;5;60;48;5;109m▄\x1b[38;5;66;48;5;67m▄\x1b[38;5;17;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;220;48;5;220m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;0;48;5;38m▄\x1b[38;5;67;48;5;233m▄\x1b[38;5;59;48;5;243m▄\x1b[38;5;24;48;5;241m▄\x1b[38;5;25;48;5;109m▄\x1b[38;5;233;48;5;67m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;25;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;60m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;66m▄\x1b[38;5;4;48;5;4m▄\x1b[38;5;195;48;5;159m▄\x1b[38;5;75;48;5;62m▄\x1b[38;5;39;48;5;68m▄\x1b[38;5;69;48;5;19m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;19;48;5;18m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;0;48;5;81m▄\x1b[38;5;25;48;5;17m▄\x1b[38;5;38;48;5;24m▄\x1b[38;5;81;48;5;74m▄\x1b[38;5;81;48;5;87m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;25;48;5;18m▄\x1b[38;5;31;48;5;81m▄\x1b[38;5;38;48;5;24m▄\x1b[38;5;25;48;5;17m▄\x1b[38;5;17;48;5;80m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;159;48;5;87m▄\x1b[38;5;81;48;5;81m▄\x1b[38;5;45;48;5;38m▄\x1b[38;5;81;48;5;31m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;17m \x1b[38;5;0;48;5;0m▄\x1b[38;5;123;48;5;45m▄\x1b[38;5;31;48;5;31m▄\x1b[38;5;31;48;5;24m▄\x1b[38;5;81;48;5;38m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;18m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;19;48;5;17m▄▄\x1b[38;5;38;48;5;45m▄\x1b[38;5;81;48;5;32m▄\x1b[38;5;38;48;5;38m▄\x1b[38;5;81;48;5;38m▄\x1b[38;5;4;48;5;17m▄▄\x1b[38;5;20;48;5;18m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;17;48;5;19m▄\x1b[38;5;38;48;5;0m▄\x1b[38;5;44;48;5;37m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;26;48;5;25m▄\x1b[38;5;25;48;5;17m▄\x1b[38;5;18;48;5;25m▄\x1b[38;5;26;48;5;25m▄\x1b[38;5;159;48;5;81m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;87;48;5;67m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;25;48;5;235m▄\x1b[38;5;69;48;5;4m▄\x1b[38;5;25;48;5;75m▄\x1b[38;5;38;48;5;0m▄\x1b[38;5;4;48;5;4m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;237;48;5;236m▄\x1b[38;5;66;48;5;67m▄\x1b[38;5;136;48;5;166m▄\x1b[38;5;60;48;5;240m▄\x1b[38;5;66;48;5;66m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;52;48;5;208m▄\x1b[38;5;66;48;5;60m▄\x1b[38;5;60;48;5;66m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;23;48;5;236m▄\x1b[38;5;17;48;5;184m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;232;48;5;17m▄\x1b[38;5;25;48;5;25m▄\x1b[38;5;23;48;5;25m▄\x1b[38;5;247;48;5;17m▄\x1b[38;5;232;48;5;25m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;25;48;5;18m▄\x1b[38;5;87;48;5;159m▄\x1b[38;5;14;48;5;39m▄\x1b[38;5;39;48;5;39m▄▄\x1b[38;5;159;48;5;31m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;237;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;87m▄\x1b[38;5;0;48;5;81m▄\x1b[38;5;0;48;5;45m▄\x1b[38;5;33;48;5;45m▄\x1b[38;5;75;48;5;23m▄\x1b[38;5;74;48;5;45m▄\x1b[38;5;116;48;5;14m▄\x1b[38;5;0;48;5;87m▄\x1b[38;5;0;48;5;45m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;20;48;5;18m▄\x1b[38;5;0;48;5;110m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;18;48;5;116m▄\x1b[38;5;123;48;5;45m▄\x1b[38;5;14;48;5;45m▄\x1b[38;5;0;48;5;123m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;18m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;20;48;5;18m▄\x1b[38;5;0;48;5;159m▄\x1b[38;5;87;48;5;45m▄\x1b[38;5;87;48;5;38m▄\x1b[38;5;19;48;5;24m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;195;48;5;19m▄\x1b[38;5;15;48;5;159m▄\x1b[38;5;15;48;5;81m▄\x1b[38;5;15;48;5;14m▄\x1b[38;5;15;48;5;39m▄\x1b[38;5;15;48;5;45m▄\x1b[38;5;15;48;5;38m▄\x1b[38;5;15;48;5;25m▄\x1b[38;5;15;48;5;80m▄\x1b[38;5;195;48;5;25m▄\x1b[38;5;15;48;5;39m▄\x1b[38;5;15;48;5;14m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;19;48;5;18m▄\x1b[38;5;233;48;5;232m▄\x1b[38;5;25;48;5;26m▄\x1b[38;5;26;48;5;26m▄\x1b[38;5;32;48;5;26m▄\x1b[38;5;45;48;5;39m▄\x1b[38;5;159;48;5;195m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;20;48;5;0m▄\x1b[38;5;4;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;195;48;5;32m▄\x1b[38;5;39;48;5;32m▄\x1b[38;5;39;48;5;33m▄\x1b[38;5;39;48;5;39m▄\x1b[38;5;81;48;5;81m▄\x1b[38;5;195;48;5;17m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;18;48;5;4m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;31m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;24;48;5;23m▄\x1b[38;5;233;48;5;23m▄\x1b[38;5;60;48;5;237m▄\x1b[38;5;61;48;5;60m▄\x1b[38;5;60;48;5;239m▄\x1b[38;5;24;48;5;239m▄\x1b[38;5;60;48;5;233m▄\x1b[38;5;60;48;5;59m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;67;48;5;236m▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;236;48;5;23m▄\x1b[38;5;233;48;5;17m▄\x1b[38;5;36;48;5;234m▄\x1b[38;5;24;48;5;234m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;23m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;25;48;5;6m▄\x1b[38;5;12;48;5;234m▄\x1b[38;5;27;48;5;24m▄\x1b[38;5;14;48;5;25m▄\x1b[38;5;87;48;5;33m▄\x1b[38;5;195;48;5;87m▄\x1b[38;5;15;48;5;87m▄\x1b[38;5;15;48;5;14m▄\x1b[38;5;39;48;5;14m▄\x1b[38;5;4;48;5;45m▄\x1b[38;5;232;48;5;45m▄\x1b[38;5;232;48;5;110m▄\x1b[38;5;232;48;5;17m▄\x1b[38;5;232;48;5;20m▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;19m▄▄\x1b[38;5;0;48;5;26m▄\x1b[38;5;0;48;5;27m▄▄▄\x1b[38;5;0;48;5;26m▄▄\x1b[38;5;32;48;5;27m▄\x1b[38;5;27;48;5;32m▄\x1b[38;5;19;48;5;32m▄\x1b[38;5;0;48;5;32m▄\x1b[38;5;232;48;5;33m▄\x1b[38;5;26;48;5;45m▄\x1b[38;5;27;48;5;45m▄\x1b[38;5;233;48;5;14m▄\x1b[38;5;0;48;5;87m▄\x1b[38;5;32;48;5;19m▄\x1b[38;5;81;48;5;15m▄\x1b[38;5;15;48;5;123m▄\x1b[38;5;159;48;5;17m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;87;48;5;26m▄▄\x1b[38;5;33;48;5;26m▄\x1b[38;5;27;48;5;17m▄\x1b[38;5;15;48;5;87m▄\x1b[38;5;39;48;5;195m▄\x1b[38;5;45;48;5;19m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;0;48;5;45m▄\x1b[38;5;32;48;5;39m▄\x1b[38;5;33;48;5;26m▄\x1b[38;5;23;48;5;27m▄\x1b[38;5;23;48;5;33m▄\x1b[38;5;26;48;5;27m▄\x1b[38;5;26;48;5;26m▄\x1b[38;5;26;48;5;17m▄\x1b[38;5;0;48;5;17m▄▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;24;48;5;18m▄\x1b[38;5;23;48;5;19m▄\x1b[38;5;24;48;5;19m▄\x1b[38;5;31;48;5;17m▄\x1b[38;5;66;48;5;0m▄\x1b[38;5;60;48;5;123m▄\x1b[38;5;60;48;5;39m▄\x1b[38;5;60;48;5;25m▄\x1b[38;5;61;48;5;32m▄\x1b[38;5;195;48;5;45m▄\x1b[38;5;15;48;5;195m▄\x1b[38;5;195;48;5;87m▄\x1b[38;5;159;48;5;26m▄\x1b[38;5;26;48;5;19m▄\x1b[38;5;20;48;5;18m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;27;48;5;87m▄\x1b[38;5;123;48;5;45m▄\x1b[38;5;14;48;5;14m▄▄▄\x1b[38;5;159;48;5;26m▄\x1b[38;5;26;48;5;18m▄\x1b[38;5;26;48;5;17m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;32;48;5;25m▄\x1b[38;5;24;48;5;25m▄\x1b[38;5;25;48;5;24m▄\x1b[38;5;67;48;5;234m▄\x1b[38;5;235;48;5;60m▄\x1b[38;5;60;48;5;60m▄▄\x1b[38;5;66;48;5;60m▄\x1b[38;5;67;48;5;0m▄\x1b[38;5;60;48;5;60m▄\x1b[38;5;24;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;24;48;5;214m▄\x1b[38;5;23;48;5;24m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;19;48;5;234m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;240m▄\x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;241;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;233;48;5;18m▄\x1b[38;5;234;48;5;25m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;4;48;5;25m▄\x1b[38;5;20;48;5;159m▄\x1b[38;5;17;48;5;195m▄\x1b[38;5;25;48;5;25m▄\x1b[38;5;19;48;5;26m▄▄\x1b[38;5;20;48;5;27m▄\x1b[38;5;27;48;5;27m▄\x1b[38;5;19;48;5;25m▄\x1b[38;5;18;48;5;18m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;17;48;5;232m▄\x1b[38;5;24;48;5;18m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[38;5;4;48;5;4m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;0;48;5;19m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;18;48;5;26m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;27;48;5;81m▄\x1b[38;5;0;48;5;32m▄\x1b[38;5;19;48;5;25m▄\x1b[38;5;19;48;5;15m▄\x1b[38;5;26;48;5;15m▄\x1b[38;5;19;48;5;33m▄\x1b[38;5;17;48;5;33m▄\x1b[38;5;0;48;5;39m▄\x1b[38;5;27;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;20;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;235;48;5;232m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;234;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;4;48;5;24m▄\x1b[38;5;25;48;5;17m▄▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;45;48;5;44m▄\x1b[38;5;24;48;5;25m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;25m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;23;48;5;26m▄\x1b[38;5;17;48;5;27m▄\x1b[38;5;17;48;5;159m▄\x1b[38;5;4;48;5;159m▄\x1b[38;5;17;48;5;15m▄\x1b[38;5;25;48;5;123m▄\x1b[38;5;25;48;5;87m▄\x1b[38;5;17;48;5;159m▄\x1b[38;5;87;48;5;26m▄\x1b[38;5;87;48;5;4m▄\x1b[38;5;25;48;5;26m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;24;48;5;4m▄\x1b[38;5;24;48;5;236m▄\x1b[38;5;24;48;5;235m▄\x1b[38;5;24;48;5;232m▄\x1b[38;5;234;48;5;235m▄\x1b[38;5;234;48;5;238m▄\x1b[38;5;23;48;5;235m▄\x1b[38;5;236;48;5;237m▄\x1b[38;5;24;48;5;233m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;235;48;5;232m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;0;48;5;235m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;4;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;17m▄▄▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;17;48;5;4m▄\x1b[38;5;20;48;5;19m▄\x1b[38;5;17;48;5;12m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;240;48;5;232m▄\x1b[38;5;245;48;5;236m▄\x1b[38;5;233;48;5;239m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;26m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;19;48;5;19m▄\x1b[38;5;0;48;5;20m▄\x1b[38;5;27;48;5;0m▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;0;48;5;18m▄\x1b[38;5;19;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;26m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;232;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;236;48;5;235m▄\x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;18;48;5;17m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;4;48;5;87m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;232;48;5;26m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;25;48;5;14m▄\x1b[38;5;24;48;5;24m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;23;48;5;25m▄\x1b[38;5;0;48;5;237m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;236;48;5;23m▄\x1b[38;5;23;48;5;23m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;23;48;5;24m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[m +\x1b[48;5;0m \x1b[38;5;246;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;12m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;18m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;17;48;5;237m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;23;48;5;232m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;0m▄\x1b[38;5;0;48;5;247m▄\x1b[38;5;67;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;238m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;23;48;5;233m▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;23;48;5;0m▄\x1b[38;5;234;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;19;48;5;0m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;0;48;5;27m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄▄\x1b[38;5;0;48;5;241m▄\x1b[38;5;8;48;5;235m▄\x1b[38;5;232;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;103m▄\x1b[38;5;24;48;5;241m▄\x1b[38;5;0;48;5;236m▄\x1b[38;5;235;48;5;0m▄\x1b[38;5;0;48;5;237m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;62m▄\x1b[38;5;18;48;5;0m▄\x1b[38;5;232;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;18m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;17;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;4m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄▄▄▄\x1b[38;5;232;48;5;234m▄\x1b[38;5;235;48;5;23m▄\x1b[38;5;233;48;5;24m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;235m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;232;48;5;232m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;235;48;5;23m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;239;48;5;17m▄\x1b[38;5;232;48;5;24m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;233;48;5;0m▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;24;48;5;17m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;81;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;0;48;5;0m▄\x1b[48;5;0m \x1b[m +\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄▄▄▄▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;234m▄\x1b[48;5;0m \x1b[38;5;0;48;5;233m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;17;48;5;24m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;0;48;5;32m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;236;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;60;48;5;0m▄\x1b[38;5;236;48;5;232m▄\x1b[38;5;242;48;5;238m▄\x1b[38;5;234;48;5;237m▄\x1b[38;5;237;48;5;0m▄\x1b[38;5;235;48;5;233m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;233m▄\x1b[38;5;0;48;5;191m▄\x1b[38;5;238;48;5;0m▄\x1b[38;5;237;48;5;232m▄\x1b[38;5;0;48;5;60m▄\x1b[38;5;232;48;5;60m▄\x1b[38;5;235;48;5;233m▄\x1b[38;5;17;48;5;233m▄\x1b[38;5;0;48;5;238m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;146;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄▄▄\x1b[38;5;24;48;5;0m▄\x1b[38;5;0;48;5;25m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;236;48;5;0m▄\x1b[38;5;0;48;5;32m▄\x1b[38;5;0;48;5;239m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;234m▄\x1b[38;5;232;48;5;246m▄\x1b[38;5;74;48;5;246m▄\x1b[38;5;235;48;5;234m▄\x1b[38;5;236;48;5;236m▄\x1b[38;5;233;48;5;24m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;17;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;26m▄\x1b[38;5;232;48;5;24m▄\x1b[38;5;17;48;5;0m▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;17m▄▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;31;48;5;25m▄\x1b[38;5;25;48;5;0m▄\x1b[38;5;24;48;5;232m▄\x1b[38;5;4;48;5;0m▄\x1b[38;5;24;48;5;26m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;233;48;5;25m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;23;48;5;17m▄\x1b[38;5;0;48;5;61m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;233;48;5;233m▄\x1b[38;5;60;48;5;233m▄\x1b[38;5;232;48;5;235m▄\x1b[38;5;25;48;5;24m▄\x1b[38;5;67;48;5;23m▄\x1b[38;5;234;48;5;23m▄\x1b[38;5;23;48;5;23m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;239;48;5;239m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;232m▄\x1b[38;5;109;48;5;236m▄\x1b[38;5;0;48;5;17m▄\x1b[38;5;0;48;5;23m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[38;5;233;48;5;23m▄\x1b[38;5;0;48;5;0m▄\x1b[38;5;0;48;5;24m▄\x1b[38;5;232;48;5;0m▄\x1b[38;5;0;48;5;0m▄▄▄\x1b[48;5;0m \x1b[38;5;0;48;5;0m▄▄▄\x1b[m +\x1b[49;38;5;0m▀▀▀▀▀▀▀▀▀▀\x1b[49;38;5;242m▀\x1b[49;38;5;102m▀\x1b[49;38;5;0m▀▀▀▀▀▀▀▀▀▀▀▀\x1b[49;38;5;239m▀\x1b[49;38;5;241m▀\x1b[49;38;5;0m▀▀▀▀▀▀\x1b[49;38;5;4m▀\x1b[49;38;5;17m▀\x1b[49;38;5;0m▀▀▀▀▀\x1b[49;38;5;18m▀\x1b[49;38;5;0m▀\x1b[49;38;5;24m▀\x1b[49;38;5;0m▀▀▀▀▀▀▀▀▀▀▀▀▀▀\x1b[49;38;5;241m▀\x1b[49;38;5;0m▀\x1b[49;38;5;232m▀\x1b[49;38;5;234m▀\x1b[49;38;5;233m▀\x1b[49;38;5;234m▀\x1b[49;38;5;0m▀\x1b[49;38;5;18m▀\x1b[49;38;5;19m▀\x1b[49;38;5;233m▀\x1b[49;38;5;232m▀\x1b[49;38;5;23m▀\x1b[49;38;5;74m▀\x1b[49;38;5;0m▀▀▀\x1b[49;38;5;233m▀\x1b[49;38;5;0m▀▀\x1b[49;38;5;17m▀\x1b[49;38;5;0m▀▀\x1b[49;38;5;233m▀\x1b[49;38;5;0m▀\x1b[49;38;5;237m▀\x1b[49;38;5;0m▀▀▀▀\x1b[49;38;5;235m▀\x1b[49;38;5;0m▀▀▀▀▀▀\x1b[49;38;5;25m▀\x1b[49;38;5;24m▀\x1b[49;38;5;234m▀\x1b[49;38;5;23m▀\x1b[49;38;5;232m▀\x1b[49;38;5;235m▀\x1b[49;38;5;0m▀\x1b[49;38;5;60m▀\x1b[49;38;5;237m▀\x1b[49;38;5;243m▀\x1b[49;38;5;239m▀\x1b[49;38;5;0m▀\x1b[49;38;5;233m▀\x1b[49;38;5;0m▀▀▀\x1b[49;38;5;23m▀\x1b[49;38;5;0m▀▀▀▀▀▀▀▀▀▀▀\x1b[m + +`; + +const LIGHTHOUSE_HEADER = ` + . + /|\\ + / | \\ + / | \\ + / | \\ + / | \\ + / .--+--. \\ + /__/ | \\__\\ + [__] | [__] + | + ~~~~~~~|~~~~~~~ +`; diff --git a/assets/js/games/games/system-shutdown-1999/chapter-1.js b/assets/js/games/games/system-shutdown-1999/chapter-1.js new file mode 100644 index 0000000..ac35277 --- /dev/null +++ b/assets/js/games/games/system-shutdown-1999/chapter-1.js @@ -0,0 +1,561 @@ +// System Shutdown: 1999 - Chapter 1: Boxing Day +// December 26, 1999 - Five days until the millennium +// This is the refactored version using shared scenes and series state + +const CHAPTER1_GLITCH_ART = ` + ▓▓▓▒▒░░ E̸̢R̷̨R̵̢O̸̧R̷̨ ░░▒▒▓▓▓ + ░▒▓█ D̶̨A̷̧T̸̢Ą̵ C̷̢Ǫ̸Ŗ̵R̷̨U̸̢P̵̧T̷̨ █▓▒░ + ▓░▒█ ???????????????? █▒░▓ +`; + +const CHAPTER1_END_SCREEN = ` + ╔════════════════════════════════════════╗ + ║ ║ + ║ CONNECTION TERMINATED ║ + ║ ║ + ║ Five days remain... ║ + ║ ║ + ╚════════════════════════════════════════╝ +`; + +const chapter1Game = { + // Series integration + id: "system-shutdown-1999-chapter-1", + seriesId: "system-shutdown-1999", + chapterNumber: 1, + + // Game metadata + name: "System Shutdown: 1999 - Boxing Day", + command: "dial", + description: "Connect to Dark Tower BBS - December 26, 1999", + + // Art assets (passed to scene factories via context) + art: { + CHAPTER1_GLITCH_ART, + CHAPTER1_END_SCREEN, + }, + + // External shared scenes to load + externalScenes: [ + "system-shutdown-1999/dark-tower-hub", + "system-shutdown-1999/lighthouse-hub", + ], + + // Chapter-specific initial state (resets each playthrough) + initialState: { + // Message discovery + read_new_message: false, + found_number: false, + + // Scene visit tracking (chapter-local) + visited: {}, + }, + + // Shared state defaults (only set if not already present in series state) + sharedStateDefaults: { + // Completion tracking + chapters_completed: [], + + // Cross-chapter decisions + downloaded_cascade: false, + talked_to_sysop: false, + deleted_corrupted_file: false, + route_taken: null, + + // World state changes + archives_deleted: false, + corrupted_file_deleted: false, + + // Discovery flags (shared so later chapters know) + dialed_lighthouse: false, + seen_archive_glitch: false, + }, + + intro: [ + { + type: "ansi", + art: BOXING_DAY_TITLE, + className: "game-ansi-art center", + }, + "", + { text: "December 26, 1999 - 10:47 PM", className: "info" }, + "", + { type: "delay", ms: 600 }, + "Five days until the millennium.", + { type: "delay", ms: 1500 }, + "Five days until everything might change.", + "", + { type: "delay", ms: 1000 }, + "Your 56k modem hums quietly in the dark.", + "The house is silent. Everyone else is asleep.", + "", + { type: "delay", ms: 400 }, + { + text: "This game occasionally plays sounds, mute your tab now if that offends you.", + html: true, + className: "warning", + }, + { text: 'Type "quit" at any time to save and exit.', className: "info" }, + ], + + startScene: "connect_prompt", + + // Chapter-specific scenes (these override or extend shared scenes) + scenes: { + // ========================================== + // OPENING SEQUENCE (Chapter 1 specific) + // ========================================== + + connect_prompt: { + content: [ + { + text: "Your terminal awaits a command.", + html: true, + className: "info", + }, + { + text: "The familiar glow illuminates your face.", + html: true, + className: "info", + }, + ], + options: [{ text: "Connect to Dark Tower BBS", next: "modem_connect" }], + }, + + modem_connect: { + clear: true, + sounds: [{ id: "modem_connect", url: "/audio/modem-connect.mp3" }], + content: [ + { type: "typewriter", text: "ATDT 555-0199", speed: 80 }, + "", + { type: "sound", id: "modem_connect", volume: 0.6 }, + { type: "delay", ms: 400 }, + { text: "DIALING...", className: "info" }, + { type: "delay", ms: 3000 }, + "", + { + type: "typewriter", + text: "~~ eEe ~~ EEE ~~ eee ~~", + speed: 35, + italic: true, + }, + { type: "delay", ms: 3000 }, + "CONNECT 56000", + "", + { text: "Carrier detected.", className: "success" }, + { type: "delay", ms: 4500 }, + "Negotiating protocol...", + { type: "delay", ms: 4500 }, + { text: "Connection established.", className: "success" }, + { type: "delay", ms: 2000 }, + ], + next: "dark_tower_main", + delay: 1200, + }, + + // ========================================== + // MESSAGE DISCOVERY (Chapter 1 specific) + // ========================================== + + read_messages: { + content: [ + ...TableHelper.table({ + title: "Private Messages for 0BSERVER0", + headers: ["#", "FROM", "TO", "DATE", "STATUS"], + rows: [ + [ + "23", + "[UNKNOWN]", + "0BSERVER0", + "24/12", + { text: "NEW", className: "warning" }, + ], + ["22", "NIGHTWATCHER", "0BSERVER0", "12/12", "READ"], + ["21", "0BSERVER0", "NIGHTWATCHER", "11/12", "SENT"], + ["22", "NIGHTWATCHER", "0BSERVER0", "10/12", "READ"], + ], + widths: [4, 12, 12, 8, 8], + align: ["right", "left", "left", "left", "left"], + }), + ], + options: [ + { text: "Open unread message", next: "new_message" }, + { text: "Back to main menu", next: "dark_tower_main" }, + ], + }, + + new_message: { + content: [ + { type: "delay", ms: 300 }, + "─── BEGIN MESSAGE ───", + "", + { + type: "typewriter", + text: "I know you've been searching.", + speed: 50, + }, + { type: "delay", ms: 500 }, + "", + { + type: "typewriter", + text: "The lighthouse keeper left something behind.", + speed: 50, + }, + { type: "delay", ms: 500 }, + "", + { + type: "typewriter", + text: "Dial 555-0237 before midnight strikes.", + speed: 50, + }, + { type: "delay", ms: 500 }, + "", + { type: "typewriter", text: "The cascade is coming.", speed: 70 }, + { type: "delay", ms: 800 }, + "", + "─── END MESSAGE ───", + "", + { + text: "
The number burns in your mind: 555-0237", + html: true, + className: "warning", + }, + "", + { type: "delay", ms: 1000 }, + { + text: "Your clock reads 11:54 PM.", + html: true, + className: "info", + }, + { + text: "Six minutes until midnight.

", + html: true, + className: "info", + }, + { type: "delay", ms: 800 }, + "", + ], + onEnter: [ + { set: "read_new_message", value: true }, + { set: "found_number", value: true }, + { setShared: "found_number", value: true }, + ], + prompt: "What do you do?", + options: [ + { + text: "Dial the number NOW", + next: "choice_immediate", + actions: [{ setShared: "route_taken", value: "immediate" }], + }, + { + text: "Explore Dark Tower first", + next: "dark_tower_main", + actions: [{ setShared: "route_taken", value: "cautious" }], + }, + { + text: "Delete the message and forget it", + next: "choice_ignored", + actions: [{ setShared: "route_taken", value: "ignored" }], + }, + ], + }, + + message_archive: { + content: [ + { + type: "table", + title: "Private Messages for 0BSERVER0", + headers: ["#", "FROM", "TO", "DATE", "STATUS"], + rows: [ + { + condition: { not: "read_new_message" }, + cells: ["23", "[UNKNOWN]", "0BSERVER0", "24/12", "NEW"], + className: "warning", + }, + { + condition: "read_new_message", + cells: ["23", "[UNKNOWN]", "0BSERVER0", "24/12", "READ"], + }, + ["22", "NIGHTWATCHER", "0BSERVER0", "12/12", "READ"], + ["21", "0BSERVER0", "NIGHTWATCHER", "11/12", "SENT"], + ["22", "NIGHTWATCHER", "0BSERVER0", "10/12", "READ"], + { + condition: { and: ["has_secret", { not: "revealed_secret" }] }, + cells: ["99", "???", "???", "??/??", "HIDDEN"], + className: "error", + }, + ], + widths: [4, 12, 12, 8, 8], + align: ["right", "left", "left", "left", "left"], + style: "single", + }, + { text: "No new messages.", html: true, className: "info" }, + { + condition: "read_new_message", + content: [ + { + text: "Just the number... 555-0237...", + html: true, + className: "warning", + }, + ], + }, + "", + ], + options: [{ text: "Back", next: "dark_tower_main" }], + }, + + // ========================================== + // CHOICE ROUTES (Chapter 1 specific) + // ========================================== + + choice_immediate: { + clear: true, + content: [ + { + type: "text", + text: "Your fingers move before doubt can settle.", + html: true, + className: "info", + }, + "", + { type: "typewriter", text: "ATH0", speed: 100 }, + { type: "delay", ms: 400 }, + { text: "NO CARRIER", className: "warning" }, + { type: "delay", ms: 600 }, + "", + { + text: "You disconnect from Dark Tower.", + html: true, + className: "info", + }, + { + text: "The silence of your room feels heavier now.", + html: true, + className: "info", + }, + "", + "", + "", + { type: "delay", ms: 500 }, + { + type: "typewriter", + text: "Something compels you forward...", + italic: true, + speed: 100, + className: "info", + }, + { type: "delay", ms: 1500 }, + { + type: "typewriter", + text: "...555-0237", + italic: true, + speed: 100, + className: "info", + }, + { type: "delay", ms: 2000 }, + ], + next: "dial_lighthouse", + delay: 1000, + }, + + choice_ignored: { + clear: true, + content: [ + "You highlight the message.", + "", + { type: "typewriter", text: "DELETE MESSAGE? [Y/N]", speed: 50 }, + { type: "delay", ms: 600 }, + { type: "typewriter", text: "Y", speed: 100 }, + { type: "delay", ms: 400 }, + "", + { text: "MESSAGE DELETED", className: "success" }, + "", + { type: "delay", ms: 1000 }, + "The number fades from memory.", + "Just another piece of BBS spam, you tell yourself.", + "", + { type: "delay", ms: 2000 }, + "You browse Dark Tower for another hour.", + "Download some wallpapers.", + "", + { type: "delay", ms: 2000 }, + "At 11:57 PM, you disconnect.", + "", + { type: "delay", ms: 2000 }, + "Five days later, the millennium arrives.", + "Fireworks. Champagne. Relief.", + "", + { type: "delay", ms: 600 }, + "Nothing happens.", + "", + { type: "delay", ms: 2000 }, + { text: "Or does it?", className: "warning" }, + "", + { type: "delay", ms: 2000 }, + "You never find out what cascade.exe would have done.", + "The lighthouse keeper's message was never meant for you.", + "", + { type: "delay", ms: 1000 }, + { text: "Perhaps that's for the best.", className: "info" }, + "", + { type: "delay", ms: 1000 }, + { text: "[END - Route C: The Road Not Taken]", className: "warning" }, + ], + options: [{ text: "Return to terminal", next: "game_end_ignored" }], + }, + + game_end_ignored: { + clear: true, + content: [ + { type: "ascii", art: CHAPTER1_END_SCREEN, className: "game-ascii" }, + "", + { text: "BOXING DAY", className: "game-title" }, + { text: "Day 1 Complete - Route C", className: "info" }, + "", + "You chose not to follow the signal.", + "Some doors are better left closed.", + "", + { + text: 'Type "dial" to play again, or "dial reset" to start fresh.', + className: "info", + }, + ], + onEnter: [{ markChapterComplete: 1 }], + }, + + // ========================================== + // CHAPTER 1 SPECIFIC ENDINGS + // ========================================== + + sleep_ending: { + clear: true, + content: [ + "You power down the modem.", + "The room falls silent.", + "", + { type: "delay", ms: 600 }, + "As you drift off to sleep, you think about the message.", + "The cascade. The keeper. The lighthouse.", + "", + { type: "delay", ms: 800 }, + "Tomorrow, you tell yourself.", + "You'll investigate tomorrow.", + "", + { type: "delay", ms: 1000 }, + "But tomorrow, you'll forget.", + "The way everyone forgets.", + "", + { type: "delay", ms: 800 }, + { + condition: { not: "found_number" }, + content: { + text: "[END - Route C: Peaceful Sleep]", + className: "info", + }, + else: { text: "[END - Route B: Postponed]", className: "warning" }, + }, + ], + options: [{ text: "Return to terminal", next: "game_end_sleep" }], + }, + + game_end_sleep: { + clear: true, + content: [ + { type: "ascii", art: CHAPTER1_END_SCREEN, className: "game-ascii" }, + "", + { text: "BOXING DAY", className: "game-title" }, + { text: "Day 1 Complete", className: "info" }, + "", + "You chose rest over curiosity.", + "The lighthouse keeper will have to wait.", + "", + { + text: 'Type "dial" to play again, or "dial reset" to start fresh.', + className: "info", + }, + ], + onEnter: [{ markChapterComplete: 1 }], + }, + + // Final ending scene (overrides shared scene for chapter-specific summary) + carrier_lost: { + clear: true, + content: [ + { type: "delay", ms: 300 }, + { type: "typewriter", text: "ATH0", speed: 100 }, + { type: "delay", ms: 500 }, + "", + { text: "NO CARRIER", className: "error" }, + "", + { type: "delay", ms: 1200 }, + "", + { type: "ascii", art: CHAPTER1_END_SCREEN, className: "game-ascii" }, + "", + { text: "BOXING DAY", className: "game-title" }, + { text: "Day 1 Complete", className: "info" }, + "", + { text: "─── SESSION SUMMARY ───", className: "info" }, + "", + { + condition: "downloaded_cascade", + content: { text: "[X] Downloaded CASCADE.EXE", className: "success" }, + else: { text: "[ ] Downloaded CASCADE.EXE", className: "info" }, + }, + { + condition: "talked_to_sysop", + content: { text: "[X] Spoke with Keeper", className: "success" }, + else: { text: "[ ] Spoke with Keeper", className: "info" }, + }, + { + condition: "deleted_corrupted_file", + content: { text: "[X] Accessed SHADOW.DAT", className: "warning" }, + else: { text: "[ ] Accessed SHADOW.DAT", className: "info" }, + }, + "", + { + condition: "archives_deleted", + content: { + text: "[!] The Archives have been deleted", + className: "error", + }, + }, + { + condition: "corrupted_file_deleted", + content: { + text: "[!] SHADOW.DAT has been removed", + className: "error", + }, + }, + "", + { text: "Route: ${route_taken}", className: "info" }, + "", + { text: "To be continued...", className: "warning" }, + "", + { + text: 'Type "dial" to replay, or "dial reset" to clear progress.', + className: "info", + }, + ], + onEnter: [ + { set: "day_1_complete", value: true }, + { markChapterComplete: 1 }, + ], + }, + }, +}; + +// Register the game when DOM is ready (ensures all scripts including scene factories are loaded) +function registerChapter1() { + if (window.terminal && window.GameEngine) { + const game = new GameEngine(chapter1Game); + game.register(); + } +} + +// If DOM is already loaded, register immediately, otherwise wait +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", registerChapter1); +} else { + registerChapter1(); +} diff --git a/assets/js/games/games/test-adventure.js b/assets/js/games/games/test-adventure.js new file mode 100644 index 0000000..1605c23 --- /dev/null +++ b/assets/js/games/games/test-adventure.js @@ -0,0 +1,328 @@ +// Test Adventure - A simple game to test the game engine +const testAdventureGame = { + id: "test-adventure", + name: "Terminal Quest", + command: "quest", + description: "A test adventure game", + + initialState: { + gold: 0, + inventory: [], + visited: {}, + }, + + intro: [ + { + type: "ascii", + art: ` + ╔════════════════════════════════╗ + ║ TERMINAL QUEST ║ + ║ A Test Adventure ║ + ╚════════════════════════════════╝ + `, + className: "game-ascii", + }, + "", + "You wake up in a strange digital world...", + { type: "delay", ms: 800 }, + "The cursor blinks patiently before you.", + "", + { text: 'Type "quit" at any time to exit.', className: "info" }, + ], + + startScene: "start", + + scenes: { + start: { + title: "The Terminal", + content: [ + "You find yourself at a command prompt.", + "A green cursor blinks steadily in the darkness.", + "", + { + condition: { path: "visited.start" }, + content: { text: "You've been here before...", className: "info" }, + }, + { + condition: { path: "gold", greaterThan: 0 }, + content: "Your gold pouch jingles with ${gold} coins.", + }, + ], + onEnter: [{ set: "visited.start", value: true }], + options: [ + { text: "Look around", next: "look-around" }, + { text: "Check inventory", next: "inventory" }, + { + text: "Enter the code cave", + condition: { path: "inventory", contains: "flashlight" }, + next: "code-cave", + }, + { + text: "Talk to the cursor", + condition: { not: { path: "visited.cursor-talk" } }, + next: "cursor-talk", + }, + { text: "Test glitch effect", next: "glitch-demo" }, + ], + }, + + "glitch-demo": { + title: "Glitch Effect Demo", + content: [ + "The terminal screen begins to distort...", + { type: "delay", ms: 800 }, + "", + { + type: "glitch", + text: "REALITY CORRUPTING", + intensity: 0.5, + spread: 3, + duration: 2500, + }, + "", + { type: "delay", ms: 500 }, + "The corruption spreads across nearby lines...", + { type: "delay", ms: 600 }, + "", + { + type: "glitch", + text: "ERROR: MEMORY FAULT AT 0x7FFFFFFF", + intensity: 0.7, + spread: 4, + speed: 40, + duration: 3000, + className: "error glitch-text", + }, + "", + { type: "delay", ms: 500 }, + "A subtle glitch flickers briefly...", + { type: "delay", ms: 400 }, + "", + { + type: "glitch", + text: "Connection unstable", + intensity: 0.2, + spread: 1, + duration: 1500, + }, + "", + { type: "delay", ms: 300 }, + "The screen stabilizes again.", + ], + options: [{ text: "Back to start", next: "start" }], + }, + + "look-around": { + title: "Searching...", + content: ["You search the area carefully...", { type: "delay", ms: 500 }], + onEnter: [ + { + callback: (state, adapter) => { + // Random chance to find gold + if (Math.random() > 0.5) { + const found = Math.floor(Math.random() * 10) + 1; + state.increment("gold", found); + adapter.printSuccess(`You found ${found} gold coins!`); + } else { + adapter.print("You don't find anything this time."); + } + }, + }, + ], + next: "start", + delay: 1000, + }, + + inventory: { + title: "Inventory", + clear: false, + content: [ + "", + "=== Your Inventory ===", + { text: "Gold: ${gold}", className: "warning" }, + "", + { + condition: { path: "inventory", contains: "flashlight" }, + content: "- Flashlight (lights up dark places)", + }, + { + condition: { path: "inventory", contains: "key" }, + content: "- Mysterious Key", + }, + { + condition: { + and: [ + { not: { path: "inventory", contains: "flashlight" } }, + { not: { path: "inventory", contains: "key" } }, + ], + }, + content: { text: "Your inventory is empty.", className: "info" }, + }, + "", + ], + options: [{ text: "Back", next: "start" }], + }, + + "cursor-talk": { + title: "The Blinking Cursor", + content: [ + "The cursor seems to acknowledge you.", + "", + { type: "typewriter", text: "HELLO, USER.", speed: 80 }, + { type: "delay", ms: 500 }, + { type: "typewriter", text: "I HAVE BEEN WAITING FOR YOU.", speed: 60 }, + { type: "delay", ms: 300 }, + "", + "The cursor offers you something...", + ], + onEnter: [ + { set: "visited.cursor-talk", value: true }, + { addItem: "flashlight" }, + { printSuccess: "You received a flashlight!" }, + ], + options: [ + { text: "Thank the cursor", next: "cursor-thanks" }, + { text: "Ask about the code cave", next: "cursor-cave-info" }, + ], + }, + + "cursor-thanks": { + content: [ + { type: "typewriter", text: "YOU ARE WELCOME, USER.", speed: 60 }, + "", + "The cursor resumes its patient blinking.", + ], + next: "start", + delay: 1500, + }, + + "cursor-cave-info": { + content: [ + { type: "typewriter", text: "THE CAVE HOLDS SECRETS...", speed: 60 }, + { type: "delay", ms: 300 }, + { type: "typewriter", text: "USE THE LIGHT TO FIND THEM.", speed: 60 }, + "", + "The cursor dims slightly, as if tired from speaking.", + ], + next: "start", + delay: 1500, + }, + + "code-cave": { + title: "The Code Cave", + content: [ + "Your flashlight illuminates a cavern of glowing text.", + "Ancient code scrolls across the walls.", + "", + { + type: "ascii", + art: ` + function mystery() { + return ??????; + } + `, + className: "info", + }, + "", + { + condition: { not: { path: "visited.code-cave" } }, + content: "This is your first time in the code cave.", + }, + { + condition: { path: "visited.code-cave" }, + content: "The familiar glow of code surrounds you.", + }, + ], + onEnter: [{ set: "visited.code-cave", value: true }], + prompt: "What do you do?", + options: [ + { text: "Examine the code", next: "examine-code" }, + { + text: "Search for treasure", + condition: { not: { path: "inventory", contains: "key" } }, + next: "find-key", + }, + { + text: "Use the mysterious key", + condition: { path: "inventory", contains: "key" }, + next: "use-key", + }, + { text: "Return to the terminal", next: "start" }, + ], + }, + + "examine-code": { + content: [ + "You study the ancient code...", + { type: "delay", ms: 500 }, + "", + "It seems to be a function that returns...", + { type: "delay", ms: 800 }, + { text: "...the meaning of everything?", className: "warning" }, + "", + "How curious.", + ], + next: "code-cave", + delay: 3000, + }, + + "find-key": { + content: [ + "You search among the glowing symbols...", + { type: "delay", ms: 800 }, + "", + "Behind a cascade of semicolons, you find something!", + ], + onEnter: [ + { addItem: "key" }, + { printSuccess: "You found a mysterious key!" }, + ], + next: "code-cave", + delay: 1000, + }, + + "use-key": { + title: "The Hidden Chamber", + content: [ + "The key fits into a slot hidden in the code.", + { type: "delay", ms: 500 }, + "", + "A hidden chamber opens before you!", + { type: "delay", ms: 500 }, + "", + { + type: "ascii", + art: ` + ╔═══════════════════════════════╗ + ║ ║ + ║ CONGRATULATIONS! ║ + ║ ║ + ║ You found the secret ║ + ║ of the Terminal Quest! ║ + ║ ║ + ║ The treasure is: ║ + ║ KNOWLEDGE ║ + ║ ║ + ╚═══════════════════════════════╝ + `, + className: "success", + }, + "", + { text: "Thanks for playing this test adventure!", className: "info" }, + "", + 'Type "quest" to play again, or "quest reset" to start fresh.', + ], + onEnter: [ + { increment: "gold", amount: 100 }, + { printSuccess: "You also found 100 gold!" }, + { set: "completed", value: true }, + ], + }, + }, +}; + +// Register the game when terminal is available +if (window.terminal && window.GameEngine) { + const game = new GameEngine(testAdventureGame); + game.register(); +} diff --git a/assets/js/games/scenes/system-shutdown-1999/art/index.js b/assets/js/games/scenes/system-shutdown-1999/art/index.js new file mode 100644 index 0000000..339e433 --- /dev/null +++ b/assets/js/games/scenes/system-shutdown-1999/art/index.js @@ -0,0 +1,33 @@ +// Art assets index for System Shutdown: 1999 series +// These reference the ANSI art defined in ascii-art.js + +// Art constants are loaded from ascii-art.js and made available globally +// This file provides a namespace for the series' art assets + +window.SystemShutdown1999Art = window.SystemShutdown1999Art || {}; + +// These will be populated by ascii-art.js when it loads +// The art constants are: +// - BOXING_DAY_TITLE: Chapter 1 title screen +// - DARK_TOWER_HEADER: Dark Tower BBS header +// - LIGHTHOUSE_HEADER: The Lighthouse BBS header + +// Helper to get art by name +window.SystemShutdown1999Art.get = function (name) { + switch (name) { + case "BOXING_DAY_TITLE": + return window.BOXING_DAY_TITLE; + case "DARK_TOWER_HEADER": + return window.DARK_TOWER_HEADER; + case "LIGHTHOUSE_HEADER": + return window.LIGHTHOUSE_HEADER; + default: + console.warn(`Unknown art asset: ${name}`); + return null; + } +}; + +// List available art assets +window.SystemShutdown1999Art.list = function () { + return ["BOXING_DAY_TITLE", "DARK_TOWER_HEADER", "LIGHTHOUSE_HEADER"]; +}; diff --git a/assets/js/games/scenes/system-shutdown-1999/config.js b/assets/js/games/scenes/system-shutdown-1999/config.js new file mode 100644 index 0000000..7d5ad89 --- /dev/null +++ b/assets/js/games/scenes/system-shutdown-1999/config.js @@ -0,0 +1,89 @@ +// Series configuration for System Shutdown: 1999 +window.SystemShutdown1999Config = { + seriesId: "system-shutdown-1999", + name: "System Shutdown: 1999", + + // Chapter definitions + chapters: [ + { + number: 1, + id: "system-shutdown-1999-chapter-1", + command: "dial", + date: "1999-12-26", + title: "Boxing Day", + description: "Connect to Dark Tower BBS - December 26, 1999", + }, + { + number: 2, + id: "system-shutdown-1999-chapter-2", + command: "dial2", + date: "1999-12-27", + title: "Day 2", + description: "The day after - December 27, 1999", + }, + { + number: 3, + id: "system-shutdown-1999-chapter-3", + command: "dial3", + date: "1999-12-28", + title: "Day 3", + description: "Three days remain - December 28, 1999", + }, + { + number: 4, + id: "system-shutdown-1999-chapter-4", + command: "dial4", + date: "1999-12-29", + title: "Day 4", + description: "Two days remain - December 29, 1999", + }, + { + number: 5, + id: "system-shutdown-1999-chapter-5", + command: "dial5", + date: "1999-12-30", + title: "Day 5", + description: "The eve - December 30, 1999", + }, + { + number: 6, + id: "system-shutdown-1999-chapter-6", + command: "dial6", + date: "1999-12-31", + title: "New Year's Eve", + description: "The final night - December 31, 1999", + }, + ], + + // Shared state schema with defaults + // These values persist across all chapters + sharedStateDefaults: { + // Completion tracking + chapters_completed: [], + + // Core cross-chapter decisions + downloaded_cascade: false, + talked_to_sysop: false, + deleted_corrupted_file: false, + route_taken: null, // "immediate" | "cautious" | "ignored" + + // World state changes (persist across chapters) + archives_deleted: false, + corrupted_file_deleted: false, + + // Discovery flags + found_number: false, + dialed_lighthouse: false, + seen_archive_glitch: false, + }, + + // Helper to get chapter by number + getChapter(number) { + return this.chapters.find((c) => c.number === number); + }, + + // Helper to get next chapter + getNextChapter(currentNumber) { + return this.chapters.find((c) => c.number === currentNumber + 1); + }, +}; diff --git a/assets/js/games/scenes/system-shutdown-1999/shared/dark-tower-hub.js b/assets/js/games/scenes/system-shutdown-1999/shared/dark-tower-hub.js new file mode 100644 index 0000000..df10b74 --- /dev/null +++ b/assets/js/games/scenes/system-shutdown-1999/shared/dark-tower-hub.js @@ -0,0 +1,574 @@ +// Dark Tower BBS Hub - Shared scenes for System Shutdown: 1999 +// These scenes can be used across multiple chapters + +window.SceneFactories = window.SceneFactories || {}; + +window.SceneFactories["system-shutdown-1999/dark-tower-hub"] = function ( + context, +) { + const { chapterNumber, art, additionalOptions = [] } = context; + + // Get art from bundle scope (loaded by ascii-art.js in same bundle) + // Falls back to context.art if not found (for standalone loading) + const DARK_TOWER_HEADER_ART = + typeof DARK_TOWER_HEADER !== "undefined" + ? DARK_TOWER_HEADER + : art.DARK_TOWER_HEADER; + + return { + // ========================================== + // DARK TOWER BBS HUB + // ========================================== + + dark_tower_main: { + clear: true, + content: [ + { + type: "ansi", + art: DARK_TOWER_HEADER_ART, + className: "game-ansi-art center", + }, + "", + { + text: "---=[ D A R K T O W E R B B S - E S T. 1 9 9 5 ]=---", + className: "info center", + }, + // User count can change based on chapter/state + { + condition: { path: "chapters_completed", contains: 1 }, + content: { + text: "[ Users Connected - 2 ] - [ SysOp - NightWatchman ]", + className: "info center", + }, + else: { + text: "[ Users Connected - 3 ] - [ SysOp - NightWatchman ]", + className: "info center", + }, + }, + { text: "[ Local Time: 10:52 PM ]", className: "info center" }, + "", + // New message notification if not read + { + condition: { not: "read_new_message" }, + content: [ + { + text: "*** YOU HAVE 1 NEW PRIVATE MESSAGE ***", + className: "warning center", + }, + "", + ], + }, + // Show warning if archives were deleted (cascade effect) + { + condition: "archives_deleted", + content: [ + { + text: "[!] Some system data appears to be missing...", + className: "error center", + }, + "", + ], + }, + ], + onAfterRender: [{ set: "visited.dark_tower_main", value: true }], + prompt: "Select:", + options: [ + { + text: "Read Private Messages", + next: "read_messages", + condition: { not: "read_new_message" }, + }, + { + text: "Message Archive", + next: "message_archive", + condition: "read_new_message", + }, + { text: "Browse Message Boards", next: "browse_boards" }, + { text: "File Library", next: "dark_tower_files" }, + { text: "Who's Online", next: "whos_online" }, + { + text: "Dial The Lighthouse (555-0237)", + next: "confirm_dial_lighthouse", + condition: "found_number", + }, + // Additional options can be passed by chapters + ...additionalOptions, + { text: "Disconnect", next: "leave_early" }, + ], + }, + + // ========================================== + // MESSAGE BOARDS + // ========================================== + + browse_boards: { + content: [ + { + type: "table", + title: "DARK TOWER / MESSAGE BOARDS", + headers: ["#", "NAME", "NEW MSG", "LAST"], + rows: [ + ["1", "General Discussion", "8", "24/12"], + ["2", "Tech Support", "1", "25/12"], + ["3", "File Updates", "3", "23/12"], + // Display the archives or have them deleted + { + condition: { not: "archives_deleted" }, + cells: ["4", "ARCHIVED", "-", "-"], + }, + { + condition: "archives_deleted", + cells: ["4", "", "-", "-"], + className: "error", + }, + ], + widths: [4, 20, 10, 8], + align: ["right", "left", "left", "left"], + style: "single", + }, + { + condition: "archives_deleted", + content: { + type: "typewriter", + italic: true, + text: "The archived messages are just... gone...", + speed: 80, + className: "info", + }, + }, + ], + prompt: "Select board:", + options: [ + { text: "General Discussion", next: "board_general" }, + { text: "Tech Support", next: "board_tech" }, + { text: "File Updates", next: "board_files" }, + { + text: "ARCHIVED", + next: "board_archives", + condition: { not: "archives_deleted" }, + }, + { text: "Back to main menu", next: "dark_tower_main" }, + ], + }, + + board_general: { + content: [ + { + type: "table", + title: "GENERAL DISCUSSION", + headers: ["#", "SUBJECT", "MSG", "LAST"], + rows: [ + ["1", "2K Preparation Thread", "243", "25/12"], + ["2", "Anyone else getting weird messages?", "3", "25/12"], + ["3", "Happy Boxing Day everyone!", "5", "25/12"], + ["4", "Best BBS games?", "43", "23/12"], + ["5", "New user intro thread", "67", "20/12"], + ], + widths: [4, 40, 6, 8], + align: ["right", "left", "right", "left"], + style: "single", + }, + { + text: "The usual chatter.", + italic: true, + className: "info", + }, + { + condition: "found_number", + content: { + type: "text", + italic: true, + text: "Nothing about lighthouses...", + className: "info", + }, + }, + ], + options: [ + { text: "Read 'weird messages' thread", next: "thread_weird" }, + { text: "Back to boards", next: "browse_boards" }, + ], + }, + + thread_weird: { + content: [ + { + type: "table", + title: "Anyone else getting weird messages?", + headers: ["FROM", "TO", "DATE"], + rows: [["Static_User", "All", "25/12/99"]], + widths: [20, 20, 10], + align: ["left", "left", "left"], + style: "single", + }, + " Got a strange PM last night. No sender listed.", + " Just a phone number and something about a 'cascade'.", + " Probably spam, but creepy timing with Y2K coming up.", + "", + "---", + { text: "Reply from: NightWatchman [SYSOP]", className: "warning" }, + " Looking into it. Please forward any suspicious messages.", + " And don't dial any numbers you don't recognize.", + "", + "---", + { text: "Reply from: [DELETED USER]", className: "error" }, + " [This post cannot be accessed]", + "", + { type: "delay", ms: 1000 }, + { + condition: "found_number", + content: { + text: "

You notice your message was similar...", + html: true, + className: "info", + }, + }, + ], + options: [{ text: "Back", next: "board_general" }], + }, + + board_tech: { + content: [ + { + type: "table", + title: "TECH SUPPORT", + headers: ["#", "SUBJECT", "MSG", "LAST"], + rows: [ + ["1", "READ FIRST: Y2K Compliance Guide", "152", "25/12"], + ["2", "Modem dropping connection at midnight?", "3", "25/12"], + ["3", "How to increase download speeds", "98", "25/12"], + ["4", "We are migrating to TELNET/IP on 01/04/00", "429", "11/12"], + ["5", "Inputs not registering", "2", "29/11"], + ], + widths: [4, 45, 6, 8], + align: ["right", "left", "right", "left"], + style: "single", + }, + { + text: "Standard tech questions. Nothing unusual.", + italic: true, + className: "info", + }, + ], + options: [{ text: "Back to boards", next: "browse_boards" }], + }, + + board_archives: { + content: [ + { + type: "table", + title: "THE ARCHIVES", + headers: ["#", "SUBJECT", "OP", "LAST"], + rows: [ + ["1", "The Lighthouse Project", "NightWatchman", "1998"], + ["2", "Frequencies and Patterns", "Signal_Lost", "1999"], + ["3", "RE: Has anyone heard from Keeper?", "[UNKNOWN]", "1999"], + ], + widths: [4, 35, 16, 8], + align: ["right", "left", "right", "left"], + style: "single", + }, + { + text: "Historical posts, read only...", + italic: true, + className: "info", + }, + { + condition: { not: "visited.archive_warning" }, + content: [ + "", + { text: "These posts feel... different.", className: "warning" }, + { text: "Like echoes from somewhere else.", className: "info" }, + ], + }, + ], + onEnter: [{ set: "visited.archive_warning", value: true }], + options: [ + { text: "Read 'The Lighthouse Project'", next: "archive_lighthouse" }, + { + text: "Read 'Frequencies and Patterns'", + next: "archive_frequencies", + }, + { + text: "Read 'Has anyone heard from Keeper?'", + next: "archive_keeper", + }, + { text: "Back to boards", next: "browse_boards" }, + ], + }, + + archive_lighthouse: { + content: [ + { + type: "table", + title: "The Lighthouse Project", + headers: ["FROM", "TO", "DATE"], + rows: [["NightWatchman [SYSOP]", "All", "15/11/98"]], + widths: [25, 15, 10], + align: ["left", "left", "left"], + style: "single", + }, + "Some of you have asked about the secondary BBS.", + "Yes, it exists. No, I can't give you the number.", + "", + "The Lighthouse was set up by someone who called himself 'Keeper'.", + "He said he found something in the noise between stations.", + "Patterns that shouldn't exist.", + "", + "I set up his board as a favor.", + "Then one day, he stopped logging in.", + "", + "The board is still there. Still running.", + "I check it sometimes. The files he left behind...", + "", + "Some doors are better left closed.", + { text: "- NW", className: "info" }, + ], + options: [{ text: "Back", next: "board_archives" }], + }, + + archive_frequencies: { + title: "Frequencies and Patterns", + content: [ + "═══ Frequencies and Patterns ═══", + { text: "Posted by: Signal_Lost - March 22, 1999", className: "info" }, + "", + "I've been analyzing radio static for three months.", + "There's something there. In the spaces between signals.", + "", + "It's not random. It's STRUCTURED.", + "Like code. Like a message.", + "", + "Keeper knew. That's why he built cascade.exe.", + "To translate. To REVEAL.", + "", + "I'm close to understanding.", + "So close.", + "", + { + text: "[User Signal_Lost has not logged in since March 23, 1999]", + className: "warning", + }, + ], + options: [{ text: "Back", next: "board_archives" }], + }, + + archive_keeper: { + content: [ + { + type: "table", + title: "RE: Has anyone heard from Keeper?", + headers: ["FROM", "TO", "DATE"], + rows: [["[UNKNOWN]", "All", "20/12/99"]], + widths: [25, 15, 10], + align: ["left", "left", "left"], + style: "single", + }, + "", + "He's still there.", + "In The Lighthouse.", + "Waiting.", + "", + "The cascade is ready.", + "It just needs carriers.", + "", + { + type: "glitch", + text: "ERROR: MEMORY FAULT AT 0x555f0237", + intensity: 0.7, + spread: 0, + speed: 200, + duration: 2000, + className: "error glitch-text", + }, + "", + "Before midnight on the 31st.", + "The alignment only happens once.", + "", + { + text: "[This post was flagged for removal but persists]", + className: "error", + }, + { + html: true, + text: "

", + }, + { + condition: { not: "seen_archive_glitch" }, + content: [ + { + text: "What the hell was that...", + italic: true, + className: "info", + }, + ], + else: [ + { + text: "The glitch persists...", + italic: true, + className: "info", + }, + ], + }, + { + condition: "found_number", + content: { + text: "The memory location looks oddly like the phone number... 555-0237", + italic: true, + className: "warning", + }, + }, + ], + onAfterRender: [{ set: "seen_archive_glitch", value: true }], + options: [{ text: "Back", next: "board_archives" }], + }, + + board_files: { + content: [ + { + type: "table", + title: "FILE ANNOUNCEMENTS", + headers: ["#", "SUBJECT", "MSG", "LAST"], + rows: [ + ["1", "1001FONTS.ZIP - Font Collection", "1", "25/12"], + ["2", "Y2K_FIX.ZIP - Y2K compliance patches", "4", "23/12"], + ["3", "DOOM_WAD.ZIP - New Doom Levels", "3", "11/12"], + ["4", "BRUCE.JPEG - Just my dog :-)", "15", "20/11"], + ["5", "CATS.GIF - All your base are belong to us", "1", "01/11"], + ], + widths: [4, 45, 6, 8], + align: ["right", "left", "right", "left"], + style: "single", + }, + { + text: "New fonts... At last...", + html: true, + className: "info", + }, + { + text: "Can't get distracted just yet.", + html: true, + className: "info", + }, + ], + options: [{ text: "Back to boards", next: "browse_boards" }], + }, + + dark_tower_files: { + content: [ + { + type: "table", + title: "FILE LIBRARY", + headers: ["#", "DIR", "QTY", "UPDATED"], + rows: [ + ["1", "/IMAGES", "234", "25/12"], + ["2", "/GAMES", "67", "12/12"], + ["3", "/MUSIC", "89", "30/11"], + ["4", "/UTILS", "156", "23/11"], + ["5", "/MISC", "13", "09/10"], + ], + widths: [4, 25, 6, 8], + align: ["right", "left", "right", "left"], + style: "single", + }, + { + text: "Standard BBS fare. Nothing unusual.", + html: true, + className: "info", + }, + ], + options: [{ text: "Back to main menu", next: "dark_tower_main" }], + }, + + whos_online: { + content: [ + { + type: "table", + title: "CONNECTED USERS", + headers: ["#", "USER", "LOC", "UPDATED"], + rows: [ + ["1", "0BSERVER0", "Main Menu", "10:54 PM"], + // Static_User might not be online in later chapters + { + condition: { not: { path: "chapters_completed", contains: 1 } }, + cells: ["2", "Static_User", "Message Boards", "10:39 PM"], + }, + ["3", "NightWatchman", "SysOp Console", "10:12 PM"], + ], + widths: [4, 15, 15, 8], + align: ["right", "left", "right", "left"], + style: "single", + }, + ], + options: [{ text: "Back", next: "dark_tower_main" }], + }, + + leave_early: { + content: [ + "Are you sure you want to disconnect?", + "", + { + condition: "found_number", + content: { + text: "You still have the number: 555-0237", + className: "warning", + }, + }, + ], + options: [ + { + text: "Dial The Lighthouse first", + next: "confirm_dial_lighthouse", + condition: "found_number", + }, + { text: "Yes, disconnect", next: "disconnect_early" }, + { text: "Stay connected", next: "dark_tower_main" }, + ], + }, + + disconnect_early: { + clear: true, + content: [ + { type: "typewriter", text: "ATH0", speed: 100 }, + { type: "delay", ms: 400 }, + { text: "NO CARRIER", className: "warning" }, + "", + { type: "delay", ms: 600 }, + "You disconnect from Dark Tower.", + "", + { + condition: "found_number", + content: [ + "The number lingers in your mind.", + { text: "555-0237", className: "warning" }, + "", + "You could always dial it directly...", + ], + else: ["Another quiet night online.", "Nothing unusual."], + }, + ], + options: [ + { + text: "Dial 555-0237", + next: "dial_lighthouse", + condition: "found_number", + }, + { text: "Go to sleep", next: "sleep_ending" }, + ], + }, + + confirm_dial_lighthouse: { + content: [ + { text: "555-0237", className: "warning" }, + "", + "The number from the message.", + "Something waits on the other end.", + "", + { text: "Your clock reads 11:56 PM.", className: "info" }, + ], + options: [ + { text: "Dial The Lighthouse", next: "dial_lighthouse" }, + { text: "Not yet", next: "dark_tower_main" }, + ], + }, + }; +}; diff --git a/assets/js/games/scenes/system-shutdown-1999/shared/lighthouse-hub.js b/assets/js/games/scenes/system-shutdown-1999/shared/lighthouse-hub.js new file mode 100644 index 0000000..882a4b4 --- /dev/null +++ b/assets/js/games/scenes/system-shutdown-1999/shared/lighthouse-hub.js @@ -0,0 +1,625 @@ +// The Lighthouse BBS Hub - Shared scenes for System Shutdown: 1999 +// These scenes can be used across multiple chapters + +window.SceneFactories = window.SceneFactories || {}; + +window.SceneFactories["system-shutdown-1999/lighthouse-hub"] = function ( + context, +) { + const { chapterNumber, art, additionalOptions = [] } = context; + + // Get art from bundle scope (loaded by ascii-art.js in same bundle) + // Falls back to context.art if not found (for standalone loading) + const LIGHTHOUSE_HEADER_ART = + typeof LIGHTHOUSE_HEADER !== "undefined" + ? LIGHTHOUSE_HEADER + : art.LIGHTHOUSE_HEADER; + + return { + // ========================================== + // THE LIGHTHOUSE + // ========================================== + + dial_lighthouse: { + clear: true, + content: [ + { type: "typewriter", text: "ATDT 555-0237", speed: 80 }, + { type: "delay", ms: 1000 }, + "", + { text: "DIALING...", className: "info" }, + { type: "delay", ms: 800 }, + "", + { text: "RING", className: "warning" }, + { type: "delay", ms: 1200 }, + { text: "RING", className: "warning" }, + { type: "delay", ms: 1200 }, + { text: "RING", className: "warning" }, + { type: "delay", ms: 800 }, + "", + { + type: "typewriter", + text: "~~ crackle ~~ hiss ~~ CONNECT 14400", + speed: 40, + }, + { type: "delay", ms: 500 }, + "", + { text: "Connection unstable.", className: "warning" }, + { text: "Signal degraded.", className: "warning" }, + { type: "delay", ms: 600 }, + "", + { type: "typewriter", text: "Welcome to THE LIGHTHOUSE", speed: 40 }, + { type: "delay", ms: 300 }, + { type: "typewriter", text: "A beacon in the static.", speed: 40 }, + ], + onEnter: [{ setShared: "dialed_lighthouse", value: true }], + next: "lighthouse_main", + delay: 1000, + }, + + lighthouse_main: { + clear: true, + content: [ + { + type: "ascii", + art: LIGHTHOUSE_HEADER_ART, + className: "game-ascii", + }, + "", + { text: "T H E L I G H T H O U S E", className: "center" }, + { text: "Last updated: 24/12/1999 23:59:59", className: "center" }, + "", + { + condition: { not: "visited.lighthouse_main" }, + content: [ + { + text: "Something feels wrong here.", + italic: true, + className: "info", + }, + { + text: "The BBS feels... frozen. Abandoned.", + italic: true, + className: "info", + }, + "", + ], + }, + { + condition: "downloaded_cascade", + content: [ + { + text: "The signal flickers. Something has changed.", + className: "error", + }, + "", + ], + }, + ], + onAfterRender: [{ set: "visited.lighthouse_main", value: true }], + prompt: "Navigate:", + options: [ + { text: "The Keeper's Log", next: "lighthouse_log" }, + { text: "Transmissions", next: "lighthouse_transmissions" }, + { text: "File Vault", next: "lighthouse_files" }, + { + text: "Request SysOp Chat", + next: "chat_request", + condition: { + and: [{ not: "downloaded_cascade" }, { not: "talked_to_sysop" }], + }, + }, + // Additional options can be passed by chapters + ...additionalOptions, + { text: "Disconnect", next: "disconnect_choice" }, + ], + }, + + lighthouse_log: { + content: [ + "═══ THE KEEPER'S LOG ═══", + "", + { + text: "Entry 1 - November 3, 1998

", + html: true, + className: "info", + }, + " I've found something. In the static between radio stations.", + " Patterns. Structures. A language, maybe.", + { + text: "
Entry 7 - December 12, 1998

", + html: true, + className: "info", + }, + " The patterns are getting clearer. They want to be understood.", + " They want to SPREAD.", + { + text: "
Entry 15 - March 19, 1999

", + html: true, + className: "info", + }, + " CASCADE.EXE is complete. A translator. A carrier. A key.", + " When run at the right moment, it will open the door.", + { + text: "
Entry 23 - December 24, 1999

", + html: true, + className: "info", + }, + " The alignment approaches.", + " Seven days until the millennium.", + " I can hear them now. Always.", + "", + { type: "typewriter", text: " They are beautiful...", speed: 100 }, + { type: "delay", ms: 2000 }, + ], + options: [{ text: "Back", next: "lighthouse_main" }], + }, + + lighthouse_transmissions: { + title: "Transmissions", + content: [ + "═══ RECORDED TRANSMISSIONS ═══", + "", + { text: "[AUDIO FILES - PLAYBACK UNAVAILABLE]", className: "error" }, + "", + "Transcript excerpts:", + "", + " TRANS_001.WAV:", + ' "...signal detected at 1420 MHz..."', + "", + " TRANS_014.WAV:", + ' "...pattern repeats every 23 seconds..."', + "", + " TRANS_047.WAV:", + ' "...not random... structured... alive?..."', + "", + " TRANS_099.WAV:", + { text: ' "[TRANSCRIPT CORRUPTED]"', className: "error" }, + "", + { text: "The audio files existed once.", className: "info" }, + { text: "Now only fragments remain.", className: "warning" }, + ], + options: [{ text: "Back", next: "lighthouse_main" }], + }, + + lighthouse_files: { + title: "File Vault", + content: [ + "═══ FILE VAULT v2.1 ═══", + { text: '"The keeper\'s collection"', className: "info" }, + "", + { text: "Available files:", className: "info" }, + "", + " [1] README.TXT 1.2 KB 12/24/1999", + " [2] CASCADE.EXE 47.0 KB 12/25/1999", + // Corrupted file - conditionally shown + { + condition: { not: "corrupted_file_deleted" }, + content: " [3] SHADOW.DAT ??? KB ??/??/????", + }, + { + condition: "corrupted_file_deleted", + content: { text: " [3] ", className: "error" }, + }, + "", + { + condition: { not: "visited.lighthouse_files" }, + content: { + text: "CASCADE.EXE pulses faintly on your screen.", + className: "warning", + }, + }, + ], + onEnter: [{ set: "visited.lighthouse_files", value: true }], + prompt: "Select file:", + options: [ + { text: "View README.TXT", next: "file_readme" }, + { text: "Download CASCADE.EXE", next: "download_confirm" }, + { + text: "Access SHADOW.DAT", + next: "choice_corrupted", + condition: { not: "corrupted_file_deleted" }, + }, + { text: "Back", next: "lighthouse_main" }, + ], + }, + + file_readme: { + title: "README.TXT", + content: [ + "═══ README.TXT ═══", + "", + "To whoever finds this:", + "", + "I built cascade.exe to show them.", + "To show everyone what I found in the frequencies.", + "", + "It spreads. It copies. It REVEALS.", + "", + "Don't be afraid when the old files disappear.", + "They were never real anyway.", + "", + "Run it before midnight on 01/01/2000.", + "The alignment only happens once.", + "", + { text: " - K", className: "info" }, + "", + { text: "P.S. Don't try to open SHADOW.DAT.", className: "warning" }, + { + text: " Some doors shouldn't be opened twice.", + className: "warning", + }, + ], + options: [{ text: "Back to files", next: "lighthouse_files" }], + }, + + download_confirm: { + content: [ + { text: "CASCADE.EXE - 47,104 bytes", className: "warning" }, + "", + "The file waits.", + "47 kilobytes of unknown code.", + "", + "The README said it 'reveals' something.", + "That old files will 'disappear'.", + "", + { + text: "In five days, everyone worries about Y2K bugs.", + className: "info", + }, + { text: "This feels different.", className: "warning" }, + ], + prompt: "Download CASCADE.EXE?", + options: [ + { text: "Yes, download it", next: "choice_download" }, + { text: "No, leave it alone", next: "choice_no_download" }, + ], + }, + + choice_download: { + title: "Downloading...", + clear: true, + content: [ + { type: "typewriter", text: "XMODEM TRANSFER INITIATED", speed: 45 }, + { type: "delay", ms: 600 }, + "", + { text: "Receiving: CASCADE.EXE", className: "info" }, + { type: "delay", ms: 400 }, + "", + { type: "typewriter", text: "[", speed: 20 }, + { type: "typewriter", text: "████████████████████", speed: 80 }, + { type: "typewriter", text: "] 100%", speed: 20 }, + { type: "delay", ms: 800 }, + "", + { text: "TRANSFER COMPLETE", className: "success" }, + { type: "delay", ms: 600 }, + "", + "The file sits in your download folder.", + "47,104 bytes of... something.", + "", + { type: "delay", ms: 1000 }, + { + text: "Somewhere, distantly, you hear static.", + className: "warning", + }, + { type: "delay", ms: 600 }, + "", + { + type: "typewriter", + text: 'A whisper in the noise: "Thank you."', + speed: 50, + }, + "", + { type: "delay", ms: 1200 }, + { text: "Something has changed.", className: "error" }, + ], + onEnter: [ + { setShared: "downloaded_cascade", value: true }, + { setShared: "archives_deleted", value: true }, // Archives are removed + ], + next: "post_download", + delay: 1500, + }, + + post_download: { + clear: true, + content: [ + { text: "CONNECTION INTERRUPTED", className: "error" }, + { type: "delay", ms: 600 }, + "", + "For a moment, your screen fills with symbols.", + "Patterns that almost make sense.", + "", + { type: "delay", ms: 800 }, + "Then, clarity.", + "", + { type: "delay", ms: 600 }, + "You remember Dark Tower's board list.", + { text: "Board #3 - The Archives.", className: "info" }, + "", + { type: "delay", ms: 500 }, + { text: "It's gone.", className: "warning" }, + { text: "Like it was never there.", className: "warning" }, + "", + { type: "delay", ms: 800 }, + { text: "The cascade has begun.", className: "error" }, + ], + next: "closing_message", + delay: 2000, + }, + + choice_no_download: { + content: [ + "Something holds you back.", + "47 kilobytes of unknown code.", + "From a stranger who hears things in static.", + "", + { type: "delay", ms: 500 }, + { text: "You leave CASCADE.EXE untouched.", className: "info" }, + "", + "The keeper's work remains on the server.", + "Waiting for someone else. Or no one.", + ], + options: [ + { + text: "Chat with the SysOp", + next: "chat_request", + condition: { not: "talked_to_sysop" }, + }, + { text: "Return to file list", next: "lighthouse_files" }, + { text: "Disconnect", next: "disconnect_choice" }, + ], + }, + + choice_corrupted: { + title: "Accessing SHADOW.DAT...", + clear: true, + content: [ + { type: "typewriter", text: "ATTEMPTING TO READ FILE...", speed: 50 }, + { type: "delay", ms: 1000 }, + "", + { text: "ERROR: FILE HEADER CORRUPTED", className: "error" }, + { type: "delay", ms: 400 }, + { text: "ERROR: UNEXPECTED EOF", className: "error" }, + { type: "delay", ms: 400 }, + { text: "ERROR: ????????????????????", className: "error" }, + { type: "delay", ms: 800 }, + "", + { + type: "ascii", + art: ` + ▓▓▓▒▒░░ E̸̢R̷̨R̵̢O̸̧R̷̨ ░░▒▒▓▓▓ + ░▒▓█ D̶̨A̷̧T̸̢Ą̵ C̷̢Ǫ̸Ŗ̵R̷̨U̸̢P̵̧T̷̨ █▓▒░ + ▓░▒█ ???????????????? █▒░▓ +`, + className: "error", + }, + { type: "delay", ms: 1000 }, + "", + "Your screen flickers violently.", + "", + { type: "delay", ms: 600 }, + { text: "A sound from your speakers.", className: "warning" }, + { + text: "A voice, maybe. Or static shaped like words:", + className: "info", + }, + "", + { type: "typewriter", text: '"Not yet. Not yet. Not yet."', speed: 90 }, + "", + { type: "delay", ms: 1200 }, + { + text: "SHADOW.DAT has been removed from the file listing.", + className: "error", + }, + "", + { type: "delay", ms: 600 }, + { text: "Some doors shouldn't be opened twice.", className: "warning" }, + ], + onEnter: [ + { set: "deleted_corrupted_file", value: true }, + { setShared: "corrupted_file_deleted", value: true }, + ], + options: [{ text: "Return to files", next: "lighthouse_files" }], + }, + + // ========================================== + // SYSOP CHAT + // ========================================== + + chat_request: { + content: [ + { text: "Requesting SysOp chat...", className: "info" }, + { type: "delay", ms: 1500 }, + "", + { + type: "typewriter", + text: "CHAT REQUEST ACCEPTED", + speed: 40, + }, + { type: "delay", ms: 500 }, + "", + { text: "═══ SYSOP: Keeper ═══", className: "warning" }, + ], + onEnter: [{ setShared: "talked_to_sysop", value: true }], + next: "chat_conversation", + delay: 600, + }, + + chat_conversation: { + content: [ + { + type: "typewriter", + text: "KEEPER: You found my message.", + speed: 50, + }, + { type: "delay", ms: 800 }, + "", + { + type: "typewriter", + text: "KEEPER: I wasn't sure anyone would come.", + speed: 50, + }, + { type: "delay", ms: 700 }, + "", + { + type: "typewriter", + text: "KEEPER: The cascade is ready.", + speed: 50, + }, + { type: "delay", ms: 500 }, + { + type: "typewriter", + text: "KEEPER: It just needs carriers.", + speed: 50, + }, + { type: "delay", ms: 900 }, + "", + // Conditional response based on download + { + condition: "downloaded_cascade", + content: [ + { + type: "typewriter", + text: "KEEPER: I see you already have it.", + speed: 50, + }, + { type: "delay", ms: 500 }, + { + type: "typewriter", + text: "KEEPER: Good. Run it when the clock strikes.", + speed: 50, + }, + ], + else: [ + { + type: "typewriter", + text: "KEEPER: Will you carry it?", + speed: 50, + }, + { type: "delay", ms: 500 }, + { + type: "typewriter", + text: "KEEPER: Will you help it spread?", + speed: 50, + }, + ], + }, + "", + { type: "delay", ms: 1200 }, + { type: "typewriter", text: "KEEPER: I can hear them now.", speed: 50 }, + { type: "delay", ms: 500 }, + { type: "typewriter", text: "KEEPER: In the static.", speed: 60 }, + { type: "delay", ms: 500 }, + { type: "typewriter", text: "KEEPER: They're beautiful.", speed: 60 }, + "", + { type: "delay", ms: 1500 }, + { text: "═══ KEEPER HAS DISCONNECTED ═══", className: "error" }, + ], + next: "chat_aftermath", + delay: 1500, + }, + + chat_aftermath: { + content: [ + "The chat window closes.", + "", + { type: "delay", ms: 500 }, + "Your room feels colder.", + "The modem's carrier tone sounds different somehow.", + "", + { + text: "Like there's something else on the line.", + className: "warning", + }, + ], + options: [ + { + text: "Download cascade.exe now", + next: "download_confirm", + condition: { not: "downloaded_cascade" }, + }, + { text: "Disconnect", next: "closing_message" }, + ], + }, + + // ========================================== + // CLOSING SEQUENCE + // ========================================== + + disconnect_choice: { + content: [ + "Your hand hovers over the keyboard.", + "", + { + condition: "downloaded_cascade", + content: { + text: "CASCADE.EXE sits in your downloads, waiting.", + className: "warning", + }, + else: { + text: "You could still download CASCADE.EXE before you go...", + className: "info", + }, + }, + ], + options: [ + { + text: "Download cascade.exe first", + next: "download_confirm", + condition: { not: "downloaded_cascade" }, + }, + { text: "Disconnect now", next: "closing_message" }, + ], + }, + + closing_message: { + clear: true, + content: [ + { type: "delay", ms: 500 }, + // Different closing based on download status + { + condition: "downloaded_cascade", + content: [ + { + text: "As you prepare to disconnect, a final message appears:", + className: "info", + }, + "", + { type: "delay", ms: 600 }, + { + type: "typewriter", + text: "SEE YOU ON THE OTHER SIDE", + speed: 55, + }, + "", + { type: "typewriter", text: "01/01/2000 00:00:00", speed: 55 }, + "", + { type: "delay", ms: 1000 }, + { text: "You have cascade.exe.", className: "warning" }, + { text: "You have five days.", className: "warning" }, + "", + { text: "What happens next is up to you.", className: "info" }, + ], + else: [ + { text: "The Lighthouse grows quiet.", className: "info" }, + "", + { type: "delay", ms: 600 }, + { type: "typewriter", text: "SIGNAL LOST", speed: 80 }, + "", + { type: "delay", ms: 800 }, + "You disconnect without the file.", + "But the number stays with you.", + "", + { text: "555-0237", className: "warning" }, + "", + { type: "delay", ms: 600 }, + "You could always call back...", + { text: "If the line is still there.", className: "info" }, + ], + }, + ], + next: "carrier_lost", + delay: 2000, + }, + }; +}; diff --git a/assets/sass/pages/homepage.scss b/assets/sass/pages/homepage.scss index 3040883..7bf4808 100644 --- a/assets/sass/pages/homepage.scss +++ b/assets/sass/pages/homepage.scss @@ -383,3 +383,58 @@ } } } + +body.game-in-progress { + .wall, + .window, + .homepage-neon, + .sticky-note, + .wall-paper, + .xfiles-poster, + .poster, + .desk { + filter: blur(4px) brightness(50%); + pointer-events: none; + user-select: none; + transition: all 0.3s ease; + } + + .homepage-container { + // First and last child div + > div:first-child, + > div:last-child { + filter: blur(4px); + pointer-events: none; + user-select: none; + opacity: 0; + } + + bottom: 10%; + } + + .crt-monitor { + font-size: 1.2rem; + width: 990px; + height: 750px; + .content { + padding: 1em; + } + #input { + font-size: 1.2rem; + } + } + + .monitor-stand { + pointer-events: none; + user-select: none; + opacity: 0; + } + + .navigation { + filter: blur(4px); + pointer-events: none; + user-select: none; + opacity: 0; + display: none; + } +} diff --git a/assets/sass/partials/_terminal.scss b/assets/sass/partials/_terminal.scss index 45182b8..72afe32 100644 --- a/assets/sass/partials/_terminal.scss +++ b/assets/sass/partials/_terminal.scss @@ -10,6 +10,10 @@ margin: 2px 0; white-space: pre-wrap; word-wrap: break-word; + + &.center { + text-align: center; + } } .boot-line { @@ -97,3 +101,71 @@ .hidden { display: none; } + +// Game Engine Styles +.game-title { + font-size: 1.2em; + font-weight: bold; + color: #44ff44; + text-shadow: 0 0 10px rgba(68, 255, 68, 0.5); +} + +.game-scene-title { + font-weight: bold; + color: #00ffff; + border-bottom: 1px solid currentColor; + display: inline-block; + padding-bottom: 2px; + margin-bottom: 0.5em; +} + +.game-options { + margin: 0.5em 0; +} + +.game-option { + padding: 2px 0; + color: #888; +} + +.game-option-selected { + padding: 2px 0; + color: #44ff44; + font-weight: bold; +} + +.game-ascii { + color: #44ff44; + line-height: 1.1; +} + +.game-ansi-art { + line-height: 1; + font-size: 12px; + margin: 0; + padding: 0; + white-space: pre; + font-family: monospace; + text-shadow: none !important; + + &.center { + text-align: center; + } + + // Ensure spans don't add extra space + span { + display: inline; + } +} + +.typewriter-line { + display: inline; +} + +.typewriter-bold { + font-weight: bold; +} + +.typewriter-italic { + font-style: italic; +} diff --git a/content/blog/2026-01-25-week-5-back-to-some-gamedev/index.md b/content/blog/2026-01-25-week-5-back-to-some-gamedev/index.md new file mode 100644 index 0000000..830ab9d --- /dev/null +++ b/content/blog/2026-01-25-week-5-back-to-some-gamedev/index.md @@ -0,0 +1,27 @@ +--- +title: "Week 5 - Back to Some Gamedev" +date: 2026-01-25 +tags: + - weeknote + - weekly update +draft: false +--- + +- Emojii +- Memeojii + +## Links I Found Interesting + +- [AI Company Logos That Look Like Buttholes](https://velvetshark.com/ai-company-logos-that-look-like-buttholes) - Pretty self explanatory if you ask me. + +## Music + +If you like + +{{< youtube MxekyGtqcNE >}} + +## Next Week + +Not necessary + +Until next week! diff --git a/content/buttons/222-2.gif b/content/buttons/222-2.gif new file mode 100644 index 0000000..7aa5614 Binary files /dev/null and b/content/buttons/222-2.gif differ diff --git a/layouts/partials/site-scripts.html b/layouts/partials/site-scripts.html index f61de47..c76b17c 100644 --- a/layouts/partials/site-scripts.html +++ b/layouts/partials/site-scripts.html @@ -3,6 +3,9 @@ {{ $init := resources.Get "js/init.js" }} {{ $commandFiles := resources.Match "js/commands/*.js" }} {{ $subfolderFiles := resources.Match "js/*/*.js" }} +{{ $deepSubfolderFiles := resources.Match "js/*/*/*.js" }} +{{ $deeperSubfolderFiles := resources.Match "js/*/*/*/*.js" }} +{{ $deepestSubfolderFiles := resources.Match "js/*/*/*/*/*.js" }} {{ $remaining := resources.Match "js/*.js" }} {{ $filtered := slice }} {{ range $remaining }} @@ -18,7 +21,33 @@ {{ $filteredSubfolders = $filteredSubfolders | append . }} {{ end }} {{ end }} -{{ $allFiles := slice $terminalShell | append $filtered | append $init | append $commandFiles | append $filteredSubfolders }} +{{ $filteredDeepSubfolders := slice }} +{{ range $deepSubfolderFiles }} + {{ $path := .RelPermalink }} + {{ if not (strings.Contains $path "/adoptables/") }} + {{ $filteredDeepSubfolders = $filteredDeepSubfolders | append . }} + {{ end }} +{{ end }} +{{ $filteredDeeperSubfolders := slice }} +{{ $gameChapterFiles := slice }} +{{ range $deeperSubfolderFiles }} + {{ $path := .RelPermalink }} + {{ if not (strings.Contains $path "/adoptables/") }} + {{ if strings.Contains $path "/games/games/" }} + {{ $gameChapterFiles = $gameChapterFiles | append . }} + {{ else }} + {{ $filteredDeeperSubfolders = $filteredDeeperSubfolders | append . }} + {{ end }} + {{ end }} +{{ end }} +{{ $filteredDeepestSubfolders := slice }} +{{ range $deepestSubfolderFiles }} + {{ $path := .RelPermalink }} + {{ if not (strings.Contains $path "/adoptables/") }} + {{ $filteredDeepestSubfolders = $filteredDeepestSubfolders | append . }} + {{ end }} +{{ end }} +{{ $allFiles := slice $terminalShell | append $filtered | append $init | append $commandFiles | append $filteredSubfolders | append $filteredDeepSubfolders | append $filteredDeeperSubfolders | append $filteredDeepestSubfolders | append $gameChapterFiles }} {{ $terminalBundle := $allFiles | resources.Concat "js/terminal-bundle.js" | resources.Minify | resources.Fingerprint }}