From a1d1baa869645e72c9de3ee7dd145f8a362313ce Mon Sep 17 00:00:00 2001 From: Artvasil09 Date: Thu, 22 Oct 2026 16:24:22 +0300 Subject: [PATCH] feat: complete engine and editor subsystems (Stages 1-5 from TODO_ARTEM) - Stage 1: Eliminate fish-eye distortion with precomputed tangential ray offset table and fractional DDA depth - Stage 2: Full asset management in EblanStudio (stb_image/stb_image_write, 128x128 BGRA texture packaging, WAV sound manager) - Stage 3: Multi-level room streaming, LevelTransition/CELL_PORTAL trigger system, 16-frame screen fade to black - Stage 4: 60Hz cutscene engine in pure x86 ASM (v4 binary track, waypoint camera motion, shortest-arc pan, CP1251 Russian subtitles, letterbox overlay, audio) - Stage 5: EblanStudio cutscene timeline (F6) and windowless Live ASM Viewport over shared-memory IPC directly rendered into DX11 - Tooling & Tests: comprehensive regression test suite (94 editor + 107 engine tests), IPC tests, and cutscene demo --- AGENTS.md | 50 +- README.md | 33 +- TODO_ARTEM.md | 74 +- assets/map.dat | Bin 1830 -> 1872 bytes assets/sounds/sounds.inc | 3 + assets/sounds/sounds.txt | 1 + assets/sublevel_02.dat | Bin 0 -> 1176 bytes build.bat | 7 + docs/ENGINE_ARCHITECTURE.md | 67 +- editor/assets/map.dat | Bin 1086 -> 1872 bytes editor/assets/sublevel_02.dat | Bin 0 -> 1176 bytes editor/build_editor.bat | 4 +- editor/editor.exe | Bin 896512 -> 1213440 bytes editor/imgui.ini | 21 +- editor/src/cutscene_format.h | 96 + editor/src/cutscene_preview.h | 60 + editor/src/editor_app.cpp | 1577 +++- editor/src/editor_app.h | 98 +- editor/src/editor_cutscene.inl | 343 + editor/src/editor_viewport.inl | 186 + editor/src/level_format.h | 50 +- editor/src/level_io.h | 116 + editor/src/main.cpp | 21 + editor/src/preview_protocol.h | 28 + editor/src/stb_image.h | 7988 +++++++++++++++++ editor/src/stb_image_write.h | 1724 ++++ engine.exe | Bin 12288 -> 20480 bytes examples/cutscene_demo/README.md | 15 + examples/cutscene_demo/assets/map.dat | Bin 0 -> 1664 bytes examples/cutscene_demo/assets/second_room.dat | Bin 0 -> 1152 bytes .../cutscene_demo/assets/sounds/chime.wav | Bin 0 -> 16044 bytes examples/cutscene_demo/run_demo.bat | 3 + include/engine_cutscene.inc | 583 ++ include/engine_data.inc | 93 +- include/engine_defs.inc | 51 +- include/engine_input.inc | 121 +- include/engine_map.inc | 840 +- include/engine_math.inc | 43 +- include/engine_physics.inc | 36 + include/engine_preview.inc | 150 + include/engine_raycaster.inc | 480 +- include/engine_textures.inc | 281 +- main.asm | 126 +- main.obj | Bin 15403 -> 31105 bytes tests/cutscene_editor_checks.inl | 88 + tests/cutscene_engine_checks.inc | 211 + tests/editor_regressions.cpp | 157 + tests/engine_regressions.asm | 370 + tests/playtest_stub.cpp | 6 + tests/viewport_editor_checks.inl | 65 + tools/make_cutscene_demo.py | 46 + tools/make_texturepack.py | 14 +- tools/test_preview_ipc.py | 87 + tools/test_regressions.py | 194 + 54 files changed, 16131 insertions(+), 476 deletions(-) create mode 100644 assets/sounds/sounds.inc create mode 100644 assets/sounds/sounds.txt create mode 100644 assets/sublevel_02.dat create mode 100644 editor/assets/sublevel_02.dat create mode 100644 editor/src/cutscene_format.h create mode 100644 editor/src/cutscene_preview.h create mode 100644 editor/src/editor_cutscene.inl create mode 100644 editor/src/editor_viewport.inl create mode 100644 editor/src/level_io.h create mode 100644 editor/src/preview_protocol.h create mode 100644 editor/src/stb_image.h create mode 100644 editor/src/stb_image_write.h create mode 100644 examples/cutscene_demo/README.md create mode 100644 examples/cutscene_demo/assets/map.dat create mode 100644 examples/cutscene_demo/assets/second_room.dat create mode 100644 examples/cutscene_demo/assets/sounds/chime.wav create mode 100644 examples/cutscene_demo/run_demo.bat create mode 100644 include/engine_cutscene.inc create mode 100644 include/engine_preview.inc create mode 100644 tests/cutscene_editor_checks.inl create mode 100644 tests/cutscene_engine_checks.inc create mode 100644 tests/editor_regressions.cpp create mode 100644 tests/engine_regressions.asm create mode 100644 tests/playtest_stub.cpp create mode 100644 tests/viewport_editor_checks.inl create mode 100644 tools/make_cutscene_demo.py create mode 100644 tools/test_preview_ipc.py create mode 100644 tools/test_regressions.py diff --git a/AGENTS.md b/AGENTS.md index 0fb83a6..58082c2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,7 +6,7 @@ - **Language**: Pure x86 Assembly (MASM32 / MSVC `ml.exe`). - **Dependencies**: Windows API only (`kernel32.lib`, `user32.lib`, `gdi32.lib`, `winmm.lib`). No external DLLs, DirectX, OpenGL, or C runtimes. - **Rendering**: Software DIBits raycaster (Wolfenstein 3D style DDA grid stepping, texture mapping, distance shading, billboard sprites, 2D UI canvas with 8x8 bitmap font). -- **Coordinate Space**: 16.16 signed fixed-point math (`FixedMul`, `FixedDiv`). Trigonometry via 512-entry precomputed lookup tables (`tableSin`, `tableCos`). +- **Coordinate Space**: Player/entity positions are raw world units (64 per cell). Trigonometry and sprite scale use 16.16; DDA distances retain 8 fractional bits (24.8) until projection. Trigonometry uses 512-entry lookup tables. --- @@ -137,7 +137,7 @@ invoke DrawNumber8x8, 120, 42, playerHealth, COLOR_WHITE The engine supports both procedural default generation and binary level loading. When `assets/map.dat` exists, `LoadMapBinary` in `include/engine_map.inc` automatically loads it: - **Header (`MapHeader`, 38 bytes, packed)**: - `magic` (uint32): `0x4E4C4245` ("EBLN") - - `version` (uint16): `2` (v1 legacy: sprite coords are 16.16 fixed, converted on load) + - `version` (uint16): `4` (readers also accept v1 fixed sprite coordinates and v2/v3 raw-coordinate maps, including early v2 maps with transitions) - `mapWidth` (uint16): `32` - `mapHeight` (uint16): `32` - `playerStartX` (uint16): cell X coordinate (e.g. 2) @@ -146,13 +146,23 @@ The engine supports both procedural default generation and binary level loading. - `spriteCount` (uint16): count of sprite entries - `ceilingColor` (uint32): 00RRGGBBh - `floorColor` (uint32): 00RRGGBBh - - `reserved[12]` (bytes): reserved padding + - `transitionCount` (uint16): 0..16 (v1 ignores this formerly reserved field) + - `cutsceneCount` (uint16): 0..128 commands (offset 28, v4 only) + - `cutsceneStringCount` (uint16): 0..32 strings (offset 30, v4 only) + - `cutsceneFlags` (uint16): bit 0 = autoplay on room entry (offset 32, v4 only) + - `reserved[4]` (bytes): reserved padding - **Grid Data**: `32 * 32 = 1024` bytes (row-major order). Cell value = texture slot (1 brick, 2 wood, 3 stone, 4 metal, 5 door, 7 pillar, 8 glass, 9 marble). - **Sprite Array**: `spriteCount * 24` bytes (`SpriteStruct`: `x`, `y` in raw world units, `textureId`, `scale` 16.16, `dist`, `flags`). +- **Transition Array**: `transitionCount * 42` bytes (`LevelTransition` in both `engine_defs.inc` and `editor/src/level_format.h`). Target names are ASCII basenames, 5..31 bytes including `.dat`, with a terminating NUL inside `targetMap[32]`. Put linked maps in the same assets directory. Triggers must be unique and occupy empty, open-door or portal cells; every portal cell needs a transition. +- Files are validated completely before replacing the active room. Counts above capacity, truncated/extra payload, invalid coordinates/scales, blocked spawns and invalid transition names are rejected. Black ceiling/floor colors are valid. A failed runtime transition keeps the current room; a failed startup load creates the procedural map. +- **Cutscene Array (v4)**: after transitions, `cutsceneCount * 16` bytes; followed by `cutsceneStringCount * 96` bytes of NUL-terminated CP1251 strings. No serialized pointers. Earlier versions ignore the new header fields and load an empty track. +- New saves use v4 without rewriting existing map files until explicitly saved. Sprite positions must remain inside the map; scales accepted by loaders are 0..16.0 (0 keeps the legacy 1.0 behavior). Human users can design levels visually using `run_editor.bat` (`editor/editor.exe`, written in C++17 + ImGui + DirectX 11), with 1-click Playtest (F5). AI agents can directly read or write `assets/map.dat` following this specification. +F5 copies neighboring maps and resources into a dedicated temporary directory, writes the current unsaved map there under its original filename, validates all reachable destinations, and launches `engine.exe "assets\selected-map.dat"`. It never replaces the source `assets/map.dat` or changes the editor's current file path. Starting the engine without an argument still loads `assets/map.dat`. + ### F. Texture Pack (`assets/textures/texturepack.bin`) At startup the engine always generates procedural textures first, then `LoadTexturePack` tries to override them from `assets/textures/texturepack.bin`: @@ -163,3 +173,37 @@ Rebuild the pack from the KAZIK 48-slot atlas (`casino3d-hd.bin`) or fully proce python tools\make_texturepack.py ``` If the pack is missing or invalid, the engine silently keeps procedural textures. +The loader stages and validates the complete pack before replacing pixels. Slots 10..15 are sprite slots; `CELL_PORTAL` uses a separate `portalTextureBuffer`, so importing slot 10 never changes portals. First import creates missing directories and seeds untouched slots with procedural defaults. Import/reset writes are atomic; an invalid existing pack is preserved and reported to the user. + +### G. Regression Checks +Run `python tools\test_regressions.py` on Windows with the build toolchains installed. The scenarios compile the real editor logic and ASM procedures, exercise file I/O, playtest isolation, transitions, keyboard edges, renderer geometry, cutscene validation and editor undo in TEMP, and verify that project assets remain unchanged. C++ preview and ASM camera/angle/fade/subtitle states are compared frame by frame. Use `--keep` to retain generated framebuffers and fixtures. These checks do not replace a manual UI playtest. + +### H. Cutscenes (v4) +`include/engine_cutscene.inc` owns validation, playback and overlays. `CutsceneEvent` is packed: `uint16 tickTimestamp`, `uint8 opCode`, `uint8 param8`, `int32 paramA`, `int32 paramB`, `int32 dataId`. Time uses 60 Hz ticks, timestamps 0..65535, individual durations 0..3600 ticks. Commands are sorted by timestamp; a nonempty track ends with a single final END. + +| Opcode | paramA | paramB | dataId / param8 | +|---|---|---|---| +| 0 END | ignored | ignored | Returns control, retains camera pose | +| 1 WAIT | duration | ignored | Delays dispatch; existing tweens continue | +| 2 MOVE_CAM_TO | raw world X | raw world Y | dataId = duration (0 snaps) | +| 3 PAN_CAM_TO | target angle 0..511 | duration | Shortest arc | +| 4 SHOW_SUBTITLE | string index | duration (0 persistent) | CP1251, up to 95 characters | +| 5 HIDE_SUBTITLE | ignored | ignored | Clears subtitle | +| 6 PLAY_SOUND | string index, or -1 to stop | ignored | param8 bit 0 = loop | +| 7 FADE_SCREEN | darkness 0..16 | duration | 0 clear, 16 black | +| 8 CHANGE_SUBLEVEL | transition index | ignored | Uses existing transition destination/spawn/fade | + +MOVE and PAN interpolate linearly using signed integer math. Camera endpoints must be walkable; movement segments ignore collisions. Each tick advances existing tweens, expires text and waits, then dispatches due commands in stored order. Same-timestamp commands can start independent movement, pan and fade together. WAIT delays overdue commands without shifting their timestamps. A replacement tween starts from the current pose. + +Autoplay begins after a room transition finishes. C starts/replays the current map's track; Tab skips it. Movement/actions are blocked during playback. End/skip/level changes stop cinematic sound, clear subtitles and fade, and return control at the current camera pose. Letterbox is 2.35:1, subtitles use up to 3 centered rows of 38 glyphs over a half-brightness panel. WAV names are ASCII basenames of up to 63 characters in `assets/sounds`; playback uses one asynchronous PlaySound channel. + +F6 opens EblanStudio's timeline. Author commands with buttons, drag diamonds to change timestamps, select overlapping events through the command list, and place MOVE points by clicking the map. The inspector edits parameters and strings. Autoplay, scene data and strings participate in save/load and undo/redo. Preview shows the actual game perspective in the embedded viewport with the camera path on the map; F5 runs the full game, validates referenced WAV files and stages them with linked maps. Editor preview stops at a level-change command. F5/F6 are handled before ImGui keyboard-capture checks. + +`examples/cutscene_demo/run_demo.bat` runs an isolated two-room example with camera waypoints, Russian subtitles, WAV, fades and a scripted transition. Regenerate it with `python tools/make_cutscene_demo.py`. + +### I. Embedded Game View +The x64 editor uses a windowless x86 `engine.exe --preview:Local\EblanPreview-...` process to execute the actual `Render3DScene`, cinematic overlay and fade procedures. No duplicate raycaster. `editor/src/preview_protocol.h` and `include/engine_preview.inc` define a versioned 1,357,792-byte shared-memory mailbox: 128-byte header, 1024 cells, 32 sprites, a 96-byte CP1251 subtitle, 16 texture slots and a 320x240 DIB frame. Header state is 0 idle, 1 engine owns payload, 2 editor owns result, 3 shutdown. Publish with InterlockedExchange/xchg; never modify payload while state is 1. All fields are fixed-width; do not put pointers or size_t into the wire layout. + +The renderer validates camera and sprite bounds, uploads textures only when their revision changes, and exits if its parent process ends. The editor has process-exit/timeout checks and a retry button, converts DIB padding to opaque alpha, uploads BGRA to DX11 and displays with point sampling at 4:3. Map/inspector changes appear without saving. Timeline playback/scrubbing drives the viewport camera, subtitles and fade. Free-camera inspection affects no authored data. The viewport shows the scene and cinematic overlays; normal game HUD, door interactions and room switching are tested in F5. + +`tools/test_preview_ipc.py` exercises the actual renderer without a visible window. The full regression suite also checks the x86-to-x64-to-DX11 path on a WARP device and compares the live viewport's pixels with a direct ASM rendering. Build engine.exe before running these tests. diff --git a/README.md b/README.md index e36c226..4b7650e 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,8 @@ engine.exe | **Shift** | Спринт (ускорение) | | **E / Пробел** | Взаимодействие (открыть/закрыть дверь перед собой) | | **M** | Включить/выключить миникарту (радар) | +| **C** | Запустить или повторить кат-сцену текущей карты | +| **Tab** | Пропустить кат-сцену | | **Escape** | Выход из игры | --- @@ -64,8 +66,10 @@ engine.exe Движок оснащен нативным высокопроизводительным визуальным редактором уровней в стиле Unity / Godot 4: - Написан на **C++17 + Dear ImGui + DirectX 11**. - Запуск в 1 клик через `run_editor.bat` или `editor/editor.exe`. -- **Мгновенный плейтест (F5)**: редактор автоматически сериализует уровень в бинарный формат `assets/map.dat` и запускает ассемблерный движок `engine.exe`. +- **Мгновенный плейтест (F5)**: редактор создаёт временную копию связанных карт и ресурсов и запускает `engine.exe` с выбранной стартовой картой. Несохранённые изменения попадают в копию; исходные карты и путь текущего файла не меняются. - **Undo/Redo (Ctrl+Z / Ctrl+Y)** — история до 64 действий (сетка, спавн, цвета, спрайты). +- **Кат-сцены (F6)** — таймлайн камеры, поворотов, субтитров, WAV, затемнений и переходов. Правки сцены также поддерживают Undo/Redo. +- **Игровой вид в редакторе** — режимы «Рядом», «Игровой вид» и «Карта». Изображение рисует тот же ASM-рендерер, что и игра; изменения стен, спрайтов, цветов и импортированных текстур видны без F5. Кликните по игровому виду для осмотра: WASD, стрелки, Shift; правая кнопка мыши поворачивает камеру. Обзор не меняет спавн или ключи кат-сцены. - **Файловые диалоги Windows**: Ctrl+O (открыть), Ctrl+S (сохранить), Ctrl+Shift+S (сохранить как). - Инструменты: - **Кисть [B]**: рисование стен выбранного типа (Кирпич, Дерево, Камень, Металл, Дверь, Колонна, Стекло, Мрамор). @@ -104,3 +108,30 @@ build_editor.bat - `include/engine_render2d.inc` — примитивы (DrawPixel, Rect, Outline), шрифт 8x8, миникарта. - `include/font8x8.inc` — битовые маски ASCII-символов. - `AGENTS.md` — подробное руководство для AI-агентов по написанию новых игр на этом движке. + + +## Переходы и проверка первых трёх этапов + +Карты новых сохранений используют EBLN v4; существующие v1/v2/v3 продолжают читаться. Связанные `.dat` лежат в одной папке. В портале задаётся ASCII-имя файла до 31 символа, целевой спавн, угол и затемнение. На карту доступно до 16 переходов. Заливка учитывает этот лимит целиком; удаление клетки удаляет её триггер. Чёрный пол и потолок поддерживаются. + +Порталы имеют отдельную текстуру и не занимают слот фонаря. Первый импорт изображения создаёт недостающие папки и пакет со стандартными текстурами в остальных слотах. Повреждённый пакет не перезаписывается импортом; ошибка показывается в строке состояния. Неудачный переход сохраняет текущую комнату и показывает сообщение в игре. + +Проверки без изменения карт проекта: +```cmd +python tools\test_regressions.py +``` +Для сохранения тестовых кадров добавьте `--keep`. Нужны MASM32, MSVC BuildTools и Windows SDK. + +## Кат-сцены: этапы 4 и 5 + +В EblanStudio нажмите **F6** и добавьте команды кнопками таймлайна. Для движения камеры укажите точку на карте и длительность в кадрах (60 кадров = секунда). Поворот, движение, субтитры и затемнение можно запускать одновременно. Ромбы перетаскиваются по времени; список «Команда» позволяет выбрать события с одинаковым временем. Параметры выбранной команды редактируются справа. Конец сцены добавляется автоматически. + +«При входе» включает автозапуск после загрузки комнаты. Кнопка «Предпросмотр» и ползунок кадра показывают пролёт в игровом виде редактора, включая субтитры, чёрные полосы и затемнение. На карте одновременно видна траектория. Выбор «Камера сцены» возвращает вид к таймлайну после свободного осмотра. **F5** запускает полную игру с временной копией карт и звуков. Для команды перехода сначала создайте портал, затем выберите его в инспекторе. WAV можно импортировать через меню ассетов; имя файла должно быть ASCII. + +Камера движется линейно между точками, поворачивается по кратчайшей дуге и во время пролёта проходит сквозь стены. Конечные точки должны лежать в свободных клетках. Доступна одна сцена на карту, до 128 команд и 32 строк по 95 символов CP1251. На экране помещаются 3 строки субтитров по 38 символов. Звуки используют один канал: новый WAV заменяет предыдущий, завершение или пропуск сцены останавливает его. Tab возвращает управление в текущей точке камеры. + +Готовый пример: [examples/cutscene_demo/README.md](examples/cutscene_demo/README.md). После сборки запустите `examples\cutscene_demo\run_demo.bat`: вступление с русскими субтитрами, WAV и затемнением переводит камеру во вторую комнату. Пример хранится отдельно от основных карт проекта. + +Предпросмотр останавливается на команде перехода в другую комнату; цепочка комнат и игровой ввод проверяются через F5. F5/F6 работают при фокусе интерфейса и текстовых полей. Ошибка запуска показывается отдельным сообщением. При старте редактор открывает карту проекта относительно своего файла, поэтому запуск из другой рабочей папки не ломает пути. + +Формат v4 и параметры команд описаны в [AGENTS.md](AGENTS.md) и [архитектуре движка](docs/ENGINE_ARCHITECTURE.md). Сценарии регрессии также проверяют сохранение/загрузку трека, повреждённые команды, Undo/Redo, упаковку WAV для F5, горячие клавиши при фокусе в интерфейсе, покадровое совпадение состояния C++ с ASM, передачу кадров в DX11 и точное совпадение пикселей игрового вида с движком. Перед запуском проверок соберите `engine.exe` через `build.bat`. diff --git a/TODO_ARTEM.md b/TODO_ARTEM.md index d8693bb..6d24b38 100644 --- a/TODO_ARTEM.md +++ b/TODO_ARTEM.md @@ -5,6 +5,34 @@ --- +## Проверка реализации этапов 1–3 — 21.10.2026 + +- Этап 1: тангенциальные углы лучей, единственная косинусная коррекция, DDA с 8 дробными битами до проекции. В регрессионной сцене прямая стена имеет одинаковую глубину во всех 320 столбцах. +- Этап 2: PNG/JPG/BMP, BGRA и хромакей, безопасное создание и обновление пакета, стандартные слоты при первом импорте, WAV и манифесты. Портал не использует слот фонаря. +- Этап 3: EBLN v3 с чтением v1/v2, полная проверка перед заменой комнаты, обработка ошибочного перехода, спавны, затемнение и защита от повторного срабатывания при появлении в портале. F5 работает с временной копией карт и ресурсов. +- Регрессионные проверки: `python tools/test_regressions.py`. Ручная проверка интерфейса и длительный игровой прогон остаются отдельной проверкой качества. +- Этапы 4 и 5 реализованы следующим изменением, см. статус ниже. + +## Реализация этапов 4–5 — 22.10.2026 + +- Этап 4: бинарный трек EBLN v4, чистый ASM, линейные пролёты по точкам, повороты по кратчайшей дуге, паузы, русские субтитры CP1251, letterbox 2.35:1, WAV, затемнения и переходы. Автозапуск при входе, C для повтора и Tab для пропуска; управление игроком блокируется на время сцены. Старые карты v1/v2/v3 читаются. +- Этап 5: F6 открывает таймлайн с дорожками, перетаскиванием ключей, списком команд, инспектором, установкой точек на карте, автозапуском, Undo/Redo и сохранением. Предпросмотр и перемотка показывают сцену глазами камеры во встроенном игровом виде, а на карте — траекторию. F5 запускает полную игру и связанные комнаты с проверкой WAV. +- Пример `examples/cutscene_demo/run_demo.bat` показывает пролёт, текст, звук и переход во вторую комнату; основные карты проекта он не меняет. +- Регрессионный набор расширен проверками формата v4, проигрывателей ASM/C++, оверлея, переходов, редактора и покадрового совпадения состояния. +- Уточнения исходного ТЗ: сериализуемый `dataPtr` заменён на `dataId`, строки хранятся в отдельном пуле; движение задаётся длительностью. Использованы линейные waypoints, камера во время пролёта не сталкивается со стенами. WAV воспроизводится одним каналом PlaySoundA без внешних библиотек. + +## Завершение редактора и исправление F5 — 22.10.2026 + +- Встроен игровой вид, который получает кадры от настоящего ASM-рендерера. Доступны режимы «Рядом», «Игровой вид», «Карта», свободный осмотр и камера таймлайна. Изменения стен, цветов, спрайтов и текстур видны без сохранения. +- Исправлена блокировка F5/F6 при захвате клавиатуры интерфейсом ImGui. Ошибки запуска показываются отдельным диалогом. Начальная карта открывается относительно расположения редактора, независимо от рабочей папки. +- Автопроверки проверяют горячие клавиши с фокусом в интерфейсе, реальную передачу кадров из x86 ASM в x64 редактор и DX11, обновление геометрии, перемотку кат-сцены, точное совпадение пикселей с отдельным движком и освобождение процесса рендерера. +- Все пять этапов реализованы. Предпросмотр редактора останавливается на команде перехода между комнатами; полный сценарий переходов и игровой ввод доступны через F5. Это ограничение предпросмотра, а не отсутствие переходов в движке. +- Итоговая проверка: 94/94 сценария редактора и 107/107 сценариев ASM, совпадение всех 320 углов лучей, покадровое совпадение проигрывателей и точное совпадение пикселей встроенного вида с движком. Обе программы пересобраны. Исходные ресурсы проекта при проверках остались без изменений. Ручное управление окнами было остановлено пользователем через Esc; полный визуальный прогон интерфейса не завершён. + +Разделы ниже сохраняют исходное ТЗ и описание прежних проблем как историю требований. Актуальные формат и поведение описаны в `AGENTS.md` и `docs/ENGINE_ARCHITECTURE.md`. + +--- + ## 📋 Оглавление 1. [Задача 1: Устранение Fish-Eye эффекта и фикс рендера](#задача-1-устранение-fish-eye-эффекта-и-фикс-рендера) 2. [Задача 2: Полноценный импорт ассетов в EblanStudio](#задача-2-полноценный-импорт-ассетов-в-eblanstudio) @@ -14,7 +42,7 @@ --- -## Задача 1: Устранение Fish-Eye эффекта и фикс рендера +## Задача 1: Устранение Fish-Eye эффекта и фикс рендера [ВЫПОЛНЕНО / DONE] ### 1.1. Суть проблемы в текущем коде В файле [`include/engine_raycaster.inc`](include/engine_raycaster.inc) лучи выпускаются с равномерным шагом угла: @@ -57,7 +85,7 @@ $$\theta_x = \text{playerAngle} + \arctan\left(\left(\frac{2x}{\text{SCREEN\_W}} --- -## Задача 2: Полноценный импорт ассетов в EblanStudio +## Задача 2: Полноценный импорт ассетов в EblanStudio [ВЫПОЛНЕНО / DONE] ### 2.1. Требования У Артема и дизайнеров уровней должна быть возможность в пару кликов мыши в редакторе загружать свои изображения (PNG) и звуки (WAV) без ручного запуска сторонних питоновских скриптов. @@ -84,17 +112,19 @@ $$\theta_x = \text{playerAngle} + \arctan\left(\left(\frac{2x}{\text{SCREEN\_W}} --- -## Задача 3: Многоуровневые локации и стриминг подуровней +--- + +## Задача 3: Многоуровневые локации и стриминг подуровней [ВЫПОЛНЕНО / DONE] ### 3.1. Секторно-комнатная модель уровней Вместо одной изолированной сетки $32 \times 32$ мир организуется как **граф связанных секторов (комнат)**. -- Каждый сектор — это отдельный бинарный файл подуровня (например, `sublevel_01.dat`, `sublevel_02.dat`) со своей сеткой $32 \times 32$, цветами пола/потолка и локальными спрайтами. +- Каждый сектор — это отдельный бинарный файл подуровня (например, `map.dat`, `sublevel_02.dat`) со своей сеткой $32 \times 32$, цветами пола/потолка и локальными спрайтами. - Сектора соединяются **Порталами / Дверями перехода (Sector Portals)**. ### 3.2. Структура данных перехода (Portal Transition) -В заголовок или массив сущностей карты добавляется тип `CellType::CELL_PORTAL`: +В заголовок и сущности карты добавлен тип `CELL_PORTAL = 10` и структура: ```cpp -// Структура перехода между подуровнями +// Структура перехода между подуровнями (42 байта packed) struct LevelTransition { uint8_t triggerCellX; // Координата X двери/триггера в текущем секторе uint8_t triggerCellY; // Координата Y двери/триггера в текущем секторе @@ -103,23 +133,29 @@ struct LevelTransition { uint16_t targetSpawnY; // Точка появления в новом секторе (Y) uint16_t targetAngle; // Направление взгляда после перехода uint8_t fadeEffect; // 0 = мгновенно, 1 = затемнение экрана (Fade to Black) + uint8_t reserved; // Выравнивание }; ``` ### 3.3. Логика динамической подгрузки и выгрузки в Ассемблере В [`include/engine_map.inc`](include/engine_map.inc): -1. **Процедура перехода `SwitchSublevel(szNextMap, spawnX, spawnY, spawnAngle)`**: - - **Шаг 1 (Fade Out)**: Плавное затемнение буфера экрана `screenBuffer` за 10-15 кадров (уменьшение яркости RGB). - - **Шаг 2 (Unload)**: Очистка текущих спрайтов (`mov spriteCount, 0`), сброс флагов дверей. - - **Шаг 3 (Load)**: Чтение нового файла карты в `gameMap`, обновление цветов неба/пола (`mapCeilingColor`, `mapFloorColor`), загрузка массива спрайтов нового сектора. +1. **Процедура перехода `SwitchSublevel(szNextMap, spawnX, spawnY, spawnAngle, fadeEffect)`**: + - **Шаг 1 (Fade Out)**: Плавное затемнение буфера экрана `screenBuffer` за 16 кадров с помощью целочисленного масштабирования цветовых каналов RGB. + - **Шаг 2 (Unload)**: Очистка текущих спрайтов (`mov spriteCount, 0`), сброс флагов и переходных триггеров. + - **Шаг 3 (Load)**: Чтение нового файла карты через `LoadSublevelBinary` в `gameMap`, обновление цветов неба/пола (`mapCeilingColor`, `mapFloorColor`), загрузка массива спрайтов нового сектора. - **Шаг 4 (Spawn)**: Установка новых координат игрока `playerX = spawnX * 64 + 32`, `playerY = spawnY * 64 + 32`, `playerAngle = spawnAngle`. - - **Шаг 5 (Fade In)**: Плавное осветление экрана. -2. **Память**: - - Оперативная память остается постоянной (~1-2 МБ), старые комнаты полностью освобождают буферы, что позволяет создавать гигантские замки и комплексы из сотен связанных комнат. + - **Шаг 5 (Fade In)**: Плавное 16-кадровое осветление экрана. +2. **Память и производительность**: + - Постоянный объем оперативной памяти (~1-2 МБ), буферы очищаются и заполняются новым сектором на лету, позволяя создавать бесконечные цепочки и комплексы комнат. + - Во время обычного геймплея оверхед пост-процесса затемнения равен нулю (`cmp fadeState, 0; je fade_done`). +3. **Интеграция в EblanStudio**: + - Добавлен тайл `10. Портал перехода` с неоново-фиолетовой палитрой и меткой портала на 2D-сетке. + - Инспектор свойств перехода: выбор файла целевого подуровня (`.dat`), кнопка обзора файловой системы, слайдеры целевого спавна и угла, переключатель Fade to Black, быстрое удаление и кнопка мгновенного перехода к подуровню в редакторе. + - Поддержка сериализации и десериализации переходов в бинарный формат с сохранением 100% обратной совместимости. --- -## Задача 4: Система кат-сцен и скриптовых последовательностей +## Задача 4: Система кат-сцен и скриптовых последовательностей [ВЫПОЛНЕНО / DONE] ### 4.1. Архитектура: Бинарный трек событий (Keyframe Track) Кат-сцена представляет собой упорядоченный во времени список событий (Action Track). Во время кат-сцены управление игрока блокируется, а виртуальный режиссер интерполирует камеру, спавнит звуки и выводит диалоговые субтитры. @@ -178,11 +214,11 @@ struct CutsceneEvent { | Этап | Задача | Затронутые файлы | Ожидаемый результат | |---|---|---|---| -| **Этап 1** | Исправление Fish-Eye и угла лучей | `include/engine_math.inc`, `include/engine_raycaster.inc` | Стены остаются ровными по краям экрана, нет искажения при вращении камеры. | -| **Этап 2** | Импорт текстур и спрайтов в редакторе | `editor/src/stb_image.h`, `editor/src/editor_app.cpp` | Кнопка импорта в GUI загружает PNG и обновляет `assets/textures/texturepack.bin`. | -| **Этап 3** | Система связанных секторов (комнат) | `editor/src/level_format.h`, `include/engine_map.inc` | Переход между комнатами по триггеру с выгрузкой старой карты и загрузкой новой. | -| **Этап 4** | Движок кат-сцен и диалогов | `include/engine_data.inc`, `include/engine_render2d.inc`, `main.asm` | Пролет камеры по ключевым точкам, показ диалоговых субтитров, блокировка инпута. | -| **Этап 5** | Визуальный таймлайн в EblanStudio | `editor/src/editor_app.cpp`, `editor/src/editor_app.h` | Визуальное редактирование траектории камеры и сценария кат-сцены в UI. | +| **Этап 1 — готово** | Исправление Fish-Eye и угла лучей | `include/engine_math.inc`, `include/engine_raycaster.inc` | Стены остаются ровными по краям экрана, нет искажения при вращении камеры. | +| **Этап 2 — готово** | Импорт текстур и спрайтов в редакторе | `editor/src/stb_image.h`, `editor/src/editor_app.cpp` | Кнопка импорта в GUI загружает PNG и обновляет `assets/textures/texturepack.bin`. | +| **Этап 3 — готово** | Система связанных секторов (комнат) | `editor/src/level_format.h`, `include/engine_map.inc` | Переход между комнатами по триггеру с выгрузкой старой карты и загрузкой новой. | +| **Этап 4 — готово** | Движок кат-сцен и диалогов | `include/engine_cutscene.inc`, `include/engine_data.inc`, `main.asm` | Пролёт камеры по ключевым точкам, субтитры, звук, затемнения, переходы, блокировка инпута. | +| **Этап 5 — готово** | Визуальный таймлайн в EblanStudio | `editor/src/editor_cutscene.inl`, `editor/src/editor_viewport.inl`, `editor/src/cutscene_preview.h` | Редактирование траектории и сценария, предпросмотр игрового вида внутри редактора, Undo/Redo, F5 для полной игры. | --- diff --git a/assets/map.dat b/assets/map.dat index ea822fccc692116871eaf658e9c2a090158c0640..cddbeeb5f89d7c9ad2b9c1d6d2a835e3d9d1ebfa 100644 GIT binary patch delta 60 zcmZ3+cY$w$6eHtAX@5qpjoG`|v{;ymOOtX^%TjaV4UF_s5=$7+0W$*=P>7KM0L`Kb A;s5{u delta 17 Ycmcb>w~TLs6eGh#X@5qBjoG`|055X|7XSbN diff --git a/assets/sounds/sounds.inc b/assets/sounds/sounds.inc new file mode 100644 index 0000000..65f87a0 --- /dev/null +++ b/assets/sounds/sounds.inc @@ -0,0 +1,3 @@ +; ============================================================================== +; EBLAN ENGINE - Auto-Generated Sound Manifest (winmm.lib PlaySound / MCI) +; ============================================================================== diff --git a/assets/sounds/sounds.txt b/assets/sounds/sounds.txt new file mode 100644 index 0000000..b92f2b3 --- /dev/null +++ b/assets/sounds/sounds.txt @@ -0,0 +1 @@ +# EblanStudio Sound Registry & MCI Aliases diff --git a/assets/sublevel_02.dat b/assets/sublevel_02.dat new file mode 100644 index 0000000000000000000000000000000000000000..922a41d67afe9b60cf540d71afbaea36ee37c3cf GIT binary patch literal 1176 zcmZ>D^6_J0Pyj+^1||juAZZ|~z#u9r%D@QZ!2l;A08@ya=Hz7H!Y%_51T#P6g766M3kT?(6xd?Fup!fnHmm5u-i77X+Krbb+1jT#E99D2C H#K-^uJ=qKx literal 0 HcmV?d00001 diff --git a/build.bat b/build.bat index a94bded..a53bd1b 100644 --- a/build.bat +++ b/build.bat @@ -5,6 +5,13 @@ rem ============================================================================ rem EBLAN ENGINE - Build Script (MASM32 / MSVC BuildTools) rem ============================================================================== +if exist "E:\MASM32\masm32\bin\ml.exe" ( + set "ML_EXE=E:\MASM32\masm32\bin\ml.exe" + set "LINK_EXE=E:\MASM32\masm32\bin\link.exe" + set "LIB_PATHS=/LIBPATH:E:\MASM32\masm32\lib" + set "EXTRA_FLAGS=/SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0" + goto do_build +) if exist "D:\MASM32\masm32\bin\ml.exe" ( set "ML_EXE=D:\MASM32\masm32\bin\ml.exe" set "LINK_EXE=D:\MASM32\masm32\bin\link.exe" diff --git a/docs/ENGINE_ARCHITECTURE.md b/docs/ENGINE_ARCHITECTURE.md index 2215df4..6e968b2 100644 --- a/docs/ENGINE_ARCHITECTURE.md +++ b/docs/ENGINE_ARCHITECTURE.md @@ -4,9 +4,8 @@ ### Мировое пространство (World Space) - Мир разделен на клетки сетки размером **64x64 единицы** (`CELL_SIZE equ 64`). -- Координаты игрока `playerX` и `playerY` хранятся в формате **16.16 signed fixed point**: - - Целая часть = `координата / 64` (индекс клетки в сетке `gameMap`). - - Дробная часть = смещение внутри клетки. +- Координаты игрока и спрайтов — **целые мировые единицы**, 64 единицы на клетку. Индекс клетки: `coordinate >> 6`. +- Синусы, косинусы и масштаб спрайтов используют 16.16. Дистанции DDA используют **24.8** до проекции, чтобы не терять дробную часть на каждом шаге. - Карта `gameMap` имеет размер **32x32 клетки** (всего 1024 байта). Индекс клетки вычисляется через сдвиг: `index = (mapY << 5) + mapX`. ### Углы и тригонометрия (Angles & Trig) @@ -41,12 +40,15 @@ ### Алгоритм на столбец: 1. **Вычисление угла луча**: - $$\text{rayAngle} = \left(\text{playerAngle} - \frac{\text{FOV}}{2} + \frac{\text{screenX} \cdot \text{FOV}}{320}\right) \ \& \ 511$$ + $$\text{rayAngle} = \left(\text{playerAngle} + \operatorname{round}\left[\arctan\left((2x/320-1)\tan(\text{FOV}/2)\right)\frac{256}{\pi}\right]\right) \ \& \ 511$$ + Смещения и их косинусы вычисляются один раз в `InitMathTables`; углы остаются дискретными (512 направлений). 2. **Трассировка по сетке (DDA - Digital Differential Analysis)**: + - `deltaDist = (64 << 24) / abs(rayDirection16_16)`: расстояния сохраняют 8 дробных бит. При нулевой компоненте направления используется недостижимая дистанция, деления на ноль нет. - Вычисляются шаг сетки (`stepX = \pm 1`, `stepY = \pm 1`) и расстояния до следующих линий сетки (`sideDistX`, `sideDistY`). - В цикле луч шагает от клетки к клетке, пока не встретит твердую ячейку (`IsSolidCell`). - Флаг `sideHit` фиксирует, была ли пересечена вертикальная грань ($X$) или горизонтальная ($Y$). 3. **Устранение дисторсии «рыбий глаз»**: + - Некорректированная дистанция используется для точки попадания текстуры. - Расстояние по лучу умножается на косинус разницы между углом луча и углом камеры: $$\text{dist}_{\text{perp}} = \text{dist} \cdot \cos(\text{rayAngle} - \text{playerAngle})$$ 4. **Проекция высоты стены**: @@ -66,12 +68,12 @@ 0. Спрайты хранят позицию в **сырых мировых единицах** (1 клетка = 64 единицы, как `playerX`/`playerY`). Перед отрисовкой все спрайты сортируются по убыванию квадрата расстояния (алгоритм художника, insertion sort по `spriteOrder`). 1. Позиция каждого спрайта переводится в систему координат камеры: - $$X_{\text{cam}} = \Delta X \cdot \cos(-\text{ang}) - \Delta Y \cdot \sin(-\text{ang})$$ - $$Y_{\text{cam}} = \Delta X \cdot \sin(-\text{ang}) + \Delta Y \cdot \cos(-\text{ang})$$ + $$X_{\text{cam}} = \Delta X \cdot \sin(-\text{ang}) + \Delta Y \cdot \cos(-\text{ang})$$ + $$Y_{\text{cam}} = \Delta X \cdot \cos(-\text{ang}) - \Delta Y \cdot \sin(-\text{ang})$$ 2. Если $Y_{\text{cam}} > 8$ (спрайт находится перед камерой): - Проекция на экран: $\text{screenX} = \frac{X_{\text{cam}} \cdot \text{PROJ\_DIST}}{Y_{\text{cam}}} + 160$. - Размер: $\text{size} = \frac{64 \cdot \text{PROJ\_DIST}}{Y_{\text{cam}}} \cdot \text{scale}$ (scale — 16.16 fixed). -3. Спрайт «стоит на полу»: нижняя граница = горизонт + size/2 (как низ стены на той же глубине), верхняя = низ − size. +3. Спрайт стоит на полу: нижняя граница = горизонт + половина размера при масштабе 1.0; верхняя = низ − размер с учётом масштаба. Изменение масштаба не сдвигает точку опоры. 4. Отрисовка вертикальных текстурированных полос с проверкой буфера глубины `depthBuffer[stripeX]`: если спрайт ближе стены, пиксели выводятся в `screenBuffer`. Тексели `00FF00FFh` (маджента) прозрачны. Применяется тот же дистанционный туман, что и у стен. --- @@ -89,3 +91,54 @@ DIB_RGB_COLORS, SRCCOPY ``` - Обеспечивает честное ретро-разрешение и пиксельный вид с нулевой нагрузкой на видеокарту. + + +## 5. Загрузка карт и ресурсов + +Новые карты сохраняются как EBLN v4: заголовок 38 байт, сетка 1024 байта, спрайты по 24 байта, переходы по 42 байта, команды кат-сцены по 16 байт и строки по 96 байт. Чтение старых v1/v2/v3 сохранено; ранние v2 с переходами поддерживаются. Загрузчики сначала проверяют весь файл во временных буферах, затем заменяют комнату. При ошибке перехода текущая комната сохраняется; при ошибке начальной загрузки создаётся процедурная карта. Значение цвета 0 — полноценный чёрный цвет. + +Файлы связанных подуровней лежат рядом друг с другом. В `targetMap[32]` хранится только ASCII-имя `.dat` с завершающим нулём. Переход после появления в его ячейке повторно активируется только после выхода из неё. Двери и взаимодействие реагируют на отдельные нажатия. + +Портал использует отдельный буфер текстуры, не занимая слоты спрайтов 10..15. Пакет текстур загружается через отдельный буфер и применяется целиком после проверки. Постоянные буферы занимают примерно 2.5 МиБ (основная часть — пакет текстур и его буфер проверки); число загруженных комнат всегда одно. + +F5 запускает копию графа карт и ресурсов во временной папке. Открытая карта со всеми несохранёнными изменениями сохраняется только в эту копию, под исходным именем. Движок получает стартовую карту первым аргументом командной строки. Исходные файлы и текущий путь редактора не меняются. + +Регрессионные сценарии: `python tools/test_regressions.py`. С `--keep` сохраняются тестовые кадры и карты. Автотесты проверяют математику, файловый ввод-вывод, состояние процедур и отрисовку таймлайна без окон; ручная проверка интерфейса остаётся отдельной задачей. + +## 6. Кат-сцены в движке + +Подсистема `include/engine_cutscene.inc` воспроизводит один трек текущей карты. В заголовке v4 поля по смещениям 28/30/32 задают число команд (до 128), число строк (до 32) и флаг автозапуска (бит 0). В v1–v3 эти поля игнорируются. Сразу после переходов идут команды `CutsceneEvent`, затем строки CP1251 с завершающим нулём в пределах каждого 96-байтового слота. Текст редактора хранится в UTF-8 и преобразуется при сохранении; непредставимые символы отклоняются. В файле нет указателей. + +Команда занимает 16 байт: `tickTimestamp:WORD`, `opCode:BYTE`, `param8:BYTE`, `paramA:SDWORD`, `paramB:SDWORD`, `dataId:SDWORD`. Метки времени упорядочены, отсчитываются от старта с частотой 60 Гц и ограничены 65535. Продолжительность отдельного действия — до 3600 кадров. Непустой трек заканчивается END; загрузчик проверяет весь трек, строки, координаты, флаги и ссылки до замены активного состояния. Точная таблица параметров приведена в разделе H файла `AGENTS.md`. + +`UpdatePlayer` обрабатывает автозапуск после завершения межкомнатного затемнения и ручной запуск клавишей C. При активной сцене управление движением, дверями и обычными порталами заблокировано. UpdateCutscene сначала обновляет уже начатые интерполяции и время показа текста, затем обрабатывает паузу и наступившие команды. Несколько команд с одним временем выполняются в порядке хранения: камера, поворот, текст, звук и затемнение могут работать одновременно. WAIT задерживает обработку следующих команд, но время и уже начатые интерполяции продолжаются. + +Координаты камеры — сырые мировые единицы (64 на клетку). MOVE_CAM_TO использует линейную интерполяцию по длительности из `dataId`; PAN_CAM_TO — кратчайшую дугу угла 0..511 и длительность из `paramB`. Целочисленное умножение с последующим знаковым делением гарантирует точную конечную точку. Нулевая длительность означает мгновенную установку. Новая команда того же типа заменяет незавершённую интерполяцию, начиная с текущего состояния. Конечная клетка должна быть проходимой; сами отрезки не проверяют столкновения со стенами. + +FADE_SCREEN интерполирует темноту от 0 до 16 и масштабирует каждый RGB-канал. Во время сцены HUD заменён чёрными полосами по 52 пикселя (видимая область 320×136, примерно 2.35:1). Субтитры центрируются на полупрозрачной плашке: до 3 строк по 38 глифов 8×8, перенос по ширине или LF. Полный текст ограничен 95 символами CP1251; лишние экранные строки не выводятся. SHOW_SUBTITLE с нулевой длительностью остаётся до HIDE_SUBTITLE или завершения сцены. + +PLAY_SOUND использует `PlaySoundA` из уже подключённой WinMM, асинхронно и без системного звука при ошибке. Строка содержит только ASCII-имя WAV длиной до 63 символов, файл лежит в `assets/sounds`. Бит 0 `param8` включает повтор, индекс -1 останавливает звук. Канал один; новый WAV заменяет предыдущий. END, Tab и переход прекращают звук и снимают наложения. Положение камеры сохраняется при возврате управления; защита портала предотвращает немедленный обратный переход из текущей клетки. + +CHANGE_SUBLEVEL ссылается на существующий переход по индексу и использует его имя карты, спавн, угол и настройку затемнения. Старый трек останавливается до загрузки новой комнаты. Уже достигнутая темнота сохраняется при начале затемнения перехода, чтобы избежать светлой вспышки. Новая комната может запустить собственную сцену после появления. + +## 7. Таймлайн EblanStudio + +F6 или кнопка панели открывает таймлайн (`editor/src/editor_cutscene.inl`). Дорожки камеры, текста, звука и сцены показывают метки времени и перетаскиваемые ромбы. Команды с одинаковым временем можно выбрать через список «Команда». Инспектор редактирует время, длительность, координаты, углы, строки, WAV, повтор и целевой портал. Для камеры кнопка «Указать на карте» позволяет выбрать свободную клетку, не меняя сетку. END добавляется автоматически и переносится за последнее действие. Удаление портала удаляет или перенумеровывает ссылки сцены. + +Трек, строки и автозапуск входят в снимки Undo/Redo и формат карты. Состояние предпросмотра (`cutscene_preview.h`) задаёт камеру, текст и затемнение для встроенного игрового вида; ползунок кадра восстанавливает состояние к выбранному времени. На 2D-карте видны траектория и направление. Звук предпросмотра можно отключить. При команде перехода предпросмотр останавливается. Полная последовательность комнат и игровой ввод проверяются через F5. При подготовке F5 редактор дополнительно проверяет наличие всех WAV, на которые ссылаются достижимые карты, и копирует их во временную папку. + +Пример `examples/cutscene_demo` содержит две независимые карты, русские субтитры и короткий WAV. `run_demo.bat` запускает его после сборки движка; `tools/make_cutscene_demo.py` восстанавливает файлы примера. Регрессии сравнивают состояния камеры, угла, текста и затемнения C++ и ASM покадрово, проверяют повреждённые треки, переходы, упаковку звуков и пиксели кинематографического оверлея. + +## 8. Игровой вид внутри редактора + +В центре доступны режимы «Рядом», «Игровой вид» и «Карта». Игровое изображение создаётся настоящими ASM-процедурами движка: `Render3DScene`, `RenderCutsceneOverlay` и `ApplyCutsceneFade`. Копии raycaster на C++ нет. Сохраняется исходное разрешение 320×240, соотношение 4:3 и точечное масштабирование. Обычный игровой HUD во время редактирования скрыт; кат-сцены показывают свои полосы, субтитры и затемнение. + +Редактор собран для x64, движок — для x86, поэтому рендерер работает в отдельном процессе без окна. Аргумент `--preview:<имя>` выбирает этот режим до обычной инициализации окна и карты. Именованный раздел памяти передаёт несохранённую сетку, спрайты, цвета, камеру, текст и пакет текстур. Общий формат описан в `editor/src/preview_protocol.h` и зеркально в `include/engine_preview.inc`; размер и смещения проверяются при сборке C++. Один запрос в работе исключает чтение неполного кадра: state=1 принадлежит движку, state=2 — редактору. Публикация выполняется атомарно с барьером памяти. Пакет текстур копируется в движок при изменении ревизии. + +Движок проверяет диапазоны входных координат и спрайтов, наблюдает за процессом редактора и завершает работу, если тот закрыт. Редактор проверяет завершение рендерера и тайм-аут, показывает ошибку с повторным запуском и освобождает процесс и память при закрытии. Готовый BGRA-кадр загружается в текстуру DX11; неиспользуемый байт DIB заменяется непрозрачной альфой. + +WASD, стрелки и правая кнопка мыши позволяют осмотреть сцену после клика по игровому виду; Shift ускоряет движение. Свободная камера не меняет спавн и ключи. Начало воспроизведения или перемотка таймлайна возвращают вид к камере сцены. Правки геометрии, цветов, спрайтов и импорт текстур видны без сохранения и F5. Межкомнатные переходы и взаимодействия проверяются в полном запуске F5. + +F5/F6 обрабатываются до признака захвата клавиатуры ImGui — иначе фокус внутри редактора блокировал запуск. Ошибки подготовки и запуска F5 выводятся отдельным диалогом. Начальный путь карты определяется относительно расположения редактора и загружается при старте, независимо от рабочей папки процесса. + +Проверки выполняют полный путь x86 ASM → раздел памяти → x64 редактор → текстура DX11 на устройстве WARP. Пиксели встроенного вида сравниваются с прямым вызовом обычного ASM-рендерера. Отдельный сценарий `python tools/test_preview_ipc.py` проверяет обновление стен и текстур, субтитры, затемнение и завершение без открытия окон. Для полного регрессионного набора предварительно соберите движок. diff --git a/editor/assets/map.dat b/editor/assets/map.dat index 933eed0e08a6bc0794ae11d274ed7acbb0b19ad2..cddbeeb5f89d7c9ad2b9c1d6d2a835e3d9d1ebfa 100644 GIT binary patch literal 1872 zcmZ>D^6_J0Pyj+EAY=g278Vu^N=ix$j6fa?FcJblh3p{20n@<%HVw*S1ewJJ;^2`7 zt7Qd~U;^YCC;;onYd$9oz_ei6kC1_|(9Opy&kO^sFa|S8`q2#s@=4au0yhM~f(U`b z2QCX`kZeAh0kqbSWF1!bkIKVCfcD`-Ab%?`GcY6oGch;VNr;jm0hkg;#erck8V=x; qG1S8$7#NRfSkgHQQ*mihPHI_dPP~DUUP@vKJZr)j%;55zkpTedOe1&z delta 82 zcmcb>w~s^G)ycD^6_J0Pyj+^1||juAZZ|~z#u9r%D@QZ!2l;A08@ya=Hz7H!Y%_51T#P6g766M3kT?(6xd?Fup!fnHmm5u-i77X+Krbb+1jT#E99D2C H#K-^uJ=qKx literal 0 HcmV?d00001 diff --git a/editor/build_editor.bat b/editor/build_editor.bat index 58283ec..60cea6d 100644 --- a/editor/build_editor.bat +++ b/editor/build_editor.bat @@ -15,13 +15,13 @@ call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\ cd /d "%~dp0" echo [BUILD] Compiling EblanStudio (C++17 + Dear ImGui + DirectX 11)... -cl /nologo /O2 /W3 /EHsc /std:c++17 /utf-8 /DUNICODE /D_UNICODE /DWIN32_LEAN_AND_MEAN /DNDEBUG ^ +cl /nologo /O2 /W3 /EHsc /std:c++17 /utf-8 /DUNICODE /D_UNICODE /DWIN32_LEAN_AND_MEAN /DNOMINMAX /D_CRT_SECURE_NO_WARNINGS /DNDEBUG ^ /Isrc /Iimgui /Iimgui\backends ^ src\main.cpp src\editor_app.cpp ^ imgui\imgui.cpp imgui\imgui_draw.cpp imgui\imgui_tables.cpp imgui\imgui_widgets.cpp ^ imgui\backends\imgui_impl_win32.cpp imgui\backends\imgui_impl_dx11.cpp ^ /Fe:editor.exe ^ - /link /SUBSYSTEM:WINDOWS d3d11.lib dxgi.lib d3dcompiler.lib user32.lib gdi32.lib shell32.lib comdlg32.lib + /link /SUBSYSTEM:WINDOWS d3d11.lib dxgi.lib d3dcompiler.lib user32.lib gdi32.lib shell32.lib comdlg32.lib winmm.lib if errorlevel 1 goto err diff --git a/editor/editor.exe b/editor/editor.exe index 79887d72d8532d313b593d08bbb3277b9ff9128f..bd5ea53ce6e567b32f2405cceb7fef4091f00ae9 100644 GIT binary patch literal 1213440 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

7P+?sQ1-e<&A4W zbcQa7O((e^0w0180EH_Z95^lrTe=`xA)9HK51!lGEF+0cJ_^IewL+UVr5@&4oU0-%|Y_&)6SN;ij)0>dv01Xh^OKYil zRE4b=P8cL^HUEv^wd%SURQ4{oj^=MJQtZA1ld-V923`=p+}vZUe7BWaC{`nyF%ruX zEJrl@jiAd*K-Js3rY2(vCFr9-4c(suN`jGmxO+a9H&AkbX5u`GZu|W6iEEn13*rdO z=|8EB3-8Sy)Q~ZYkPK6>Fsj z`sS(2Iu>WD-uA_5YJPh-MKizA&0~__Oues4E=w22%?zxEd#E%0si6mQ+^%5v22i5w z%GxjnTbxr$+?}s_>x1V|=#|}-j2_2oE05OJpn5o+4<)Ths;;f*`5Y7im-$8OSPD`! zYw9^URqxc|Ds;pboU@7@`!Ox#=&5cN_f?CPXD9TXqM1HliTR2eDslzS#l;k47We7M z&`i~*Vwr3WhuK+GMBfAqiJKX<2BWwLXRio(ddj63`0h5G@y zPU+*hs|m?x#DJumM?$Sfu&-MUJz?JxW#o&HiaK>JM#5 z4R(jOcQ6eZeGY9%M!tmWQOuW2l;XWo$O>yq{gPx5VJ*1`*FO78L<>M$yJ{(CLKgh~ zYg!9PgYfpC@Fm3{xfua7zo@TY1JH&gGTlI4FPYPvH}yL zi@aTSz18zd)fnv-t0*ibgiF^O2B#g*hsxOPY4j`t3_*-Cw6SzXz1<61iX&L# z;{!p%aVcLq_!k@$3TI7Bnnhm9& z^<0Rn)JfKSfNKD1YMch*$bWNR0LyL>i!j28MbN!F7K|h&eb-x8VTm&jb2sck2uMh0 zK!T*+u~sVj-*c?}+DBP1_mvx|3&a~yk$B-`gV_QB2|6bf&D_N~1>^gA7{-@4lO)WC zcjo563?}@*bhjf=LdS$??$f=S7F-})+UUYy!9dU`K%UL^IP{<)b&#v|7`g7{2#KlQ z!^(;iEP}CAWS1P*6pk7A3YQ~J|_4bz^Q}fuy-}pbNuR*fKfE^&P zF>@awu%TCdBk+9%fqi(i)ekSa*DaL|d;bU23_Hq;jUkwTh5KE|<7q;ZQ=dN}v9Lt< zeyOZbFsWj|s1FpRGfqOHATCbAL4k;qhzf~l#Dup_S+Rqdw0Z){n=4N9n}@?A)mX)p z&1%&V5yg-POAX>i>XhZb6{v5r$G;^}Q<0#@W!PSpLvkB4fQ{EMzH4-2L1cU<-p_K$ z!4V1?!f;fpH?#`$!C5<8s+uZ{*02vb-ts=IK@PO9V9Um!*7pE~sP($ZKFcZIiemfb zR$^rkf90Q}KMQO?5)6g{sF^m1ADj-VX;Sl>)w(0es<%~HE*5_;IfQitw%F_UVH zxszskC-|g^%(@@(GFCq*SZ@QEZ$oDYj?wcQwYv6X$cts@Y;-(lVwsKc98p7`!3f{c zf58l{g^2rRyX?(Om)6*g)wRZvu$76Fb{m)K-LI@@VaDqB1QOuqO%cfBQ>%^%j0{w* z(ZI+SWjSocE_>q}0v#3U5y*53?%87ho;A#NM)p`ey_&HYcJqFJXWN=FMk1&gY-Hc` zUY097UNfgdmNu*T2h_S_08e;6jC5Ctt{`B_z8aM@b8!ZSJ50?Fv!>G+DA_)fO~5oI zn`cQHN+1sK+K~VQ!d1lD4XYE|{D>I)c`21={GG%<0~j}DzAHkzZh&BVMa|y^jHT)% z#;*vOh-gxDZ=qynShv#389;kI6 zL9K4Ie~zj|A@FmtmVX#i1luC!7Rg4=1%8~8J7mda4sIadsDKEGV}J4iv2z$Yq+}-t zKT^6$emV+%(w@tzFX+jClC3rbpoIW$`OVtlRxM?xT6Yv&vjMIyC{sIB@5jn=N-y=L zoaMLhUpK*Q6@uBI!GPIXMfBc|7_()^G26{#Hgkh^*w)ZmV%xKKT@r`RMBbYkL1(l5 z{+@5=z4wUP*>7I*EqqstDz=Vxz8$ldu!f20k4!gAo&EMDxTahMA>0qUogt}|m8PTu|P7|vvetkkIhv~2U#67~Qw zee3Jrg=rsaB=9g)B4T;8)pH46vrTl}Y$is&dK>tuNW?hN3|IQ=LgGddu6vKohi`=) zy-IYHi2pYpC*lE+%k=zXppem4D&OJMsJDN{7xeC2`XEZXCWMrCNeEe^BZSZezhil5 zqldJin9!>5Svzum4!mD;bQny4{8_}1EY647em{ub} zb=2XKUxT%^Rx`R$uHip*MCymnokjD`Fe=}$u{@BQM=chiV4nofgMHcwg8ZNq#KA7G z0>YX-m=cmI-W9WEXrmgPzSw&mtI7NhNZ~Zi``P@vIhZT301BQRU4os?`TkYi93d3z zI}n#3+D5a^=qsAF{LjQXl0ULX!SjVZg3$!q?TMm44d@SU$NCe#MK!;M98XhI4s!&T zullwZx4}#nd9fJJE0xlf5_YIRhv6_2&4rnL8PMK-4fHaR`62|n5jswJCWB_4fPHk!Xp zH>-0iMH7#T9@NOjRYTUK*^kR`SV3SwZQTqqcDNy;pUC-d7DrNxb`S;wAt{*mi1yNt z%H^N#-KMOhx~x-P?$mZ-rre|EzY3oGsc!YFq5<*n#}INLj)?Sx>v!>x5@l@#s%kux{Ie?tz`5J2>52D!SLX4RmiPy9Z`Hxqn{t50ll-aGx$a zDf-6_OhG5{t}b67`-hblJLyxNt)u@z zpH4;G`d%$$_r{~a3zfCQ50cypl>U`?##Qbg?3!DG8fwR8r&2{&ac368@=N|z+^oMr zg8~-%xVIJx_x3BnZ;XkgS`2!`!a5suFVWD#e|Q zyUAz`0Z$i>qlX^qo2CN(QDr-|TOYL1gIC-8X$Kr~P#Ro0=^$Jb%?o+B6rzzou z;AssF`43WDhU$9@K<%seP_U$QX~39RC`biv^{vExcef4#P`Y?$*f@bZ7y%Bp8+-moE-i`72iQ_b}?Te`LT79 zi=Zz&P;nq`V7les8^ZxwRK2?~=|w2CNm8gy3U$dAP@&?0;!X!%%~5WkG_E!BCPgwC zQ-wgKbmv3>mW0bj80LhDYPa2VRB&SizVYM;d+>x@H)9Or939~ERv}L}=;k}Zda@H% zGLQ0;B!@^KUnBBIv;I;EA+LL1SE@Io2LWq%Z`fIs>K6o{To6{UL+tnha8d!tDVcs{ z?ZRGubB?>b#Cz7f>jNOpfOkVM&*A4NG&W0Uv=SOgar}ywvae6}8#iT^`;Gg1m6sT2 z`Hi{m@Nl#@z}}JvZ=bktc=6~j>?O@Idebyg3YiMHd1Vyg*GV6+4p6m zAl$Xkryd>ZW9WoOS$PJfJz&g9kyGJnq-YJklX`Huz2a=lL7@&n$OMD}=HY<36)qpr z2{a&UQVaAR&H4ucrG*-516I|YoESq#JukY_I6v*y6}^p<4E`@e+phHpM}mc4w^b0P zmVy=WQ4cPgu%7JBW~1;2IFnRsY;TZz^1Ob4GT1HMPkJBahWHF#NO1+*S9mw>C5d}} z-V1n}g4r6G5%-?c@?n+P8SV~k1~yGC{|oB4J9j}>4K;$Tx2Y*7Bp@yYAapoI2ncA( z@aKRb_54ltlct$#GuvJ|p20`zDM@#woWuK_MyVz_FaI?-f`&mN58r7i=t;DSd zrl`N9db$%+xGhE(qc2Fd>)2+%+$5VbcWdTWyMpkm`zRUh>1MNdDS#;6hvp~quJ^MC zH-KG=#B!Pr6%nHu^M6SHB*d=t=LTSa>n#{rY(Bfwu{BPI#6jpFmzV$*E>60O&@O6) z1yogwVESJ&5@LIaU+fXm%tLDamqPax7KFt+>BT@R*srwRF71zQ!hj>(HduS?wTH39 ztZ$u5>F2FmGFP-htmGdepn(-Hnh+0pzYOMG6mSzo>ujJN*40JTCzT^F#3J@>T!A z^IHC=>bi(hs2={LlUfFCP_+hz;4c#XWkMYCv=f@6GSfGS6a-O%xtnejARY1zrsXY) zwUvMZDR{_4@}@d0ND@C{x9gM!mhpBaY#ryP`3I4)L zM7la&j2O(}G!qUFY{A^5tT^HTO2vk}^aZ(MA7;v%#4`dR(s9$CxSfXhLlDeY6}GNL z33(5&_F*q(I&Lr)Vo;Zs@)=P}`7gy|P4<9I(r_>+5+fmFU86A)F?&0sCA@VDX2Mn^ z4Dx@4z7;+rVTWRd{l-RVPr}|zt|wC7R1I)2dUrQq)olNIn=r8>fCJF;(SxB9gryKg zu8D>MOUjR>UFMmDYz zR4|YQ`>uz;LjGZP#F& z6$RrT95B9HFTpr85sd9J)Z|DUGU#Xm81IULkv0_*tG?I6=c`sJqE6mz;kwEg4quY} z5Zk4*4i?K@0HkgJ;v;i(Xgj(!#;qFQMnvvxfsn(1%8h|HbsCLr?;t=o@K?}Z%wOw+ zg6&tH-OIO`N9|^)%bc@GNie6wBTGdI?Qge5JhQ+PWoZzR*ic9j?H-#i96X`PkJ%w; zT1AC#LKYO*d;gN@DyFl%B11Su)8Tx9V|kPy<#MBcG;kV{xLmCwnwKnCq?&iR@HnDU zHW%}quft~Y5?T^b$W3Zps|PbunL6`T;bLsIm%>k@hL+^Od!?I7I0f?_AD7SiF@!2U zTxWYQRh>cS6-F~h__-rWV?EyR!c{OHh$tcZUS{pT@;CP96Ph5oH%~S1h5QHTH8-?D zy3o9zgPKiDx}e8yKoD+^f(eX!5hrKhEp#hjo&|lSM}6Xokchf@NY8JhlfLdKjO9C( zYB#AmzlrcIr9T0-3c3wI=ToHPfVPA(n5>i)VNjrM{WuAs1+dS4qIox|$_QJ7%SgJ< zpr6#e11G>{cxc|F4?z0NE{~G%UmOzdUnfa8<_4GoVtlVfHAb|DGi(=cW36eP30EgN z+cQ^B`BF1_k@$>Burpz>xaV!FNYnE-g!^JTMr!|gGbi;?85*cn&j%)V+y5nsF!Nzf zf&Hl2zOW~wGcX`fF=c{>h?x=*3=z25y#^5_?c0QC5J-vmV>MXOPB4m1Wp}=WY65!+QQ_TIhooJ>^r)de9??LK@R(G7`Fzkndn1%q=Bw$d$N( zHKsWth0^DKjexF&B`GAR`?ryjL zyN3uO+5{e(lAzDpZwV%D*b<=_pD+SO+~2x+h4y01HAMHura(S6Ngah>NKn$}+Pa7j z2>M92MpBa2Fg;~QfX13qhm`QBmXDPs`4zS;GO7yC5=3bk2{2|uldIvV3rShg8!c$y zUno7`ZA1%sYa&O)l9}a}jst^cEeB zc)wnONQL)nC%9Rk{lz6F)Yo%q#u-DaPjT*9$c{WqH!0iBfSuf7b)bT*{?aB= zAk5j;m`eimf$g#XDvF?*OIC+{I|Fi>+%2?nLW>bgz?^jK(WqH(Ux=-DTW#f)2->0o z*e9*HQh(CT!P<*4&yRyXtQ0|3J*5dtJf&KT#~yZpMX<+x zQPOWjRs;rxXYeG{QA!7_dj;yC3?XbUin_0f7vc2ixrrS5Ehv1&LE&$o|5g-M^0tFQ zu4hPa!WAbv8izl;cAS!(irBd!^|UMigER|_g%@4mP4n7O5xt3c>$Wk1x3M{TJ}~vV z{bfCiupouN7AF4RrxS003!Np@1SqE?coU}Rdi(Axh_)$BF|>6dpWDBOe16qIOT>fI zSw64Fecig%kaoWLFC_jO%imTLElCkPBHrHi|5O}rbj0zQ-A*Nr1DBIP1~o(p#5Yk| z*2H><{QN>>C8`T=^Tq&3+~H>%+LqvFM;i15KO=NFfuH~A5RL{z3Z9JeGc{J}ZunMy z=3xXB!{li&Gv*f1Rg*?7OPmKIOibk+=Gc`yS+JyYXe|X zn4pBwfVjjI#6>8!k%>HR(hL_wqVpo>;giy$9n94VmrojKJqfwD<#ilx+)j-bp;`uxK>7Iim251 z*rP~nGzpsYoJ02kO+MD&a(!6cVvBdJpxLxxi=3e0WotlCej0&3XY7{+H-&x0HH;8$ zgsj9PP(n(1V9XS81_5SdQDxXU$yiy}Vnusq!?LH)L{hQw;@^<|6PX8cbHf8i~L+=t)6=x9d#F!8`hsuTC?o0_$|je{yex)E~wrm&pKE? z1t74${wE2$o#p`#=s$Rcpc_}Ck1>i!dNM&E{=^9g#5WK{Io4ea8xTzj_C6mXX(6{U zOq_Ry_y@#+iNFO|YA!Y#+LXEx8KL&1inF=(z}(W|M#;RMp%Y0Ju)m9v(hTzncASpR zQv1)pLtg|q6m0ayTd*sOHxU8-^g4F)@m!v5fujfrb;srEgs%(yfIfmwkU+efXHFzA zHf~GHIu6TBQWN&EKvSQerv2~jV|naaYFgjAkENIYB{)DpF^5_wajczpvMALr;x^+& zmUSrAj9rfG@=CEyWn@=-aC(Ner#c-C@8nBvz)QGUNkEcRvKnB5?}j+;dP7Tz zQu1|ik3%pWI$K(bF9`PS?LXAOO)X2!*rt||XMg`qExv?JEoe;cYMI#wyIRh`CAYQQ zjSFzo5+;e;S`O-o+gkb!2db?;H;;v20Z;hsEgKRJ!9e^!BcwKqr~=_SxBPH$z%I~& zVN*~>xB(;W!ZKbLyfn_Ah#8Fj-X^-q z7?S{B2v#1+rgq%8{&>J!SFxWf5e*K?`{bF-P2siZK6Ncr=&fD4IC~vmNJ}Y-~w@v@p-42;5VyDT@yY;e|cO4ZQlMT$#5w z1Iw;*Rasoiy+cCCYRaf>a6ReD@OoRV%i@-mE8)JHd%0%5rJ2X0{wu`nBa|D{{9-(4 z-rc4wPZomm%+_zvq5F1f7W6AT5bz#Xs=0>H%`a8+GZnw$u`sMF2ZDF1=9qSITHG~c zEGu?e+}WK@i&Iu$3IeIh=7YpD|s_&bDd^GfLX9 zUsu$qN!Ps{%CZU~%R<164zow~ZRoRRj?Ix>;O?+*?ZU4(#P}}!_un#sne6NEe}TJo zjDWx%Y)S)33t$7h5}=;~pquQ&FAIR)3YXqo_(vGF2O(;2g+J4c;E`V!>BWxv&D|B9zYFDNC9PdgRQ+Jum#cc>AZBYM;0d#)#3^p zwXjF4x;A(ofsEJ|7!prc+*3hwAV5iaO7@vbHoOmPUpMEu`AQl72$tb1?-oV9*o*CP zFMaLB?|7+F{a?fsyv}$rUU!D#o{krHlX@<-`qP!{sdzD@fok3(-U1mA8>{R~4;F1f zxH*mIq|K?$i&gK}aihi64;n4iWG8s&mEc8j^15q(DdZjfowd@x<4z2J@#)YB5pVz- zrwE|gE23%wRv8rc9ZHDPXH0(U=As;u!m67}F1 zAXP<_6^>R`mgZv2VL%yW^pim&X{)${(5UA8PB;$Gyl({wM1n6O_HZeHIGW%jh_eA= z0nG1~kZ`mB;;nyStg1Dp1uv_BUhpcnzo2`FED|Rr?{MT@w&K1K*h+HN^~g$j#~y1~ zc_Y+Csh*CuzE2NZujWg65c3f>k4Dc_+|-~T(KRHL<=IO1jo?D`Fhf-4tZjg_9~Z$_ zFniGB>WiC+#FCHe@eC0Zo+#7`G;0=C*%Pqq+5CWNut(c@oCiX4*2LU|Jzj`tIjVVI zQ>?QA@rb(iZHPRyA{mG%sZi*Ck)+X63&d;!CO-x`tR&k z%3FFjA8(EEsVUeH9i_!P*9uyMm-5rOsp0PTrE{GeYEIIj*VVn3rXiLdY9Nk zAHh%r&0wQ_`LhCe1EAc_y-0uyffcky3Rizv@S)o&V6r)S^y{_$szzP>$zO$$%CYb*M~dfHN$TEjXJ0i)^jZ*?&G#Gk}b7UDqqt@cV>@yr>y#kzbrPZMzVSpz$XsKmm} z*=M~OuMJ-oht72@zzHzB?O_Sc7l`I%vt1*R#sP-qIET}}{8u9Jm;89&L>O*0>na4tV$%+{!8bdf3y3?3;7Yih zE@3DUP9lg$U%NPyfant&7M-ZOYy|Oq7y87;W1uhago8c?949!TGVCjO58*t<;v8Tv z7aOUtF=B{N4vDfK;fx`|^y5DQWw7e?P}cIqN3)q>b5W#$4~O6sh|zI)gXJLqb0{vD ze^2yZ5W`zG-WM*6;%&R_V!`>)Mhk$$nk%-?;C^e?M4$o_vx7gNIL&pHKc;AS$@{WZ7x(77hkg zUi$72J`8=5{Iv;QDZuY@c#o5xy15Wzb=2iyBO;px`E)3lV=##mP|Mjr;nT)4i$Zg)8n za?$UdIZs1mKTv7^7zLWuyT3CBPUU?^V#YDusf6X@=u^VnXR<)dec6#WIg?$Ie9<81 zMPK|5FLF@KNJGJI;6WHgV`6g}=f0Z%CW>$6FZ?N3Ow)@ZOgsX`(YRfROKf+E$FcBT zKqHUIOQN?lVY>T|qRLK&R+RD}5;)3~Pg|E3U8*^TVf9CpA;?a$iL3ieG1ZN>SJe~^ga`V$%w z3`x=@jFqu!-Um!zjmbqGqJV)38~`Ry&DaBk@Boh#7};*jX#ElZP?pObj|^T#81#`; zghR?QEplL>fWz!sH6 z2U}H7Fn9%F@bxr`qKdnPr?;~ASieD=B5^qr{)~Dp|3I)eVMFlaiDvtAOjBwKP7z$3 z5#DCM`a9D9+nE4<{2%B)vY$YLT{pV}eE~$dM9&D(Ol<7?oTqnK0|EYT0HRGY0MN!R zn|XcI+4YxbDTu|EYy!(F4vJBh9~FRM9LfeQe={R&BB7Ph-P7JTl;v-uS}dqkVCt}V zQhdY<>?3Rr`E@FcsVjJpHMWao!)ioKeMwB=pt)KW&))8Yg?5RiCq$b~_UNB|E1CxK zHs-9^+n|8ft0_29XH&3;KD+i3aMW)(BM2M?92~vUT_&-+yZ?wai#Z%f=2 zaBeR;2}syeEEedmatmiM_R_>^Xa++41uNFuKmHBT7({d^`7Gj3jjosO#Y~BQVoty& zurHL*6@Z{_VigrVER1xADBXO-rETR}b?H(E$j+%@BWUSI9dW>wjuR8Fgebm}r6*RqA^a_P`_PXFSp6-@u0z)R}P)KDCy5I~6w`AO;}?^L_gK z@v7M$mQnlV$AtAjD0Y!KA8eJVo1F#=Muj*q%*9rXLE#Id)BYCw;7VDBK=3{GJ!p>= zQdKy}#oiXUcWKccq=^8)?L;t7XakRpKwW?35;waNxXdjMx zV7Po;JNDiX)$l1|w=dBkta~y0yk>r)=6@zm1v$|zuCM;1IKp6zm|@>OP_|6h_y9Fr>X6z&vfQevjrz*nwqJO^Cch z3@C1;+skk(V3oAstSPukW*WZr2f2bs3h>7s z`_uRNhC6w|z$wgyXWEnfvw`GanBl9SZmu-;Lz zYpxeeAe`eK$F+_+>trxYL?MVmt6r#Tv)U=Nx+c`W!oP^4ayPT%D z?{C>5$RdMP@G&40nmI^U%)Dcj}vj}S0|v;ATw z*FiYCiO?W!1T@49W!pI7EjGT(I*$)*?uSXEDf-o&3nOE@?qO(%p-;eHf(k#EQAYRFTxCQV}uKPG`_J-Sv^KqViEgr@0{?y^+MiQHN9bYBE8G70`vKcIE__0MS zbuth&#E2(WLeOpWJ>a1XY<29Ht3BTbA3M9h_tT>gYBd{gj`NR0T2Mte41X66d1y_> zM2di7J!OMdXLr+P*WL!gFze8b5m=ig0gajSAQ}4QGTypJz`9=arlcl`!O47|53Buy z9!f}b_Yz=f9FbcPIT=eRv-ZWmgxu#s0$?k^V>pQxYiF5>fllQ3G~%V5R$D>P;BwVo zHZIe(N;S{9YZgQ`s+6kc&>NXw)=@E3R`S_psH6@a>PLCSnP%F(KgMSSYK^ozkgAX2 z;|O_tKm?KPW=(VGnJh3TBF^_JMiU|0;r^U?nBZ{ui`f&)tj$4md7tdTAH*Z*w-ctz zt-XbtEAP*B1y8px`VrdmF3g#SZ#80%nS8jSo@>843QD}R)b?YO9;9Ih_f&EO7zX6+ z7W>cT>+OcSGQ5Kz_z7(5jw-os@A;>#l?~a7Hhvpx9-c+7`A&y0b;dK(_e)DK19E% zej_zkx9-sWvK(mfPg&2fH~XFC><3Ows|_muNV3PVThJ2=H-}RTH#3lKQ5j+wz2eO& z4I>_KHH^3yHRfR}^E{7kEW#^h`w$LZsvEPXa9gPnaQX3HHF{}=;x~H2jAmAn?98+$ zZU^Lz5kVZX4UL3{)N_xhJQ!S@V-aB!9pQ1tRE%x5M>9reIGdEq{AR14+j_nLCt^QN zi7_IlcyM*@YP252zU;JfBz$zEis39sYLOHhRa_$DiYGiFp#dh9FCj}Kifux~k&fa~-7T*+kxwi`yb2p%IT znb*yLql`#Uedu6W33jpb=s#k!aI+y#i4y03Q^~z@uspwwT7BAW?SvF|psyrmkPyGd z%366LEFi{8q8GP_UL-9tA$rlkn+Mszil=0uK(?`x=&e~v>^4dwl9&~E#4~&Nd8`O} z)Ku$+Hexn{z6e$`?EW|pE`n9v8oCCL>BbNegg(=kT4L2q0ai;4y@*)Nusw*oTNT=t zTw-o7mO33vj{>a!30C3u7X5YJs3OGOdW0{OeT9X~(LX{P%j7hEbMy%QXYClmHz1EO zzse*L;XY3y!sqlMMEm^X{0PGP!{Qb}w3EVL;Mi-xta5V-m9~A64aXXz_Haref|~;H zSG|n>@^6Va2E2|)LVVQ%k32M7oS(t4R4A6%Z<8d%hI8Trf?As3+-aPDey1;SXD+2! zYa&RaCuE$#h9T<2hs=*ePY%aoC_KRNmq)*3UJ`x*A<5WB-_oKQDs}}?EB<#C?3euh zxq2$Wc^?Z;$7V*0G$bt!I5+|XcmTaC;J8T})49+ki z4odJ97!yRtHip^NXhQ^dh-Im;I|v)#osqU12=W&tcImyt-q%LWyHQz6BvSzw=sWof zFrzDhK1NGB`uO+#0?fSd#snKRHtjXpCzeRFGmc)zc=_R%&V8m$Y+Vh<0=nc_u8DvO zhMHma6TH>Md}S9~MDn@(P56t<-%)$YGr5%*a3M~Ec|j=p68Qo19dYOh{LsdYIiszC z!?4s+l;u^Z3s}YRg+t~2J5hNqM%D$GI+1wra)-M6Inf~VXNU2joY>w*)i^f{LTj>L zTTHIm%j=AniEbQ9&Xu%rH|X&-*l1B}i~W-o1jnNyVhdzY2)x_(i?W7>)O-Lj;@%am z2)o1V3?4_n5zeNfZGcBSnZUsj|0yCIt*5NuIc!|YE*L;5f<+TPjurjH&|fWq zq3{2Rp^qQz5^^vV*TJ8GqcMNTCx)J2V`dvW#N+)NAripUSXx)PTp%XHOTEMh^gQKRP%A^6lWHitUW7hwA)KDq=lb&eZ~NlO_+%(Vy) z$JsRh+PHXySQyEz(J+#S1m+R{^8m+{C`7;On4udY7QCk@S5Hq6qG|R#w5VID4@z4c z7!433tRO`JtE-nq`Am||`v#%(5`Po^#P={f(5g74Kpgus*89+ByEi**;GYjm44=Ck zGBJtLS~73!lUosZtMJ-TlNL>&8T91Gko4DbHG>mKa6H}IiDJ`g#76`0?N~6z-ns#c z9GJT1(EZD`9Dnjyf;|Y|@ViD3gZO?%JB=rZ$P{-G^oW}k@4>B%cVOn)sLD}(`Z;y} z_&+&5Fa=Khz=VenlkCFoONcK2x%eJuDjA{fBKuiPI_!NYk0nN^Kqf^p@ySG$NvTYx z$fQgrvt%+yCJSX!iKN^J)$mHlJb*3Xd$%<-hT+@Iz#(+{D~3Z4DBP$T%gQj1Fr)@* z9=>4%J@$cI501JT+*p;0wgko-t1_HyW0f1ZqM{;KV^weD&c}zVbYp!EvPe8K$&(4k zg+h)C3CD#*l?lg%D~<~Z$Ax5;OgJudU_A$hgad1+s>W}U+E`VCl=D(?&H7cy3V~ep z7;BH85zrYTWeg-+XGRIEUR3Otm01F`w5I6G-74#7ddF@WHswIO-OXZi#0YvpBI5zuqVS<6l+HK!f`}q9$+9fqF@enU`qaPA>1LQ#rcyNgU^8?I)Y!MQv^1bBT@Sz0XU?zF6 zim`kO3!>jW4wTv#EQdeC`3&;JQhs0h^UaXy7H;L4GDG=Lz}<00Vp%+aW;7a(X8lWi zSbZWQj(Mr&a8)I;pN1iAt#e-HVic0J0M_o@qF%sStbxEPI}gv}h9?I%5MJuWOLy2Q zYy}_OT*b54(AXUN27JyM?FQWTFVHM=t87cW0C(}3Q*6CbMj`7LA$|UJ*fEIa&`bNH zS^VmB#icN$`^>sJJM*ce;AwDN6c6nQY7E{o6jfITZ>noet$Zg*dA2UplpMYc*5w7+ z!Sh3Qa`2pxofOOowO<*|3fYT-y+Zay!S12<9|u$MWxV7yc%(Meo{VoU;%#%#uQvOG z!;rLAN!#;%(TVVNryTqmJO7^m9!GyIYGS-=0D&E71MBm%G2Z8gp;*jQXuFh}-nAFv zWG48=yzSgJI0_muwv!>;0%04m9c9=y=x^t_6V8|Go#+IsRBRipgO%0(B1p=LMMyWK zLu6re- z2P}0Rs!t7Oh2A?R#=5B$7(G;<%#v?Vvc~?GEJ@-g=K#)RP__VGZ2e zVXt6L!^CV_oXY65$-N(PxoRV)I=Oi6^j*-%oXzt)%?;0G5cmkFG3x?WWhE}KPE%zL zOyjGBV`LRFD$d{bt!Bw;l&oRN8kCT+e6=Xq!IB*)X<79wFG5*BL4Qkgs? zY8pS4&pqPfJ<})>NmYS-fQ5LDg-BS4$7S-6sA>FEKKIBJ-ZPC-kyNSj0T$vp79wFG z9+$~OqNedv`CL^Q@0pLx5s5KNKENwH=Uj;@#!{I)#6r#ZDXYNyP_+;#1pZQ{nz;e~ zgh+gkFj6^od8|S{7qfMeP`<1iJy;cE6Q>)P6`MIB{U8s^sb3EFsExxtl%-J8dZO$Yc#Vn4_PY(B;P5Rri7hyLxHo-MOQL&y0O4rxAE^ z9zB)+M6>{eABb9Fcmo9}HRM;=T6DmStAl2rchs8xQY`<=yQ^Fw$ zn5C3Are<90X(-0oVqw4!;)`0MZe{5>6AuLboKPB}NFTqKr{Z-hMpT$J5u0naca-8Y zlgL6~_ZQ!#PS?#6giUO*{c|{tm=pU8A>({)J^j=&<}(h{@p@i3C-SZFkMNyiYPL8{Toc;*C>0ob=v$CFQ;B*CfI$55diP4v=Z76ve=KH`} zTiB;ySAUh2u(q3sg#w^*sr)+pN0I&lgo$3v>mz-=?;enam3EqJK*(H3ajfyoz{M0@ zcU0g$jDIw8LWB{U5&K`nrUDJiwQT??fcSU5zle}FEA8MWb_+da7|#*G131uNbcQ`1 z7BJj@oQG($+l`8Q1m22CS;^)kLZ=tnlj|3*&OiZH))QzBji}am=qvcfnVNya1?+U$ zmRq!yxJ1J%y0f^^FL@0MJQRJ%L!!|u;UbiT>-@&na3((12v0C}IO~ zk2(CV%Rv{2qh*dn8v*6nM=|{yDVW`JjS;DM_g@OZ2F3`q0thp%4f~Q}T+|tUf7^Hp z_?=F>mX$V5j08+7@E3)l1JZa%$^i=gq*R*Y9CVQO+*J-+@)&Qi4V#k71N&WpKo{aE zIG$oS-|(X%RLA~P6(fmixfu{MUxEFnyTB>s$`XYB@_3p8>Kz^x(GH&;6D%}=qXbP} zCTNmMn>>FFfAO$vyqJ-G$14R;t0{{e<%Js2d_Ap|5ngyWu>jdq12sCBwgdfKzLI! zeHxmnyW_t2n*n(%PJO}mgYmUzsoWTS&wT#D-Uj@BR0I#oVCXpO4-SpB;*K=4i0QOD( z4)=4Mwa|j-X=^jXCKCHBOubgxrGgNW?7MWvIlvnpL4s=fZFOcTC!QpNLjHp z+=h=h^ZiI=!rSz>IrYzblf+e=*%m27{WjJ=7+1gb*Z4Ay1fBR5{4UJ#c*=u-G|b!> z))|p_FMMExCQ?tuA-Lpn)WP>=DAmG93>zP~0%m7?;QZ29ydXdc2sY!qCQxP*f(uA$ z1d6?ZF%!!=mb{HBZUIR|v0~~;`~n~1{1erlZe)U}W{jzvYuNd0%b17R9T7ri4+(Vx z&MB(80QmIQ38=vVM(M-;VlU;8Q#X#DS_e2)1w5klK|4k4JvIVjN9Gpg=Nmdop{b52 z!dT*v+RCt4@ud8b&+FW!u@kTin7#}>7*z32p_P`)df(MR?5%1f@)d8&8U^#r-79ms1P}}ABsPO9R5x2J! zi`@)JNO62+Z9M9+(%xY&`nI>n#@EIBuo6q%^n>5mbzFWUv%fV9aF#&d-KvHSLMqASXo`cEUXX;chS1J1!osDtPrJ;n#Nk1jHyB| z3bBjL_RsK?YOY+3r4|_yfpcQYFxH9^b0ux&i8n-vxsvAd#2cc-+^;acQZ*kw&_;Nn z&0dib7+85sfacZrk z+1cJAYcP)*B0-HbS)&Dgvu|X3<_enfiHI?(`3oBIf0z(?ri>DNt!TtpOMd{aL^IY( zdJgP*EJe_#br^{K(QP9C81rw+yvqCm9wcI|EMWeE*Dx|`We)OExqyl+wfoi@+=@_D zjGn6ML>s>rZJ45s101_$iZ&?ITF1maDO-p=Z)zTU{}_xSGTZxK$7`rHHK8=}K3>ln z6}xugNkjK#;K3uo`$=z@M{k5y$Nrl4!c(|kDomfx#OTEF`TMCb;lO>di9l52Lv`<_ zMWpscop;Ce5~?G{Fr)SQ8JVu=hJ_~b*^Jg}P$qJqn1gvjIwz|LAi|uT9jD&I(h{ed zh#_%2Mc&wWpbvUlN5#MtgHNb#mVFtAV2xJo3k7yY=h^*4CT-cjp{u~Gz*$5<`cc@r z_yXAyBO&iB;Kzy`t#Y1-z*+SLhh(!|Fa zJRz?Bl=^d5{kzZU-~X*W(&hA%%UCXSN4v|79-VEGW8-X*%E>)t|01H*fuB-M(*UPX zdeI9HaT=Y8F1yurkxxB1Ct#nnKQHd%+~4EyYu_}=oWhvmh_FH^_gIKhk--NE33}|` z!MX}X*oeS=Ce9EdhJr5p&%Jwz{huZKAKm)~PYU)ICT>~l;``IzV-Sm`{@)KGBAk$l zc)iGR8IT09^OB~O>h5%em`OZa8~7OBg<62K1`@X9Dl52=MX2k5YLmV5COU{NK!h;7 zm@@%Qge&6)OdkT=BL%p1<070eg9_!SfRoN}aK+u+nNX&hvl%o&QP^yMIGv(UMo~Z% z((njF4|Xb){qXNNUn{yb6CTx>9{fi$BO!d*llosSUVv{GYi*pG{9$v|6fV#2%^?WxUj!`18uN3!tDx6CEC3li-}c^l_=6K zrOD?6wz^@V_d2W|$z_E44rj72yP z2ZI9P!6u6@XhF?%_Ei+wfBrYz^bGsN_C0t6;ak<=NNx0SRSjgy;LirSvwA_vrjo?* zPO)z|0;Yk}b&fDMUGCU&r$lsylWe&a5pz?{WU=`ovVkmO1ui<}lfxrV?w^Ec8MBvt zO`gkjB}SmM4m&aEu)NC{^iD1b@>BHub@L#m_c_3B!#NIiOW+TE z7W)7&bsSM=-dqa&78g}AvZrEHXk8^zSH&=V`cr-p?7+rUd|C9Kv{AUXOqJ2k}D5I8~6>X0e6$@QeD2v6PdxgtPvfd_FfBa zXY954=w7Lb?+Q+AELrDrRbJOvg3rWOUWc=CYtg2wv1E;KJ*gh!Y~h=8I5O-q!j zk%yu|*@0c0)!mv_VzGk8qKL0H#RO161DlYn<0$=E6k8uyU-)nP!%D>f3JG8mK_O79 zSggcHWiYKotr$Sa|NA|6W*-Sb{Iz_@&Yj0S_jT^M=bU@axfSardyCFb86@U6KhN?Y zW-7M4GJQ2Ku<1xOR!G|co%Pfz^D(hhUDbJelv(VOC)1EqtL%-JKz?W9v2VJzr$_%2C_f|}y!a_!lo#}5p)-Y&pd%XtEz*?6fGr#HXc?N+ zj69sVnmy)LnYqQb;GVM=7gI8H^+2oxG#7~;nT%k-@$!4I{IAZD@_Q-h!^eZ>#lIND zFaDDB#rLjF@z~3*NovS2e)b3TSr7DCgD1tdK1%c0?Q7CKfy(`519(b}$3EkgbdO3s zvDQs3K??h8ZN%oDSU{+0#n_UGF733rmaw>zpLOs#zO8!jBnOw3=Yd*s_1ff>2yWK>Z5Dyhrc}PlSr)l620*=D72nk5sUTKPCJr z)%sQDRR9pLi*Y68gJdu-Z!8Hn(xmuMGQw~N{0J?SN}R8Jtlp`p-eS^7uy+ajUAf&- zIti>y=H}mY4-?^Rw^nsN7BC3rdCLeJ7_tWhlo-;&d$j}GjXGZNL-yY%>&j)@x-}2F zl7C8L%#1e&xrA>h2wywSuSNuX$YB1l&(l^-t6YeU@~RzooDkDXjCwZPv-eg!HKt3j zL?i7H>3OTT!@m3q&Ps+-j)zfJ2WT|eX$WelX7~C~^fow*-u8|xI)U|S%?aZXg0;t& z8|+*UOq|`Y3_a-adOWkb&hB(p$JuFLTSTt#HVq_XpduX|7`5KEpVXTGcfqTxR*UglIOPUn5{p+df)b$P*?))_esiq+K$9y=u?y zkTrWW!}e;6A{Y?b`G`^dM(l5{#smJVfE+vA-gY_0jluJ-U_l8%5sm2l-K{@{eZ2BU z5KHlQB~~BI!g}IpY_w>1>$#316Z=BOa0ENh77YcQ*5$;PGJ=K&N;I&$wdYzk+_2{F z4n-l^N2h%aThHHq$TbRkn%PfE3L#Uy8P7`cl3X+64@gBX0VZEQT3p`Wu~VmHdnPob zpN|H?)6QM^i+9^seNJpF{yG7r!@J$V>9XqI;ttGds3GP;@jH^wF-KV6ZN3ZLe4mOA zBs`Re{~1U(5#MI}7HlFC3$Lt>t9JLJoF(7(Or?$Y->yznpu6_jgW&E5ZZPZLm|EuF zkm>_dJHS3bN4Bh2bx;wF`mli6AM`EHpZ0cRdLBQLG=|7t&zQh*kwd-7Zm%?*?XK;iFX zbn%~xd4DQSD@J4pp|4FL#+BBtllZ8ofL`A26<#?(?gxhmGWu|xJVG3G6bTay*Z;(g z|Bx>mn%Gp|Y}Z5cTUl5BGYL$=Ls!q|5dc7wy9U9A<|7KgVe1EzC|jIP$}T}4w<2JJ z-|m6nZs12Hib9*+{&WiHeLK98$}S1vv}Y5Mh2fgM)n0)*LRcKhW0xx_mu zh<9&3j~wYSzklng$Py6YqO3pjlx44(DrmCJj%0CeU!NpT=sO6n(82Kk zGhblEtc+2A;`YC74jc4>b`cn+ zg)bt2Pt>2~J_=Zd4d2hKkMZter;NMfWz2QT_*gos)K0afM0BXtl(IK-Fu;GpB; z`1r?Ud<19Wu`ia4N5@B0b13paw4~+OyVwn{s=FJaeQ=O{qo=p0wf7x3&I&gNq0Ki; zsIq^Ar^xi;AJ|uEzWt4?Vu4e|x8$qNwM(eqUCfp+U$R)g$DLg9`4XcCYF0@r=63li zjxq7^W_uoI8L-<-!QhiroDI=Mp-sNjbDRAGfz<_VVgM81nFj>QOnb^@AUL$Ex*P}a zA(3xSl0?P|M1;dV6nvTX#;e?-YMi3#C$Zx?6%~h1#HQuf3DTd4M=&CWdxity9)XZF zSCoHJ0`vRK7fV->}O!b>Rcr320w->8dw1)efZwSJd+*C|ea1sDP;KDTuMv>z+5 zU&mV5FT;%%d_BlLne?wo(X1;m3BxN~_Oq)@@esdqWQrS6-Mw{^t#}2A;p~Z`emF`~ zr6%BVR~UuGFPC4S#$y}Wx4S3X87<%Q1^Dh&JF`7spgXo{t1@0hx+d^WLtrOr71*{G z#duo5;)nOy8jc)XycWIciB1DjLBFKhbN;8;PNFx$rSwKHX{-$C($RwK>%L7K1h-8O zP82x_M&;$14S{_!ZN~!Eo`S!D-?9X={AF%34rZt? z%GWiQp!?$+jri0oUT=)}ixK&-#Vz1mkUSV?#6z_YW&!rUCLro*Fj2;AWTX`vM=PGq#4#I zugH3^U=!&@TuyK$_ip3l(E*{Uu4I|@LY3F9N$$nO{Vr(&%GxE}Am(57xhPLmMK$a4HfBkU20!Awe< zPXQ*E3T`=i7TAXSydMHpp_WtVVZ zo&lw&v2ZD*NOr5EV}m~`;!8j&j6TiyQ)aA-4P!btu7cCs5yD)n=7ArP4kS)M!i-j+ zKyF9O;p4q2TIEzXafX{Xf-)ipQnacTBtoW{OLT)uYDy4+s78oIfCS48u5;CFR3miR z(u3Qu7NOvSNOz;^>i6`BY|V{qlMeSmvtIz~uF()s$M(i2xB}%NNfn9#Oc_p0fvO7b zJ}JQ{Or#&}Mr=Aj@uK!BhF?WVvFx4bO0G50wOROWeO+4>p|%;(#Db8J z@o^|^3pRvuCC?;C%Y9Sr$Iio-Pb9+HH3c)#!uo46bF7F>c)a&^R5r$Gs06W8^#8FX z{SSF{VD2%!e6oCHtjTbOy{Z7C$0J}s7T+D!5uINI?%|s>yp0B?$o?xO4=TITD2zp` zUO=xKQL7dg?yp!&~)WGM1#F3R%2z1u2ADHgx8 zKVO&PiOetZlx2?GwKq2dn3nU<5QL!G5Y4$CSA5onJocq+jG|(9*?HSs_69LuH*Fh+!xc-q^u}Y2Ts}%r)3#UienuFt4 za4^;Un0BjScIS{0pO3?6Ltk}Xj6k;~sIxvd7~TZZ`)Egt1-~6fi*+xDAN@6VxDnaY zVni>28f$)OD@4pD`%wa=UJDO;s>RisUmA+Oq-yt))Xr>_kaOGY9|q6`8IM8)#n}<# zvA8Z_vc^9?T{KxCoCJ&3fHgq$JX&4Tdvwhj*<1``$`{X!`4y#zUlB|O0wq|Li?}F4 zc^D|7W6{~@`#@3aF!3wmxWTU|4+UY+l}#kUK6R0^t0rinbevWlKE`prQD|r!MW?T3 zEaFOrEcKPDl(iV2*{7*`Eos7ytjS|!hfP}Gu9{uhmVXmx9k%5K*wKL8qE!j(K~eX4 z*C*sHLtb=x2{;$!5*aAMI4ogz3$&5Soe1=^JEg2h^-fK`uWGWycC(LGZ6T(158+@<0Gc;Baj<9@Hgusf4n9624klXmU+q!+qw@%&eRggg`37K#dWI`Yjm6@rp z_Tf&iEx<44@nX49=|2yfr|4sP!@#g-zrRmW53OniUxNsOaEOtwR{12ML%)OV10OBB zWy7H8C2}B%S83gmcjUrg#u5 z)i5og;8=)OT}&zh=LM4Z1)E6ei*T7f|YOYxlXHvD;`k#7_3nD+B$GJme; zPZ{@^D&<{e-mjhO)6SKgdq+<7ePnRp)d8S0(^))iB@C-lO6E-oy8C%ihQJU3Uy&1G z3^Mjl)*!<82!8ZJtcXn|kjuB)5Z^+@}?Y}Sl|MmXM1flqL{97%`z3%#NdgU?uZ)&hh|6Mia z*!}k|2{H-W=1;ZmYCs?L_ zy*H@LQWGJ_i5bJL!V>HV*nn`pK?so|Rtp9a&}Gm9Vd_t~PCr<}r)Fek>?ICj{NW&b zD|Se=mm_oWm|gDd6BN-fwFH8joR1i%<&>Z(Kf%6s!9SO=1I>*4+GF#HtDHzmh8d-M zs+i~%fv9ndeZWGs#m=RdQYtwi_`8|>up_50-o|d;g*P#7isa23yos*mXIQnkh(;J8 z#)w83A*Lp>7*(exC=YPKagB}~=yiMFiu!_@P+lm6GD58rc?p9>e-bO-Vw@TwA*8?l zK!uJT(PY-+uz|>@so3gE*AcoQm2shWA{ukAuvK&zp!Awv3=UpEK{`4LV+WmuI z{P<`tG!J(#R}*`R{YIGm-GmqgFr@Jz&SD*%kr=1oY{QxWuW=pbnh1#E1vdy;!h6Qq z4Sp|z6rk_xao>;k{W=FN7zpqbF3?8Ed*@0CG7+%)tEoVNn=#s)Sc(nQn~NfZ{XEuw zc02R926v+zQ@xnMT~{$;4ad@9kZ+QmJmfA-;QXn>>6X2YB;+1}-1ItwMIr5J@CNRz zQ!r+~7N$f%x)y+QU65VWjfHMy-op-;VcsVMkt&AwMk{JXp&QJ{GF)Q5-^uK+lK;Et z^P7OnW64UH8FgPdxE#oZOExT%{WvhQAauc#3|pjCj)Rh&Pe9+!`szzBv|cc%3|Xt` z1Ot@kM@D3w#5S6pfivn`VG)IZec=CS_nHusC|qIx^=1cqav||ofH7WXZ}^9VCBn-o zPeJfUh%=8?wH`yR%4A_2Ok{u#%YORt6wi7vbn3&h8-=92raDnX@OuU^hT4qI6Q?_V$oY!FcAJz|YRWXF*8dH)D^k^<<|nsY3!qML|4B7&H}8 zc9fYes^&vG5Z~Zq30jL9NRfq!Mf%(#b2}BORX@#IB^3MR52&B++8C!}UXag=kp*2h zXDhTR>lw-jhz6;?xDM7nI~i^XDKp#*i^vKD7palHMw8xIPCJ6~U*Nt)0L=a~0HD(f zP8P6}(Kq<4^u1KidTvV?G_9E3Cu9~RxK^~`skhIpGlSMOee~5d2?<#l^M6O$g%eV? z+B-6UnS~q6dg3IO@^r{(sUvq`6ED5&ipZWroQxO}$g4__P8H&@M)wO+tKFos8EJstM)R z*$*sJTCQbw6;c?9Tu#|D&PB&8*u+T}7s9#;e-yW0qY50hYm6VWjQwF|^!vh{uES%o zyD`eU5ke+_(LG6~L`o=uEc$CM*c(Ez3?K;mdrUFExfM}JN9|bs5!R88oUM0Z_@?ia zoPk)R78uP?z6}v%H4-5907Pt+Ws2cfc%X`!HGd$KIzt6@ z0-4|n0v%Y9GH0KMb7&me5ROHO>AW(`k*`P^I6*EygTxp6r7AE?5lKB5acXBATI}f6 zUCXQldsSt49d2{R5CW}=%@KlQPPppz@{{QGI174eSTIq+dXleZ)C(zlVWopALwzZc zhv5`6YCo9Ke6ed67SZX;^gB6{HjV9odP?FYOO21G@TUaU@f=j@GL~b<2BXT?pe`jG zS4qo3_8}5-lqmF<^TKal?oBM|H+R5t4$+S|IUE2OZl>|TrzCW|FTkIwCW5Z7A+zb= z+|Q8TnBLBsQg4JB_(1qc4kH~Unx%Hs-XTVS&B@-ud6b}b?oujQ6|4eOK1r#-bk+gY zPAc`EbF)=ZR?-jL@I)N6gKwuwUK+v=61hObaHrIohgz`!}?dXH*>QRo=(w zs1Fu4mA5LI#?_@nNd5VVq~35zeV5e*6ePa7^chad16@rB2ms>H2dfQnXc=)Rf~+27dZ`4EX&# z=q(5}jBXwQ(94z+V)k}GoDqwUFul=8tE-q-p9)_bo~4ZvLiJgoEY~9CuZLw&@pIbM zultE!`s$)}9q)ndN83=?R{S;KZ<|~2X29G2KZ}#skPubtn#jK^OlGB%{6tg_VEYt0??#%F*CS!1FKk2}pV2#G6 zD#6Pb5uq5y^PsTjX?;ZuXTYxD`>=Gk!Yk|&B+#+NFQc^eNQ~Kry0hz%p0-lU2i{DX zww7JL0x68_l+98nomR#`)_z#fq&gT=EguLuHRDaT9=o>qdtYjZpDC?{bYwz65j?;pQ#xEDXU)?1%pAv zO2;8n%2Dtt62Z>?*WwJ1|ALiIqs+1!(CBOJ%lXWMT08Dh5UjM-$dv_G2Y5A3Tb%3blzalD4 zE&tDXEiA$OvnUww!P9vad;kw3Qj~y}f5i*X9APK zlg!`itY=k4GVrhn`WONPT8(WyEMIqnPxOy{GKKBW99g&b=eTcJz+3DM6c^cHoO!Vr z%tZ;7fPJWoa3ZqFvAP7ewl$38aix9(c}7}1xw_G=BZJsw6+7K$6gwo1w}NpabpjLoBJ8iyGvNDn0|&G}}uqz>?jO)9_2R<%wvd6aT_^ ztY#gg@rqYDZDga&9(OSTbd|?bX5~R1XXqIvk7Mlj*~_M>3aOwrHWCKX~M! z_!ghNX_&wjDLl}ogzzx9;p-A*aJno3k=wZ0ScDoaMo-z7K2C0frv$~>e>nccdrL=e zHN^v?(yG9fe%~LeHcy(^hQPeR2e#4>Xn_KPvJ*iycMrdj; zhP)2$tr7N7@bjz%RR!uC_yvYNT3t%C#o}7!L9;t@9>i1P6Obl%dkjU&*Ahh#w{^%k z;r$e{1Iy1+vL5!Hy{&_i6$s89(GiDK**_jn4A^G(8c(!$$J6m^h>d3#O~wqj*G@oF zL(v;B41p}wYi+S!(-sN&U>I9SuWDemh39h|I}3-GXT^JOJ@(cxld2&4yOmAoFlvy7 zVz@CKI&%K}bLlJ+Ch4p_!~_}-R*?j*F2awU3vi0q@EOpBJ!&Ai?sDEoUy{wz{EWG4 zTw-&#q=eW+Bq_wEMm;T{<=cHo!-UA^Yw#Hu0hh=~0gA}501}xmuz?ODBOANsWAXud z`%!EP9~Y51U(_)anuW+bJw&?ZW>8v&l_m~Rf_ZZUy1}ewH#B+z6N;{MZ+zTd1NvNl z8_);jLq3Tb&;i_5(#e(rM~$?nXbX1%G~9!VK)q*bkO1ZvDKQdpif_opUw+ss$ANHN z+=LpsxCt#k8U0Rq;C6saK22kqmu^Bwv#X$+5F)eSgRX8ulK@A#355xo>qo#FGpCq_ z8kXn64iIkW8R-vV2|$dA%TjO(Je(WsL#K-y&?sbs_-+>G$4n%$XMy3@vjHpDu%>xA z+aWn2k@l`$OP^Pe;y)rm8vhcYG+;voh7(@LaDrces+#zMn5i-#c=pXhTt~4sP7nNL zDMv9-SzuN_QrQwv*_dCl;q1r9H_ByyK4exclS*KgFFMJE*$j9s__GzvW(Ou7CBrns zEkeQ|4oRHZxIIV<+R*GYHqcCakki<#=45-2SAG>=EQI(xc(PlCQqbQD)C`vzTvSC$ z9SaflqElUto0Lu_7viXGUmPs-r3LiGR`jJAL*Xntj;&~nOm&v?wQ4A(W1wzSpgNPP z{6qrp?ViBjnE+~t0+owe<*Qo3^IR$RAx4sMgiGU0%ENJSl+EsM$}QKBp?(TP(!hF~d^N3SqLd7`zvx zizfT-CfZWfsWkvnKXMkAVj+@oLJ_!uZI4?ZQdad`Qcx^SBJP(k<#Qq!KzEF4=cC{( zQM@U)`;MG5ZURYZ!%%dy)^<^i-UkpIRcd438z`gdOIm9kyN6s$nxfj(A2){e1erLT zwps-R6R6punQAdqpLjRN*25f$mjgDc4>nsD8-+W|3XXRnHVhJ;8HM0w7X#u_Q8g0~HUQcSnFnTunWv^b#& zUBN~Zz|u)BDbnt`q<}o%kKbBS;Yu%0bR>7E(QxWQFJ+)A~w1I z>=#d?S


P55^-drFTIi9FaZfk<@odtPNRQ`Ls4XdZ+_=)?93biBA$bTT)vqsEaEcNQ)zooiFBk(jx#GmoE34d?l?_>P^8-MBe z8-TyOXkc_>U>P?jJ8~vr>Vcdr2aCxvkZf)Y>{OsLK7josp42u5-XM)>48R%)-&h%5 zl#dr#nET5*a(*-2*>Ml}U_Emd*3KgQO#zJ|Nc*?>&W`&M-Xe?7UOIrY0~UiP(0Vco zI@K7MLgH5w@L`=Vr+w#!EaAVt)b4@*IYs9Z!&*{72vEDcBT^ys?nT76JD$a-tH9MP zksa3rF+jd|#egnk31#{-xla_1ddgl$G;$^npDW76N-)$v;80 zSA;QuFzwYXASd+w)9XWNb;0S|jWm(U3eds|`@FM2H9*Ft`ZHPmxvPicYy0mfD1L+7 zOaaTM&1d9;7TFPl@YT-5Ot_vAHn$1q5)F7`k35aNJ}%Z{*^4^HG;TyRhp=w&w^i>^} zo)((k4)rO_TtjB7dw|rWnjsk4iKtgg%cL6cg-#kretF&Wq?*wvCp|RXh9PpFbNtv| zF0k~B&~zN6uxh|KONXm(J8F|YUavUNQGOz7a6;h1`tt0+$k*lL074h1>3>2U;2+m4 zb@f`-Gw78z7898+GF8=pW|udCxSJ3b)=`4Rzk6b4*=K4CFTm0ivLH~i zZV)AI@F`KE1a{bGDiPvh5ZAaZwzlXa)U;Eyf$KEPJx;v8kPs&w$~UcKZx1{SO-GAE z<`%J9w*Rz*b9IZo`Yv9#+S?m(#TV$9Q~t3PMBE&*QR-2(3{8LuHkV^uFkL0zli=~m zJh3Y*equkNfh<66!y6En5-}eWBWU~SACM-33&NoeiRU?-K5Gnwiqpj)h?EU|*MotN z8gL?ZmR@_hg7gp}p{mymq*!sfr}cDE)bK4tin(}8kwQL3Lk4-JET<1atigeo&y|A> z0x%8YX)<9vf=x!_Bngto(`2mT7-|&zut^49FI-|@)E8VlVGZ`kwL zuLN`@{g%X~-xBE-L5PeQHPmFJVH4(7NnPfJ%HkGDPCN-h@tHV~60QdJCj(+aapE`^ zm)PU}mqit;A##|r*bsH;(O9^b4AgAoE)Wi})d-Gw&2f@AEog?@LnHPEBmc?@Mh-)H z`YHPo=f}n@5kQfklCn4UCUU^{c?^nQ%rge#9S(2NHD+w7?1 z1i}{4D{CB06G|8+xjQt7aqUIO=q~yW&teu&5uwm&xvyIw2q&Qo8hR7Rs*SCu9(BB( zhX{CKT4W!&MYz|?QG7J7C=K@uHj&MYv#;3K=s5^f$Np$w+>C-XS znQ8xH62&TTa0Zu&nf7bH7g3GLoA05ZcFJYX0tl81NXA%!$a%&ggq!TA2>`m}CI<*a zwGUPhW_MYZ+rLz0LV1894g1F|5)hV)dL14rPfC6(;{!y$VU<NGaB zY?AngI*Q-Io#hB%mi?zEJ37|nqB`zTX=w9BSkr`#Cq)|+>XYed^(#{(0uN`|=SnSk zUS^a1Of8L)`1H_x>4xkpjsksmU(O-vt+()*LDL3HPy=W;3op4vMBG7;IfO5{D;FC? z$=gG3bh0n|L*7i%o(2CTmko@Yw#~&jx@?m(Gy-Ou-#i#H_Y!wX!NxvAXidGBJ6g zQ?k^6qpA2Ti$Sb>5~gZ`m7cmhrF=Nz6s8*6ZQ}wM{LC5bcs1c;`=2*3HjDc?x9tlM z_8dl!Xyxh6oIhiO))1`eUmDv#LqG^TMR=7Ej1VH@4tUB3saiDj;1uT5X!-$_08Few zO~&aBk&hsZr`P+V<932;+X*vPN{o>W*sMVUfxXc5Ae^J*-%vUkC*T+B1}1H%vAva~ zRDs+H%}L|~K*h{5%pp7Rw}pK&lNP`NwH*Ep$OvTfwDv^f@f5eRTXmU?+##cWU#?Kk zLfo5;^(`4`8;zxyPZf}d^op_Aup7oNr*C6?A7lE)VA^XKOboDpEaLoVRcUyuBPJY; zYp1ZyB}U=rW!~ti(Yw=)2+ZZO_NE9Gf|wUFkAy}Xr1@Zdds?t?gI0MMxkJ{>6l26@ zqy7LGqV2}^PjSE)txF4=W@m)W4_kYOth`>~!heLd3ICu&97eau{w)wWWVQt(d)oEr zkW4)~FEgE;geoX`GFaGFo&k&D)>9Dp30J#kUj*(zl!aj0R{1bA0*Au9ZGVvsGJ$H# zDlw6LiB*EO4LpJDHTIlK>=C%N(;n6%B-J4JFs*t6JqDVNzrj_lcKk_IoOGv z8X_m^p2A9um-aHJ%V1f6L*Hy;WBt_`FN$dBO%J_+5 zX*9!?M)?+O%*A+1X;eN2yM1p8C4_e2VnFUl1tEMwV&Hj!) zwD=7I_u2P$93cW-38cEx%SbL@CM1*#mKMfxStFIhL)3gyR&MJFWa@lWNVGAI2nePU zFl#7Wwd=S6`sgsEVmo|h()Wd%!12fU? zgYa>vt!u6AdMcE-g%0YB;}^LFj%0z*TbQC3CTbU8Wf3DI^f)+31YNittO~;v$6QdI zxfoZl3qMK2=X&6HyNrIupw}E6=fRl>JA|NU#nliUt&H!_K{KL(YK-v%U=$T2UtEoW zXtaNJAzNZaYC%$9rq{$vWNkApvJ0Z}MZ*sW^DlXxv(Hv}igEr~_&MAAgs{#5aK+7d zu*bgkDFGSIw4a%!;>1u{?Z9{k%>Mb1cwYu9;_PL`R`UayMEq@q2{)C!U)tpUx><52Ic<3r+8$Fuq z$AV29LBw^Bjkl5)I*sqxjS1t+xFZ~2bYpES(ZYIL8o7eGP+NQ`b{sT$oz`&B2k$6kpPUOopM<$797ho4(Z;^dfX!bBNkZTJ1G zCmk)un1P42H7&hvA7&Q+cELeth?kXTBH}TaZS*j*@s=WQ>jlfb3Ie&rV&R?KQOtkbYZlsK${Y(1by^rAITj!oh?Ap_z?g1Uyx zI)n1)R=eupk&f2?#WbfF5?jwyP|a9W@`8F74-l9a^Bf^G!nO861OvseOshp5YSH`6 zq|^u&JHHlJ2vgxEBkced?6Q+68foi#+kcqai#8oNz6Z4 z+9gOeBGNucB3{ozPt<>7n7eT}nW0TUV5W`f!L;}F)f_fxy(iLaU3t3LJ4or81uz_5 zGJ+%C<|2t8^oaXd*o;7%s?qf5Yv_@(cOXEp2yJ0@*BY?s@ov$P106>zdmD_`ow9E| zcG+4be5pD&@_33Uix<)J+lt@{+NmFpr-;GvBA(rT%pTM#|4uB59LSgjgWRM6<1=;_ zJc@SX1Gl>}WT+Gel2OZ5K@HVK-4}ESLsd3cjY~QBp)Lib&%)ZKP$FJX5>D)bv6NHL zTg_|{a1jX61ME(4#1VxK?ON49(V)mYI3*A2*-Vx;eNhdN0ggL!5k%=-JJY-7L0ugJ6WNA#`<; z`5xE_)2^G;zRW@lRBT_Sv5RTfn_r<@xF-WL0`fTpn~oo~;4~2IgHGGo`Xh8yLdYCM zE4+jubIO%^d*@LsyJ*_k`aC7-+X-1LyLPtrT+gKlG-4+hJ{w_N+F<9qpJUj#+#CyNR!|l>M2cv-%(F}c>11tS_D1#-_+Bqpa;LnF%EnGa398qhH;qMM+VW~ zX0}K%ywsfGZ z{ldFE@1U$#1&~Jjb$!icDR@H%XZs=b2F&4>inWV@bDr`{``nW-RvGr193J;Z2V1C& zI2FVh2(0FI7{FJ;ZZ!?hM(r5;FwGLQ%4zsreGY-@3aFQ&#$V@ger&O)oxpEb7x4Ws z_5M2Lpof8>9tpUIU3gt#y!C zEPI8Uq;pv0POqmNSRp~m>>PO6v}PNQo!rAem!W&L4%GnW!aRj>%{hQRBHhd{@j7I_ z#Mg%P>I=Ap%s;Bjt4+8IMmn^hcFEz|6ZyqjA)+9o!B=q0e-&Yvq*abVp9QT+9Y$jV zzc30Lu-3Q1tQ&k-P@4eG3;yy@Ud%d2U(HSg({b7_xWH_)7j0&jG&yxhF1+;y(T@W- z<;_z2(~dsOy65M}YGr?ji||E5E2Sz_qcr%_OH**DPN=XR;qt9M=WDA{D(0n^dddgF z6mFYVxd@*c9SBgT9+!P;jM&D-wyYGcaIyr5g*sgHqE*ZIZB#-Ng$h5{7T%1W3yt_3 zt3yYyv5pOedKSCc((g`3{nbE-2WKG;c#!G~(7E(px zB3aaMz+{o*poK9Ap~5e*YY1tO3)CFAy$VnjN-Zko;P7#Hh)NS?7~0*9dmljFpot*p zTQ#Hb%h`F*<_FQ2!|lHN(C=KnZUnrAk}5k{;yVH$DX<=1^gjD%mp@5@Y9id)>GzJ|S zTl*$GAHnV`j{!6oJhAxTm#CE*I+dylDNYRa;PQGd6-2oth1#M;d}AIAMz(38!b7u% zhs;B&-6u+2o22PCfU9zCc8sXe-g+@c@kAMzkT#(`=&ac=#|AnCN?R}P(g&9TLMwdc zn(TG|!g@u;HpyYGY9RCU(w!ANP^x5^sF)ChR5ZR2&X$7yANjA@58Q_S5W5=Co&?jj z!I_z$N^C#gP&b#WH>77`s9?F8Y{n`kpe~-Em*gJ!ggAm1E9J<8oI<8DLPH;+jyMa0 zu`CL-h4Vn6;N21f3h99+6i^T<ysv)s&xGy$JB&h8P6Y#QDQxoanY zsh$Jo?4;2-cA(4qKwAfNAc)r6j0FcgUIaY8C}dqXJXH9Bwx~af#z6u0!hbrr_$KIR z$SNHkjC|69&@zyfP!0A%feU50U5t;h3le{YDJli@k+U*FmK2BnZ9%C<^f4P3uso}7 z#@4UauLleQ)~Y0oMZ6j7ReDlx(E4FP2$5aP?e<^(-N!SrA^l=>8OdwR^n<0?-@l(M z(RU1g_Z8{4qrLh^YfpN1U<()U;YLm(xL_b9a21OVw;B6VVP@5exk?6v@Vr z*RcLnDSf+5ai0WeU+qP&G*(q0H~)3EE2fj($WBgnos2wQV>YQ%9v%^thh?U^%>TNxg=5iB^G;ao;&!9k3I z1qUvP790+PcdUz@w;x($`^Z=PZI|CKlgXM;H~!Nf_hLjx90jtQf{0I<4*Fm>Se|cY zH*N8Ha57x__okp?Vi{qWeP9rh@y-`TmMuZDe z!h;}>=0xX11Es#h^$}l9`BDj4j+}53S_(_b3!aA9_*PHh%F~9oV2Qk@kz*pF)=FrN8+PhuQ^v@nf2NP#_m!c&1>u{!pSQoHzSLNy#xyFH7>0T+p%t zhn8Lc8EM(YV4!7R598#s>#9k^91ARm-uPmZywgU7R$Ya4)19MLs24+kI)-cCZd*7t zA+v$ZnBaSVglAY;#QMabJq7U;{YU2*Xk>G_w-_)R7|(f|o%Roo@-`e8^ga8=$8fBp zyFocd^5pEg78{hGWps34*;{~VWKY0H6751a-yu;-9WKWWQ98K}?_omad)n){)Esh1 zt!@>7!x$njEhfO|OJqWbP6yk`Gu1&)1(us1+3g>Lioi^jH`vZwjgs+d8DAY%n{{0_ z22Yla!IQh&7(7`)x}117dQ)w7KBmKub*Ui}W~n=%XW!nQ9%%(!_60!a^G~ zQ;kj;)BpnJV$KqNV@IlF0o;kSQTUhHj&Ukqb&o+9ffxo&{79*9u)f4syJKMA7liDr zoten%&Vh!24}JC>O-TQc0Bp^N1SZDGVB~7?rlD#XehF1@fc10CT`TywJ3Ghg-0IB) zL@w>bV+uci6?0PVLyl;6b58(@z{(Q4?KZ3|+lS6Mlez7)kah1f`2JXnnXAwMLx1=K zd|w{_UJM^wSW7IMZF@*O9?heQ3Cm_1dOva5w7vVd8h-j&;;P4GM4b;N2etgl1}Pe~ z3%C!2E4ULrF&iU?yz};{b5kOnPeYRPo3YIvI|lc$& z$-owHS}K2f@#h5ooCKjcxBR`viD@bL=LDQ@jNpt+4<9s6%#=%HPwYW&^`JHOKvNI) z#UAum559~&7^oh69eZ%HdT=QAU??BVXpD5olZJ_@xS6Q)(ZuWI#R7D=B%X8=^={$= zNi;^Fal$8QX#g`!l1S)o;yO36z)d{qChFb92W}z-qbY?Aa}&CoAYD@xauZLwiF!Bj zftyH?*04TqLU$9_xrqgC;z>7A?7kT~0*H z@a1{xLfJgCAwmy1T&nR&dPC$_yfj7_z!P7AO_unbOg2iy&aq?1BE@)}r=4~h=1xCD zMd;*KM^7XAAQ=;GRW(Cp&-E%7oxr7PCT^yd064BCy$KFMn$a&HjSuD{PuYnyTbKf~ z1q0DdV`nKKP9&b%GlzkcHb%IgL48kSWC(OXOrdld^caPau>^umX-QzcGNOOTqvAvR z3C_KLCGQ0`#*$DvaCL>5oG4F~Stov>Fp#v*erzG3mVv3HM(wxECi;-Vuga#usA&dR z{>ukp)@ifPgXxN4{V2xtpNt>|*p;bs36@sPb0zRaKEqwr(bu%}@3a`16SG0_*PQPj zk`5zc+A@!LJMj#cfrj}*(7?})$Y-E|M~2SvlLoSXx7vAtCHe@mdJz4oPXP6deAwnv zP*@8kQ_#-VLeT%d*Av6ZI7RGD|JapbBoht^dH7tow+c3l+JO^{u=L^(BY%y27L8=# zV-?_4oo?iuBNC1Dkrxu}HR46uA6@Cgr6H1r-xPZ=BK2S}mSV{CS_!ja1di(-3!wRS}QC2f(y~Wrw>a5 zwW=?Pb=;bMzZ{FwC0=3PxP6Z)Hx}T6;&M?Qr`czXPKqyk= z+h^|Ls8Cgn$ta33*mp{3g8GWFXO{=%MqX)`)N8AJDd?>^B~OKY%@2iI0It$ppX|wOx z=~kft#ryDQs0I}{4Z@>NRXFY_7C!(l;7-9O-{x|58?Zc(7;tB%%wk94jrq}c-365y z=LjrUDo`Z=HB(uA6|qz7L{Kr&pera*<2s;vD^M)}Wh+q46r$B}5!X|5Q--mv#NV&+ z_cZ?g91UzDUoulrs9M4gN7k#j!&qxE3J7KqnQw6K11T%4rX22&vR+oy5JX*P3#;i1 zQeb@b0M|_Wj5*{{mXN)X{yDBl2n*zER=sEPzoe^#J!0V-dC!a|Xtj&>{@OI>JPHr-=(tTzLa zVJhtbR;ydy#qEMkoDFf|Gj7nB+=2G|76_yEPxyOu{zplo&%!GG=#nV;lg{ULwZVEG zOQ4t3-^}Rs8+QrxU{FGG1}viP#pV!~u?i63`xD%z9u*a1tj^XPF<~L=e`A3WNPEBKl)5NuAHFQQ@tJ>IQbNIwZGsyqFjFgv3G?A=)ZSfg7&gM@6M=j*-Xv@V~u`i@@}xwNSc9#-vg6^vjM$w zx5&Ap80N_QhP8w}Z}%<7NLr={Mc5JNqrx(IWXQ)$n)s*|UnQ{p(Wex5&J!77KS2fC z?7ae-_8`H+tz{<$ab9@jZrW%C%@f1sB(MGS=SMmkA`$||;p=tt8*QkEmWf;J@81Oc zgF*nBkOXNhF2XfL24UK>_Dv|%&YZ}dH?xiDLx_49Hh$&gddQjqQv!%s!`+BKq-d4yW@QvU^E;Z}aku*5Yp5p?d|*Z-|pd>!>c9 z&nc);>$BWE)(M;&@TgI1FXwDEfMtm4DH06aic zpV38LE|W2VyxcFD=sD8!NGX3hr00psz8u_LWMeJ`o!@{GlZenuJK+q}lOe1_em)TQ z)TW+={XrReo89sz2ds*7f>QK_fC8f?Kml(Vm!knCNsiX4w>Z5*C{6Zn00kT%CtDa$ zCWE$<&ILy_#ZMjK$&>2T5wdwWw*=8%j9Ye`>Gu4~2TPPbWCTnX9NplMViIvn{L^(^P= zp6QG@kMNuc5`-C3s>0TAk`n9Y@+d>HR6Zy^Wxrk`zhlFo9YMoHl@u+6;iuQWbQdf& z+(#3$B1igY)wk!N5?0PRYmeY;<`>7_3Ub4POon2UFobd7}0|^?5_brOp~s`Fi;vbA#{Y)AUjGzExF` zmQ24jq$&rkZ0)PBEyficdI*1CBHKV__ao2@djS(7IK9bVGX!&zDPPSzC~=)+Sql6e z`Lw|g3WL(%0ePB~cnV4!j8Ln`QzSsJL@8!!3VbWwa^QHSl4U7S>p10PvK%Y@%*0|+ zkEa-H+Livsl2q~EH5o>Lu5m`DzZy)+417~ z#){KC3l3JG+Yvt-K@0SbdVRqGb>EKAHG7ABkM2F<)>blVe@x#36!BYkrvgFJ{MHQo z{XBhw^@FcqCh9T&>bGWR== zU*FCHKfoDnf6dhRz|Tt>cpY(>mLCs%)l7fQWOtMaG&aifl13RoQ;!SiL@WJ*gf333 zZ)`;8r6i6hK&Krq=waP}j*Z^Dl*G{k==9?SeMUE+p|4hWI4|Xd7-ICt>F|2S@q#|L z8_+p%&?m+~4@)v*4E(buWdgh&sn6=B zh*RQ4Ky&O&(V?E$BpHB7LW_Zt$Y&LLM+3F!B?$hcX3*Q%VcWZV7-!H9OrnJN0l3HX z37DG$m_2&rgP{S;Al>?TrZ$vWJ^MEdEgKv_oRk5&HTuWCmy6TBsQ)B2^2xYJLos5? zoQ6+)+NvWYxqkC+$ukH6#bWd_fpjL%AW+KXL(7J+h=JCfDf-G{Yur70+QIrgsgXV7 zB8@0zJxhW6@a}jQIHWRR5;2)bDq&0uxTg~CVASpe0!}Zo##Idhur81>{V$Alysu_l z!pwJO65%J#Bx?dD($U~!DLX3s)4GB0OeexmoKDsR%%-EkFX#sTnccv5<`m&4&M9jG zrqt2kk2@NC-I|o)t{@nNN%}71 zNA2)i#rp%=ir4Xn`86XIlPV4KEE5we9S%F%iaH(ZW4rh6Q>_X2uD=1b#iMnlxaw<5 z_?uRbxA%D0Q|+{_j!)Ju<1eRK5_@vgImT8bvM1Jruak;2zeADkoGWt|F0w(+!o_lu z=UjVIIrn{sa>zd=U~nSk=ynDkNGi?xZlxv8m&DS#osS2TO1u9%lm^V}rfJoQdn8`ter{U)ir#ow*G$Da7Wtqep*=c>WCbUP|e=+Ag zJ#rvxR)IC)QM4#KL35VREN+ z{76#azxxjgPo@-!g~uqxo1xBjO({lypbm8Gpc^*=4v zU#!qq`Y;zVtpTp)!I-|;U(<(^UQ&}q0F|U#+L08^gO1o;%e#T-W)8`ecHnSIJ8-yk zD>#|pEPScm!2xN?kF8(Hwc^t3KqGUkp!FuSwC>vD0`*8()6N~Fyh zvc43lb!w?wj3o5!CAgSJ{O0>=rR(EjdT{#dF(wu%S5QP4X_tw8T`=960Lp*+oQtFm z=j)Ig(>DAEwLl+9$u3_jMXU8ridK9ri_Y{|6F~VBi-tDsKPVdgm$>ve?2A-DvAR+L zC2X<+y-@+s|HKMFz4o6~AaMaotbkhkqykDBWd$@;0Bb;E1=9bc3LKRomJU!0pp>tq zRhHi$tUoBzE`sqRQEAuc`Pn4yo z1yMRh$-Jz{$*9Qfw~v>Kj6+2-r6Q-qD{_L&$b{+GI<(7N%nq0v6Q|=OK;di$<`g@W#h&E1E`=)p+shStg53hO*gAzd z{4<9$QBJ;PL#Ac)jnwtk)3zYECG>u=w#EvDV*lF<1tp13zi}5f#AGKo?wAcr^ z%l9g`CfC6r#G|jnekzEj5DaYdkzly|3aE>9$tJy)8#*}Ec}_oT!p=zh<#T%KYkbUP zZm=$C=8o+UYeHM3{p2|V)VKPYI=t3blVZ1~1EUqDz)}UwIhcM=Ka8_ z_~D}Y$Esgn)DM!vYBmzpu>##!Rmc!(;*ue$pCUt2KShREKd?2Ej#1jyo@Y6O8u@M&1?Xeeba>=7Sri-7u_)qD z4RkKhKRtQy6|IwMD_X~DV>7d(0;8qfcQqL8jt#EP_*AmpS7Nh$)W7t#jOncNtaV*m zvC(gSbyFL|HR<)AWGWu~?z9<;Z`!aJf#R%7>(25#jYEJ|G^K4_aKQKCIi7pMI{Z{? zZ$=?szpJnI;i|8JG8)_2#uiKeDAL{oNW6wiBX@Vq4UvPR=X@`6;H3F*bww-~;Qmh~ z&)N8G?V~zSHr$)Zpkt#1&x!4b@a(S{pd?YGLXISgq{4Q*SJ-}Oy{hb4rH}llH63-F zHFc|}c2%XOAyHaM(l3jysvofZ(hW}iTJHZ(>o@W^>zBmoC-Ea$q>uP`&b1U((|b*QZ_vyk=IzK!HIRE=^QJU)~lm+U}Bl^7jc*s?(SQF_H%)r&I{}TqNCK)fdEWwb zunY90PC(-?;y{h*K*CI=(-T>xn?60o1$t^Hpz#;{0t`2BIxceufW&&l1`pk?GWV{r>uc(92gG$STXg8q=Ds z%UKJ73pWQe|2yE+z%Y&2p%*sKfVJ3$fcA2oy!RJ^dAodvp4RLy{1k6Kg`Ip=2^#IM zv3`b2P1SVXL|?sLE|1N`CHfN8BGFe%@oN-L%`?hQ(Y%rgM=?e3@=Bv&Iy->A0KV42 zh}1xc62Ji=MeNu2(%l5F&;jVa4!C6v$P1c_68f#MUAu1wkN#1yleQp!Td?*(MzXi&1|NBjVb}263Lm zh%byhP?>Q`&|Jl_2%7g#Au8k4lMyQ9 z90Gw!8Q#4k0nzCxZBakKrB!;#-cylcr9$Q>p%E=S(*#`}EZnYDGH9X!ljZsYIL)L! zxE*nd>gml~*rZjT%6B}GV+rvjXr*T{OnTu4Lz~zhEIgo9A7*JL4{Awgz_D}$k-o?c zQ1t^iyAG$D>7sY!t0sH!GBNtqDxctRB*biO&9V2KXiJh=A)Hz}0x#cwZz04a-d&BuSG@^lLtlWg|o>i3K4f}*vR+`-z z>-k`$aR3IS%!_d?+FJ$$ckPlnUfL>p|KbFnvE}KNyUL2h`#=B#M==Qt?HRfjdToZ9 zpbb@=pQx7VGz9*-4&)H|26Y{F)TuuOO75l(ISADDtGam(?mJq}awjgNCAED~6nfp2;mw+l9r5Xa5G zd5pv^!~})?_wQr&-(BKwBiR1ya4%Ynii39l{sxD32hPE15{v`2%dm zekO)_VhDaFG_W81xa-fj4Njv7!%L)Q?{FnnP|rkuZr-bCSTVCE1_DHVQu^S>Zs-Q78+Fpqt`-_G1@w5kSOycDECoc%R$dU3}nfb$wB0pi&s@;ysej@txb&ZN5S` z-`Ucb@HxcDk-r0Bw;s(SUL8kx;)&1GbM6%WCjR3ZnA<7d>oUY+1;Qdo6cP5|&s=7s zs1Hj*SJEl@077$Bz%PzRk^A{$AaK~(*Wp`G+9IHIo87#aozqN*sPc=Dq;u{YPaNq8 zT`=8Sp6j@C>b2){Vput;{ouwQe&tBV$hy7noQ_F;!E;R@@8v#4XLw8+eC6uY1?Q?G zctSsw(}SFJA;mL$-fyvZTUAW!>wyHG)`5ogFdey2yw}c#yZd5&J>G(8n3w05KunRj z^z5RiE2>^f4-OofQ%9GhQmOM?_%tJ)6Wp5EER@7JbM|R)rdcfS+cl*0{f((*ef7wm z!&1=4n6!MBQs%`o#41wY7~KW=CSd+EWR3X=vTCd7^tY-k&u2b18Uy9n7whIN#2r^M^fP;`+WPy#e_t6$UhDzWZu0DvO$uAH-lerjY1o75X+RB)(;T*BThS{fFW~IYp zKKnY{^9-zP#KoQ6H_RpdgVrAUD`*#h{jd)r@WOA;zW2#Kp0K$I7*;?4@SdEDCweVE z3yelccJtz(QGhzeE zfCb?9egi(cp{w6}Ng|PU;?h|;|APVqjm}*P5cIsSYDVc!kgXPWM>HvC$g(&FU|abe z#vGB2t;HOb@h3uNS+EV&s)&IfCE(TjZ4WyoB>MJuhTXzeT7e<}M*Iz&k+@g5J~Qlt zJATX&9I2yB7CBSXHr_e{y=x=Lho=-D#i)aKT8uitn-8!{?X$8V3Q3L2)U^1K!unja z48cN;s8xW}8gZ74E*Xn7F`sXNOf{@&;fC2*77##!;64+cM!qvl$=dn@%^QHrZWZ%r zUaJCmw0`nxhW3m48QSeTvlyg!1Akr*nM<&|q50}?(8#M!2MBlq zR=V_g19USb(z5$3-E$#!M^4ffG76cly__;5(mqwI{1|sgougI$4Jiy5D*=*Eh)x<} zl2X!f(t$Gq^?d7U++<N(tm zqSkV`NPKBDK_HQo&PoTeX=}b7)LH;0Pg=&uyKqkGVwOEv5m;+U8-QVSytda+IR=A_ zdV#Zb0Bj#RUseXM{UQRofSy`}WIyBFFt5E--2fHue*|O%qYXJb<^UQla@WnS>dH$a^F5l1hNn z%2J$GTa1wW9#nwU6f*m`bJN0}`W0?ul4wx}>#I2Ta6%&kBv!qyRh=IPVSkNCTzbcAdgO4fws7+SnD8PaKRSUQMI?4E zqK~Fa7Fhx7SfOPTQ)Rg@=T~4cW84Va8sn_OQgf1XkOz&SZb7zy;mgkiq989&@cOvC<%NgwBge7{#Xtb*q z52c!rai`d!e*yIenZ7I#CiuQ`r9>(OLO*K?gPcliEI`d8)I(`n)mBh|M3`3tro#+y z<-<|BSLI0+k!fEhG>=v>La15=0Bmb`qt??J;&HRW-(*v#4KL9-8(8i4|YSkfsfPKV1oB3kRU7veL@A?WUXw-S}w&;%}7|~{IKLR;a+KE26YYRqEk8DeKraxyo9+&A*5=6FPw#1k%E9X!q5CY{q zykCxWI?1;xrFBrU^RsgYo(RlTmM~af3j#!zu$=vk>1EjJ-g8I_`9+TukFOGe%j($% zge_sb=}*zCY=o6j$>PvC-QeG^-t2;ZrS===VQ^#3^V+ZAo^8k!hSBNEu$h;q<3wP= zGnVO#yv3+$kH(fP~vo zB8-AWj2a0Ff+!l%G<4&Qb~GwTSVaR2iVL46fFnqt6O;DRfFc9V;Fxb5N8E7(0xk() z5*FE9Kv418oZ3#EI_K1>Q`h3n#0&*DgDE(> z4X&jU{xb!o?^0txeT@~3`*Q#d9hL`Rd1!}vqcb}VtiE=bU0aH=r?Ue+V;8YN>G3g} zTl85UwFE=}eYQ@c#1vJ|Z$Ni*tS4UuA1|Eu6b!biZ@~H)D?lc&J}h4dVA3i7gbJT; zebiF>tx-K{zvZcNydiJN?xOZ;#yIRXly{cePf^DoWl5F^4>e6_7A%$8219Iu5S&Q$ z|3+ku=Ik5Uc(Z9p&a}&%qB@~&_PpB%qhx2^En)`x3CmXp0N-+3W+JI>6lEbvA>;5S ziWfO4@KcOYvcjoMYHR|qlFi@#Pu-X92>t7${1;2#IrNW`hV)BGoPKkwKjF=;Sq^F@ zElhnY-Ud3OHK2$43EiP2VA^;Kj)zVE1x~{SetHx9)A8o42MR|lIIlQzug*u!?15zU zW0ytsCE5_$Mu0yz!P$Y`7+v?eN1FO_rT`RfP^b6*fnInEhwEmXrkl~I-gsK~O=F~Q zrYLB(IeO9vH~LfXO@sN-W*MfaQFgJ7>IS^o9o0s+V~T_BHF{ma(gqCOaD`mXhIPnB z9l9tB$_yZ?WTOi8EG?9~K#hT~Z&V@q#|6ioyTw7R8P}-xJ}L|c?>CQ;UR|cXg+vAX zgs1Dvd<%?{!(fp$rEjvgfgkmH$z9NnNm<5aeVCieF6M*Z4(_93(Hx;`2>pr$V7kIp z-YM{qr`p3Ix_v|2=SAQ8t-F@xSYr}%tsjdY_=BtHaww@C`yRiw4?2!C4ysCn5(|Bw z2rtLDkG!G7+iZ#-H*Z^KFkj*OkglvBki%2_Ai&&$TQwvjDz;3mgM<&>;u^o@GvUI) zn2J3^@fOubO#lU*0T&(k=s3^H?XFL2(k>mcj{o^2o=sYG0RYO58Emp-!}O4(``vl#BNP6(;u9S+gT^OAvN6B zg*oU;VG5??bj!CC)OiNUlr88lQ}2As5<(T^WX|SL>E&*URQ~B=4s5hXy9rZFIxiC^ zWiu10B8%WmE953m^{y2xzTlV(clQNfoI=`BTRI(&2x*l-nNK<~aL-|fLgc;G<$VO@ ze0dt($6=7vxeP-(t`J1wHn^e)Xz81RFt&za2he>&Y4r**cpmD4#!CK6pugpZ6mY)& zz?AN8zvZb^yp`<6?NOL#ruD>;4n&MMTo|RCtj~=S0`XfaP11J6&W-vI|qdl)U3~ z?@l{7P575RQvY>!m|OT4ToZ%_zl<>QFQrG@qYDD--0a-a=b(ot23l{_v)hAjXom0& zg)gJzpNSCMBJ&v-OIL5DZg9PnddU$7OE1KO%3E=25(-^{Pt{|wc&rjXZ`xy3HZTPa zW9hMqS1ZzE)j0hOO|id=@q{*N0Y4##FToRD@Zq%@ zB>+q@MppG)5A6Wt!(gHcHUOb&-gLoE&n<5?u!wE4`lPa{DV0xgFbX>vKY#pl*6!XiKRJ zRX~Tj@j&ars=Cmn(zlGEYGiPlt*XRSVZAU_@WB3O1s=ayiWhfz{@@eK3Br-$Lo7o* z`-2R~;nappBQr>13=q);#_ERC*xOzUOt$Xnkj|JrK+E%|aX8y+RfDxCTZTl&8og%P zLn7azK*1H@zoJ0F42V*oe1|U#4iqT=V!f?W=_g%0fJ=8#@MUd(*N~i`O3_1da#f08 zszFR8!D3aMQFx*PU%z=2PNqva_n;mELv$%@jnISnZAih;xtao^`#FOoYCYr-k{(g> zbnu7n0#TirLFB*7?YAbRsdbavxq`lOy@KV@rw|Kr06J^qv@Q?` z$6-0lLscfpa+p^WpXh411r`eaOzd^}CUK)XbFDwCaau2(xG0Y-0LBnER>U2^WfXM4 zhWl(E<;Gt;y`UDYYUm74TWL_@ZUHrcN>}J-;45q-Seh1MJ&+>N`rJI=YMKwT47JWJ zS68swLEkE;%49aVwcH)`)WXuhm69}5VArBuV1#;uHr$Ne=PwfQGNcDcfuxA5 z!~S^6xmUEG*0IuqjRoVW>igpR?rw;EEryVj&>dPo_1}Gf{xtz5+S_k8&S?i~NiL~r zoWLdJ0p!;m?i)$SaFL8FP+;;r^>XO`d_Vk64?J+!nSuQfvyXN+%5Zl) z8q~>mJ_i?L_#IS3t?3EBZhznHEC3t&LV~1>fsry~ex1CSeX_d}DW+VCIVnv;gWBCE z>t;K4DVm{H9OAl(h{XF+Sdm0T5Y^QahydSFTE-%*F-y#>F%^ZGg4A*TU;(tA1=wZV zqKX!AKe9^n7Ms+x*-$Pv+3!wX*C&bp|C?(y7*aHIt!9*&O=S=# zcF$rNA+iCv&^up@GU(B@wOev|Gnv@3@Paao5c8-t5b*4Im=mb!*_=J`hb}O1ahy>) z;V>o6-*bD_MF8$hjZ0a_;M2uK_y_}D$M=B;<#N*B z>^*g@-8W>Is~?ovlI_SWHNHL=)8DM{eJ~2tRDfy{`%1eUU}Z&*nnxrzp|%3|y=WZi zJ_GIY$yMr{G-@I8`KHW?J_r z7SDpnHei7tF40l;GR%l&>Z%QdxJR6xUz?`-An)pIb}}Zxx|!`<%v1OtAxN-#8DW?~ zV;0~7DWl{)QWt9`=H#A29Lw3H8fDtiCE*^<8zi%aRhXIYNBJZ)<`hY;YvGp=SAaKw zP#puI8e!AH{Uh<>hun~Z3qNw>K*XWSam2t`avjQ%3}en=q{v|LmQ2_ve8`ZKZt+*F~v0o<(Zjd3eS(q4+qMgiSjI4j`wY8-8xU@^H+|JkIXG ze)F}t*#89SQxBK0PB7tuN_Uf*!LLlHP;bsP@+GA&A#cH|3@(laLUJyMG2(~Sf zKI0~feaVjW%E=t$PjPa`AvYU5%1_bQdP`INh?7oI{{IUnogFwNywsv~C!L``k!GCK zNvB>({)>~&Wp*EMCE2R705NJMxdc?Sm6ZfnWi)frIc=h|7S*YvP)0|sBBMazfA=c# z8w{o%m13F}k|GrIyB3mr!TL8`rCG7m3mPMI?ULynj zd)AouqOk4#>HlqwISae%AhQ(0)r4<|26~P881E!?rtAdT#you-cBzFC&}|Ne-YO+V zbYjic7aL5|hGGjaJsdEn0}M?@PW`FLT(4ES#mVsPG~5~?w!*#zU<4}~l0f@*so~va z7XS^~#`P!zdt`RZz^0f+#&l#%8Wx0N`$AIBDi8ZGl=|g=l3Z#&RClNf;8Y=0)l0|N zI|}dPBU`&x%}YWSSTIe&a>DzkRwd(m_IlbIMQrO}TDJ{bQVTHfq2vc)XQK8(Mp>X9 zC;>sWa^F<c-dTf7}Se{p+*8sS*w{q1TnreEMSsvZ;$9rs8{U`gEjH=XT=I&rKi4kK6yv7SBzmA*K41AAxrivSm+& zIpX|X1Q6a}o;|-_K$UHiM^|hL%Kba)lT!&xd{nD51(el=kRBCCFB4KsQLxj5K{~iY9Cb&FDQ`^SFnGAZ;_b8$guzCU_`{o zFiYOV$nYw89o!v@b#M5+<}U1KGi)P6u!F2*4pxB6NOz*{JFu5QMxT_(oa#`ApYM~4 zej72gHdP?LkCTxrJ_je@s4qktDgezmAG;d|U@Om$1N20n$Hdu^_|)z(Ix)10%b8f4 zrXlMVd_^f2KfCuw^{^STSCv!B6y& zw5ex!R$YfL(7HsHa}ToRSnuXopXFFT`Yo6a?aQhDGTuMAwkIr(XM?lKhNbxCoY__9 zBBejBil)lr%s7Agq#StaN3DlxXzdB@ET+Nc5_YU9S+U>L4SS&BV3=Hl6k@NbCq9Fs z$X4SnVoyt-)It#k8BXTE6=F~Ovo;j=ZB2%Y*hTx{A{%TrxJ8tRc|1o0VKJr^I${I4 zNPzsBu<4(?wxkyZ%A}-09`D%kqy8+mPuxF;79}{%+rr?`Y}a6iuGdw9-dX>q?;CH<3kF5 zT=uqY405}%TY;Jg2J4jYUxaEu6#yM0`M`>Td=i*h?S+mZWP{RD+4DZlc4QEI)*>Qr z;YCtITvm7o6cl%K5so=lGtAc@1eebQr}N58Gf>KGqNV`cP#Oy!St)9Y$o(e2Wxi)S z^F3(_sFGZN1rmyl1G|Ttk>0|Ao>ke>s??cq7QX)o>s9 z+92f(dOOX)0^j3(M*8|-F7;7kZiI}cFXOJ@1OPYk7pyqs>Jqtt&t6Y1qZwDX`cJ@b z^%#E1r;$Ig?_;^y484HkR>GTX19rgn{K1PI-lPg+q!|;TFRNWHH~M3Xn)~7LaKCV5 z|4R_97>U)rI8b5LR@b}XTOcQ{BP5`51Y`4(vHnb0r@XK3F5)ELUDy|dX#r!Qtgt0Z zNL0;~6w}V(6r)VGNj(F*D1E&L`2OqM`lti+zHJ)XJBuvTj=@rvgbf3htM|bqz`hE& z2TbuXb`?w$cxx3NV#CL8c%s0+CL5Dt1gTSRY3H(z;I06VB@BmESG~Xeq3W2zbSv~2 z63jjduDYVA?HXW_tKr7kN1?yqXM27Qu2%8sG1&bLY>I8TFmNP$T1sJ$fQl{b7Em#T z@UYakAvvHPDC`(e=N7gL9J!+~zHe1S>~dzIs;3)(*>zRzfoJ`~fnzXYIfcPZ=R8{F z5UH)l*)sJ3?nLHkqbXz){h@O@eMkmjeA1Mrz$QNN&ZZzRip3z$eIa^~5y{t}Hgt`! zEuk6QL)%m_L1-i~fetW3xbDJ_Bz=;E6Tm&Mc0{4e$*bnhz^Yd`*PK$;B~7>D_q8sY(_Z$_|6y zFpRR12=iD~K+!-QmZNRt5c0_(jKgkaI%tEAW z!4U%319rEI!nHSJVc_?Pm~w4Zo_jG_;&9jqM=Etw8n9u251xX|#uf=%;xDKYc7;9E z$9)2;#$A$hT7+g}2Z#s3+T;YUM8P>hvawqA#k@#UE3}nZlk_?j zW?Uk@PC_0viPSwbH$9IZ&+i6Yd<@{nnV+(d#f0a#%7kKvH~Mi(+bVOBe244&XQL^L zkAR3@V|7CKR&{wH0cc6|La4*=z67v5tLPjB+;MwcJ*Y~{Io;=`OP$dNrFZE*s6$FF z3V3J{HH!WZ^W5wiZsN4u#}H1p5tx-Q^Fq7%zV2qhCvxh@pPo@On>GS5=m`Zt=n1me zfn%6b-3UMQ3YS$N^5?KiC^M~&aE?Zsdbk9M3Fmx5UhJ2>Jq zR>WV0^WWj3P9-~v+`h}Ji#p(hy07mBAC{Up&#Pfvo#8LolzH>kW*zaiyGSwqS@ zodJgt=rO?T3P1@Fm~A33k2S$uN0Fx&bIa7x{Q*%dI8PKDc;rxS@_O@P}) z0Jr~*fIFN7FqYvcz{wH79e*QWqZPoO!20+=wc9iMXIC~5elCok!;sr+eb{|NaY5gy zwZ89)@mlLUs2_(JQR_RVA7Pm8!yKSPtX!H-K~!064WUWqf-~@KytbY-5+S84qQY zy^3l;D$sls^=zXHsN@H^@8i$>E@$>Hk`KyGTx*nh#JRX?+LWBYyCC;Ru&K|fdY)vm za#wOzLlPNQYi4eD7`GOh(#sv$sPQ&VlHBej%0Eof1St*uL!yj&MRTe4g3|n<_T0lW zl>2uzQESb=x_RAGn%@eNz?#8(LSUqEWm0FTQ9U_LGk^P*2AWo|k|;PeQjD=TBK?oIibu*Em1B9JG3ShC{1y>)?LST?2yOQTLJRL| zE1}yEiu4kZ$cWwdwsjr!Ld7-@w!+46*q|CE`-EW}2A<+Q)i9ovJYo(m`s6muIs27F zpq@1>E&2pcqJu^)X}kwTJE-*ZI9?Q%Q3qP8MzoE`wzM>nt%5cgm0r)LJb6DWU3eDj zaZ`vwUPv#M9%+B-R%tIb9@W!#Bt~EyG*V`8`k{ZMr#!2wxEP0$zh?S};a!1^Jc=Rk zSXkKmFX`@v%zaOPH!R7mJ%N33MeSk6*KdQ``dAwmNcE(@;{pC{Q=CgBJqPAFrAT?P zBN$5kCjf$zQR-jI6Oq-lI(?2}ma>=vgydKypUF}R+>W;OI^V zk`Kaj2A{l`ERR$rUz$L9Z3??(I!8QDZTz+^ob}iGiY1S)gb$FJVibHH3%&!}Tf9sU z+t;o@xV^D(9ZSl_mvnA6(sgFKK}d(roq!?0jhy9J&6a>3R_OCo&mf_vA!!okG1Jk$3%51$nm^3O{&vgm)Ads=2;p)F0=E9 z@WGCNsF6H_d1mQ6U38waZil3X4VmOAjNA8eqD%d4f2>QjdpAx?o5tKTLH5-jZfxUH z-iEeK^B|w;-@ivskmo?((Vc?(1`bEG!2KJUy7Z;rhx;9ioA@y2z9!yh;+!AGr>w-_D9S$ z3vbk^0)B9yyraklgx^P^^prsq9`XI1Kat z>aP;aIQS4E$ymCejSG+de*-L$?BUz;G-^E{$0rA%s#e#$km#xe?QtnL6EOm&B(Lv+ zAmfLzo*9}6dz0K{u=cC6P5X}K!rJNz9LWxwwd<(afM9AGgFdF7GH#D&`GvN7nJJfW zquN&`U}(0IwXQJ1%&f%*SZ$T$3mgGqcm!ofVHGBR1;oi5V^9r{YMEW;c3Ojh1gOcQ zD2WWKik|q(PCoIkqZZ4?ud0#QEp-noH&TWzGu*jLjFj9}kwe2d#)DN8@w0^|hqs$> zVI==%LBpPt2?rNP;*B|C&Jvm+m4b2NUR~`vRCyQv>T^R6#`E6RsrPeq0-Fpo>yxRF zQa&+5*JR+X)xfdSR-J~{qO*3Hp}`P~tBMjK%LHfEHC%7=SQmhI;N8E*LkF>{sy9d2 zazZJ-qU8k11h2Jq>TxEawC{t{(>0`*7&EC8*ui=$;T4Q>5GL){$HO!v$NE5-x6v5W zdu2R`st@LcGwXRQ-&ePMV{ujSJY%EI&(u$bCu;e zyyN#D4>z>611cfhxYQ_C?ZgG;t4{&>`~T4tG&72OcyFYThgQ6@1oB}DBTJ8x5kY^> z1h!yt#l7p=HU>e{n~wZvmxEFM&AbM?(Luw@@-be)nO(5DrRmj;lqpwXAY3#J%2nai z_u%MwFuMiv!3Pxl4-B`F?L#Gz+Y-lvdPP+Z;qR-EvW_0dr3P7bAkGtRET7(fB1OoD*nt>^H1 z%V*a84ubWMC};-j1fohh-*P2@j&M#gw*J+w9IO^```WVBqp?yz0X~hQLOw0|PNQ&t z?nv}0EMRR*J|>cDm!Teyx?lM66U4h|Vw2KvZgZ)r)h`xuE0`>G#oo3qwQ~m#lILbn zFdH=ri$G{;IwcHHgZmVI9@ynGG6vV>;N;mYP@RpT@@y2eXZPGj?OBfe4#w|hHHN>@ z|FWA)FE6Cylp>8E@;Mc(gl=7(4Tfxvtp)LEHf1-nAV?=>(1TI3g1H`jkY&})Flx&j z=VtqRL9&6bJSaZn>m~+$uwPy=v@W)M*rRyy*2R_k7J4jiU3}2@7@vtj-x5BPg1)6# zL=v8YzMfm`rav@r@!;d(T&rYf_U#>k)~VCKAwk8lMs*$36vj&50x;7!g!UgVF4Ri% zRF21xJN`YyM@=&Qu&5ipYRg+38&x8F4d4lKiY+$iFriHLZ}(X5mF}2mT))v+xqV`A z*n)}1-D{0e&@PWnXrzhm$U3fL8?nl#pm;U@ABiqsU*38Tf>r_L(Q@GDDvh5LDvT9l z9t{n~l@V=?G8(LyXxiMelDZfiY}p##3)sHL1h_l778a}rjSNO>s`1}xV{==&NZi*)DTM;GbhUu z*tVw3k8X?s=nf2ihz#d^up*J39Fg$2?#YDPe_*rGo4W6yl%9q>qQ+t0-QB#o1%!9W zUD9{wNZ(0w^90z~1h3ufbHc!XyCduR#JRHDH@4RJC8*)~M7A$MKG^uBI<1xb)N^e4 zl9nxJmT#Hm6)=wb$t_cjSj_1b%B@m=9f!IX_xtv&ts%AwDV-vg&4@ zOP74G2=>RV)n>nOxt42n6Nu@rgHHoSI#7pI6(5T?N*7_8=uR(w2T#At^&Di=JJb8{ zCqr5%hlf$WhyI27{m*%coImxduJ^CD|5j=L7k2w~TD1S!Uupl%(*Ebs{vg^d3Rb+e0mNjcRu&u zBWPxAG6N6jW0p7{1ZpB2liGcwph6FB>gagC6&LBtUavv8dmRT^R{WrkKjiS>D{x z{N9$j$NnT#Sa^P~M=qp7x)s&;`GWI^TYUa2NH==hA5>#>dMkPSGbclz{bfLz z*5)G1pSd3Z^9c}h(d_{1EWjRXITxAb4rV#$S>WP@oP(Hvry1%R zu2(SPu>_!*slhiD+!}Z|OqlmDvgN$xRL_=IG5q(#qe}#}3f7sE>w1D@NSy;!v1VM| zWn&&Q9$V`my;9c;%C`@W;W|NVQ*XQmoeE35PuiYqU6iMn*uW*bIr^JWFcWzwV7EaG>x)2%*gKR3nFV~&7Xp< zEj$%SSE26bDU5)SJlvfQ5vziRm!bL0rnZhm81(1I>p|a% z>0?RtumYBE5OzzLDRhW%Si(>lp_e6QtGej}@MU&;=tnhfzN8A>;Kt4*nJ|CmTJ`o# zn1=!RY>aSXdhw)AK=#V>Nm?iQL+|LdE0=lrdz0S4ttv2UXg_rE)(G-JMa2!6Y{+9;PqH8U z)-&vboUBg^ry45;$HxD>?3bbfeZqb^Ec)vLS3KmJX_Dz5XJ*O~%_9lH_<51DG;MWU zmN$J;;i)+^r>|3C9I!V7$dcBOObdIg68Y*mI0hhKE9s%&we~*6r$rBQ+n(Nf3$t@9 z*v8-^2TB5*63xe|%`VpPgL>&k_&9_U%Nah&43^0|!Y2`%QlE~-rna}yTnS2|tNfXV za;lHVUK8r{hV;H|jDx#wnjN>JNhSz+#M)+yIyFaRxzVT(){N1VXJAHQ%QH9UvY}D( z3@XinVgZlW1&NNlhI_!KN6NZ=12^m933&^~ZHRv*3_pD4be$T(6(Ut7BaC zh>MnYTI|;>vjv_mD683y4YqB{rvvHmTrf#Lm*neb1st_8eAxi~T%MtytGeI`sp;#E z&Q1>o^JCeI8BYz$Eq_mxy_jV3wvgL4_`r8#TB=LFB|{LH4s>YFLrh>c^A75=zXWp+ z6~QKzvkhE$9QhCV5h}9;3+x>HpCSo7PkusFJqi0 zLDWKM0R{?&2~E2LI8|G2YGZuU3UFGPm&FvFi6Ff>V_Or)64YCNgfkMFD*7#ptD!$r z4EH0eX3pXLxuN)!9FTXOLX+c>;3IB|<^F@(GK6~f^fUl&N2fqeE)iZw|d3#ZHDujTT1YKc6aU&e>qmxR=><24vy zc+gtP--Q+UtqD}&H>M^K$46~|%YYOSVDHD6t2kL*uEwj(U?2}69L7iEqBZ;fLkHS8 zknK#BmfLIpL)!y;x(xBbg6B$%=fDjZg#59>F8CQuVb}B$>U(fs&@WS0G?L7hM}&a2*9TSkn0+@E16vH<@I5n z_s2+{_OIgN_f4w*aUR&$7&(FkoR}wxd7gCgh}B?BRGxEM%hUKV@=SK}z*b|EdJjhy zopQeacPr&=W}Zu(JZ+fg@u)m+wU%cY^TauMz|U+_6OgAx8iv1jDp0Jfb-j2lK!J-w@*<_!)jH8>jKB%z#P+Mqo*)U?F}s7=esI$pF463wm?&YWY_ZN3N&l0^`>wMC@@ z6l^b+gA*x)S`MO2=CP~7`FJVE&fo#SioOhfvk}5maAoLpl);~Y}Oh!%N7^(tQkLkH&DWzOX)Dbu=KKDYDSS7@#dH;P*=fM`|wODFz<&8Dqb4#tKi^kHil4RJyPq9Z`W|eNA5XA+mPF zHUzoY0jd*r&VRLk169*;)yUnjOB)qNAtQcfl`i-ZmIe6AhZApj0asV5SXT9x0r-JU z#w7LDkywxcu=B8aKufWgZ)B`R=j7LFjU2*8r(a=YY$CLTGD1US9e*|=1+*~u9h&ZE zz;6D0f^VqTrK4B~OsYJU=k>fuPX0h$iL~S&Cp;a`p2hC-K_fq5D>j*>ygmr?r(c2J zfpIL$$ln?%>SD4Mzv>LOdg7ij}%i#pGK?zh(Y)Zbg@<{i#D|9}Hxkq#e= zP4?y;-ddeqE$jT=v%j^@_el}|PyL+Ttj^Ejbm4!m^U#`2hzt(G{i4OJ4YV=r}3*(KIW@Dgw`l?`gdHLbJ)&EY&`pKAI3Hl3?a@ZJk z2nzStWOi$m2Clse6lnBXTS2T7c7RxS(Zo7W9fO@Bno*ceT=x>!q4~Da1b%-!tNvW^ zdIYb>EMtEowO`K+BcqxVVy)!LlNhMKIe46lO|uRZ)l=yia-$$F9KH=r_Yw(SUJwt< zoBfn}uor@TI=vXxIE&HWAycte2F`kN!gMG$uS z{N1TAY5kecj{U;LN83QesSVV|HnjCvzcj@53&Vd{{2_ExBfH6CjQGLELZ^==*Pe#h zBcxioKM(=plYhi(WYmCkjb4X}po{w8dndo&=eK>7p^xec@d@_2>SEX%gPcMsKF)(@ z9-sE2g7znuZUZ&VI~68KYr4d7+hq_}m6z8-EYwS)R5KXxf<(9ExNe!(#BrImA`oCS z;V)W)x`7NWY)q=tG-P~krwj>O{3{zc*lt;Y)?;gDTiimHQ2E{WE*Ea;@o(%`Rf;2| z*H;@W>n08gCLIb|6h+iTK!$-aL`a|E`xjs@(nVc5M0(R>FK~Jh+lA2>dMK7l*~eH@ zM?QkJ$?62{NAhAWKkbiU-MUQH{i3#&;ZH|~8_o#Dzf)b`zS0GOJhN_cEp9o^>rgiv zl3GJp_co9U>jQ~0oUF?#RnasX}lF46yFhE3kLY7c5#p zmxb&lW7G~J)CbKGY8&c;auA4xq}g=Iml)RApFSQqlEFblx`aH)HVBnT6COEICe2XR zb{s4Erw~jxWDQ;pW}j`GkvFx+2z`*$l6ZFb zdSaC@pcs|&!Sob?e@w2xi<tRJl0NmQfs9;o+sGh#~C%ty)Fh zRe?7gVLX*x zyPk=z+N!ZOP3>3;gdFolEX>9HmQsNpoXtkb<183=SA~w?#baE!@lUaZ*{D&%jX1%G z+Ck#Vw|0?@?#(@6d7YY68(dvmXy8+1 zrdJXTNqK+B>>M8)e z#)#yzAVeVY8?W^h`d~!27>YA^x!@acw|H^)H*|=5V0*sc99pq1J5+)vj!1a%>oe|N zZyg8MSw*fBL{8TL=(`K0KA}_Iy%Uqw$k+!MPdr8#GH=n$FOf!$wIODFI!HXZN;$g7 zPS~vb)DOK`SqV|J_o5}pZIn&J2TLMW7`@jUWw>n+FHaC7;C%@nKI?}Z*a7$`{M(JUO6HV&h4UV9Ys2-P%CpZtH{5Wur}F6wE(kYV=cz0kiRTd5BaFX2+;F9* za@c)y!wr{sDtFGsRf`v5L4En!aKpKH{<$LDaHgkn$Q(RR^HkQYs|+`E^i)>#-5Z8W z;mW>!`-UC*Ldus7w4<|1H8r!1w*YgXF)#z6Emkkpq_;RnV#oM88iw7mAM9G`xYKP@V~Zi3MRi z&<5$?nJ?o*i4xkE$CRw%y>mkx7ST!fqkSG*F%?@D%JqMF0lBSUuF$^T7rA z4EGy~Fy01l=LLy!HHZ@~@}g3Ut9#;I@}#rST1#Yi#vZ{{$76v(Ja~@4ybI z7*ij$(I0gfaY4HexM&{tycyo5nzof+qpRYX zbsK+nA&|@p79;$8iXa=S@gh?I*gTqY)#y#e(6z=;V0nI>*XX?;!tmj&HRY&mQQKAF z@#7nDvv$_;RpG|zIBVovPtl(XXddS2MnKiG2Oq)|!Q>a^{={(Hj)2#Le8pxqDlz&! z_A(^DcR7)MVbMRD+D|G6$Ye@6@XvKlu+PgyvuV+XV^FMz>czRj?Eqh z4dFXHokKPvp)FFP0mOXJGh-BKJ6P@fjp*BL=t7V;{D88yz*RY+i&n_dWi@TQ?zQ)M z^ir41$)JxxOUH3iZnKM0t8R^_AhCuza^ZtV4Ezu|F?R;ufG5~5l^Wlk1h4-hhNBKu zh^%2fgsyNXvYG74Gm(tZLQ_y?grI~oGGw*0^9dDZK5%;Ogt1Z_zS5LcB6UwKK#<@D zYK^Sy6Vz8NEs$tIYIs3FW|`RFayXRZ0pL$tVRQ&MephhCU{?_^0;MM%W%%x8HX?8Oh^sa8p?z0+I--aT}_?YE%7n zo4}T|z}B>2Aq@0p;Pkb%$yV~IKb1$bqIddm&4ye6>TC~XvG7o;wGzze->|Q^9|Eew zts12VK`o_C0UVBJo5+3y))WI(Mpwcn0_(#~;4RE}$ zL3Op8St3;puvM@x7z=b6Em+GJ8%f;>7S)$y*`2! zgIOT3_z4AZQx;k@G@Mbqh81xYoYTJUeF(&K_ng(emnHx zg?;el3%M32*f*)2uZ6*o=X~{W;Fq>^+M9?iq>9vGSHmrx27dvF<+Wa;Q-U| z|Ccl}aY6gfVqB--?{xh2z+X@N^~K-i_#1@3Yw&j?{zl?2`zBoG2nnT*<6$KX{2q6B z+V0K}f`virkVB~t0Do!ZjkPIT=%L#CCy4u9FNP7E6-dPJK;n83iL8ZO0n|;5J>HMP zmoN)v6CYt_S{zMN%x65S(pYjRxq$GSu@cG+5I|igvBPwTeNnTNMhT7_!^s5pzJbiM z23y{0xE7lh^LXHkt3pY!gRS`L$E%OF!53xcI9U25q@%d%BW>86JioPti}C7g08wkc zjd5Kj90Ql(Y)L@nKO?F3htfmUW{URQ9h7vD>DZ#OV0mnNsAlywvkn+@ZUmyK&-zLS zaWa~3Ii^eKAepXq2f0x&?Wsb^^H)e8VaLm1x70V&*+&5jkFMF0-J~P^@J=-y4Juga> zd9ijASceo}9(wQkH`sf)WMa!SAbmR|Se?e2g_56m2~>ajO>NO919K(Sz>#=>bh#6b zVy~JMKOXZRTN<1-Vm~NW&7R8cfFK&S#2Tv9jV?!Dy+wWBqX!f zWU?{|6Y503geFun^CWN@XwEL-zD3!Wypj0_B0s2H4=@o(%bdeeOHkFZ0Mn~VTm1@j z%VHTJPgUT^tZD7g32TwRp?7F@Hpa#Ydz)cr0C7Ti3C)H>ZE&%vRro-P9OG&#(WKmS zrbhbgV?-f!GHk~C*5_?wi{J~~B8bP64Vo7b4v&Az}6 zu4(i{W*tSEE1kQD*-?uU7TSA+>|GB=5dv12K-1_|SG_k8VIcxU*cO25Ro%f3EhQ`` zWmSi|pd|&a2%OfkMm#it8l~!(I^lrFa;qfd)iIq~sjG=7T~}sDT^nCRT?6@%x-#6U zfm2rkY*|;ra#BiNSs>^)S8o_|8s!UVRbf+Xn@+EC1i%(D0gO70(5=Yfp!?mdSrGom ziPt7U6$ofEbVW9lkfh`o#rWfT7?XFuORTgl`>#NZ_jtTS*+JPF(?k6)0bIHnPQxg4 z8&-pfr;YuuKyUP5nWa}^4-kkk0&&3K6ugV>pG-V#^y81)bH)a7N(4kUKz#QqKnwy1 zWIaW)W=khAE2?C9k0%D|d7Z<>SP0U9-(hXn3&i$+!Ar083|d7nYv#$gB*KdAVq}J& z9=wSA9?}*6WiPC2o`_q%OQn+w4q=KFXBmm^8Gs z+4)D*X~{>=0?l@s$G&jtQT+<)@z~{34{lIPNu82FI$BFz@Dx%{JRx(bH{i)39f08(#=2x&A((NRV8#GoM#6RL z2}!UcsnuFtz-lQs-yPyORr)Zdv5P3$Q+)jAk~biw+U2CSgTYKQYtdO$u^gsa9B z<%%g&)Q82$X5bx8;a6>=WtO^;$(g0gm!op~{Hz=dk~t&=0^OY42qn*JsXKy6Xtpv8sl#;`&BP zpbvwuE?}pn?pw-7^5=Ls_9(`R*cxwqUJT9MvbGmB!Z`3Ma9gh88S#0pqD~9^khc2d zgzK8Z3jgEJti_?_aN!?#VRdaas|edb@FBb(c`I&$?1;}PGDg?^m5p|;JK@>SJoS@@ z7q1m|gK8-c_Jot-+Wui%WS`Gq4$q& z+Sv*IfU z$OP_ytmy-=4+sGEdO$WPI!iW&ryaADL}kgAEa_6-xega%D~S?1ykirUD;%P7|MO@g zsuj&(aiQ8kUhvaPr7HSl6*i|wBpf0Dhrz1kv8st@S4)ZK4uVEH1E*x5bRj{)Px1={ za`ja*Q<8CrrVpa429BRJV> z&X)^$+yJSwZ&LkCS*jK-BRHbo#bRNqb+oqGc*_MVISTvso=z(EVg&)zmJ*H_;fa0> zl@B!{M0G`ZBvgIg)`aTL>XQ(v$vB3tUg{?UIhA#u^Hdm{`74qxDL$HZUw6EDFNwJ# z?Y>ml+2ckbGw%K387WZaB-D6QVj*O6IbgQuSIWX7pFG$Sr)9^`4b<0DuH>S!q6bhi zAfF#a#8ptkDQq7EsMItZiOYCBeF3B*>=Kov7vlvM=aiCKvp8?s^5ofJH%}{c88+N= zGrh4@Lb#GXvJ$?-0cFu9_%4O&K=t{9M!_yvi(ci~#qJ=SYV{d9v=~*vMx!8E>bp-0 zrL4h2ef)!TlAEm^^LMls&wt?_+NQ*B>crJd{DMvlL$_f&negYm#G=5=uU&=7PFM!S zM=S-yzKiBscAlIB-5ABSeA)%)-JDw9rwg9Wg8S)$PqDF(_=w^Mo)^_9rbDY|GkLsD zev4D55B4?H(=E8HtN+Wn;+XX}SM?cUg-voVLRHm_9x%6a>U*B9Kn5!iI4HfENVDj# zCnMmtzqHk(@&`tzpDxk2f<`C|7Zg;Bs`b#c*FZWj)s;37Hua0kSo9k4H5f_#!{4OM zKjNX>QK`KzLzMpRal6Q`82t*+qu(K%SI`cBdF=hN*NV{~5BwwIC=)!(rGBWveZ=(D z2c(K^f|BSm(V0di-KdjpV$wf5NhOh1uf|5Dtb)Y z6&lL_GRgYy_3&j6=!f1Zk5dcN5*--Jn4kbKa3k~!9~uIRs&eXm0%3U4=bk%kr?_BV zZza*-^=V`g{TG;p!)oPjI5icd5j&g1>SkTqcr6v|gde}JAr*Wl^v|~w<>c-Ja=!5*8HO=$G@H>D%}@ue{nJVjt%^?Js_hABAhDK9|BwfiUt;t_=Hk#Kol_fMyBYd3+WETC|<*OS5Zf` z3{qo5l5=*cXMfCqe=R}}6)%KAyOnz>7o?IuXj7dEWXZ8c!9e>y7^3d;jJ;({ly-0P z=4`63?Nx^huyOwD>D%yxM(=+kZ8My0BM;7Zkt4P*+j9RVIgG z$`bKul`X|@uq;X5E99L587~5nJ~>rtmqtL>qIUZq;ffPnn%;#-1tZ7c>*)$m)!pbT zUS)jQ%0{HX!Ggd$NALoNCr{Qhi}gOQna45FmH}2qB}uo8URh%%R<%%Y(*=gMI#VuF9 zCjooDMjZIG3*|1xdpfi-P}pEQ7$-3ot1cBFy}H(gr>oT)VW(x`2I>u5KWo<>Aw?Jl z=-3}RvoV&3_#3Hrl3l==hv>|(FhO5$Q*4i^&$lM z@BUf)KJ3o~v%i&((hPj8cA=+`;FqI1tP{fg!GFk=ER_SWtoVa3q-OxT{J}TV>k0Dw zH`A-|R9OdOU6mK>g{NL!fG=Z3oi}rDB`*KKd}eG99jlb##O|+*Wo-BWVqXMaljandIM_N5C_eq zHJ_PDD~5+X)nB)Tbk`Hx-y?8Ff({@Lz~BLY^T`GufFe1rZuVY^eL=}~09tDN9X()- zt^?G8X8=U%hNk4iUGNni+wd?KUI8B>x66P@p?Cw<{Sg0ZR>X(06d%hz?YzKMdG*pxI8Ngs8RR@zDTMkQ_6l$2Xh)10L9 z?4%#rN#QWtUAzVsIIi|ZkX6XwyNW=?ht=!rz~kg{3YUGYj#Pvu#=`Z58MlY#0B`9bKbtj8*$(}D0VOeje0qfer?o3 z+KVUyi<4W;eT|0_N2gEW0r%dElcIKL3v-qum$d}x={3!pU66ynUG&&}#_ zisa(lI*d=qWt&Seu*eB0E)X}Zl80whgm)J9@HMhrqw z0BRUJ7(E<*Gzndg;;KCA+8)x;w~*WE-5ZSOFoOLThEXyvwZV330d`IcuvJlDe>h9P z!VqYyn$#0V4mbzZbyK9>{rjR%NdLhrP6k7Qt{8YWw1Scd=8b9yPD&sWNz}E7x1J;> z!gIvwtlJ-)s?e3ARPr!Ti7j*n0ZsIyF6tg#iT1T+g2_k@80|H-th)zC=yeh5C8vnM zu^3&(8)$!1PfHmKTbAKs86BFHK|~~wwh;7gjg;_ER0*-VgqvEFa8b(=Ry=|do=uak zv|GV`3>=Gfn(_19P0ctfs*pHc$hTA{I|w7q*j&`2t8Ql@-e!f63I>kB@3HQy#gRhZ zd@<5j@w$*;i$ea`vXHJUWKZ|#mXNpvj>S8L^oQ>xq;*q$QXvf|;kmK&iHvs$Eg4 zZB^=2iaHKWGcrK0j0_Mfp>F$E&xwulaM5x-Zcg7eze4VuY^m8r8S6+ax2nbO>*qag zY8$tz&JFsx72Xi#8>-skcLspJa22KsE&DKt+E$H=1IsAE5?F;meRG!Tf0OWy`D(^X zl$Y`o;^BZ(b?1x-yt5olg9saA*KddN-U8NO4^ZZW;aJLorgf9vO;9i00e{cW zF2qm#ivLEZFMp;bogTYZh|{&5NT(^hov#xOc8E5~c_+0P$)rUWN{ia2fz<6gjmJ;0 z!d&wr&gDR60)28$*e0Kbbm&r;r;qOc(?2msg*K0dVa4eFhw#nkpYT+nZ0UaW?jZ<8 z+mgw2fu4ShkAhMWEC+s#WI{@}sk7ORPXs{G`3Qn#m`c;?B@i-+K_uoFY5X6bjkA+e>wTG>{Clk%v6GXs+Q|nr zB?mi~+`~@3wpnr^lez{)ou#pBpO?m>B_k64`477#x{|SlL+mEmL)5(Mww0ktacB}d z|M_px`Cq}Mk=?$c4tA~nzO1Pch47}k!C8!i;lSDiKiGt`=1L9c;6}jt8{nwN@gsdr z8%ZaZgDR5o9%h_lXS@TZ#cBdGj>C^#_&F%NDfisL&2r~3x7W^{^a*mG$K0O5*5;$$NH>!Bvz<&#s< zV0#inH?ahhc`E%4aw&fhxCVZ79a5v*ZL&f=cY~O!40fYw#JaCgvhqD6g_i9?Zo1eU zgFv`)qUxRF`4@Z|BOBG3m}`D(6Z(1vK%zb6Rf0Aj@o-`zq&zuluXg5fBAtvtK0Y&w zKzgxJ*`>M9(>v4mV+-d90K?ijrBOUQ_=Jz@!866#?r?(x+@geMN0irC+qYqNpq?bjVWCT_EHi>BTza&h#nxEKDDVUz{1DS$FAn zuqznrZuJ#%=t3XZT&F*FPsCx>cVXayed(>RC*wg12+}jsdjXBM8yS0z-tSL66?g`} z5E*-+i5RgKFRI}jqxUCJ8vF+z^;5gx_b6VFbMz4ySdWl1F9O4z(3b`E!$GnU_2I4X zc`^%{fh%ZxU61)PK0S>m)HdUM+6JD6;UOBF0>B#&$BgE|j%u~*0~&Ais={sdrB(O0 zL9rVelAL{X6j_H%?t!sVPPnuRher-GGcE?oIg&Nz9%ze<+&%r^*XHHVe8$VaRM)rl zTJ^SlI(;(Wk{UT3hqEN8`+AoCE&;4X=~Zf^UAh;xD0cBx&5Ez;w*dkac&S-~ORMna z$4Fq$DdRBSO@{KZ3pDjxqXV3l0&F_yyGN2>y=Z?e7~tgp#NFjKF(-fo zj0ntn!i+UWaoh>>Ul{Be>FI!oVb9--zb_ofNX3J~5+H40H3c`kQVtd|+)P5yK;r%f zv6ExBK?%iZ5k<8l!M!C2Tbi_ZfsmRYc|CO!s-hvdy00}|uB#zsQvlf_OD9|=u}gtoCm18Wme zwYDx#*3P2;CE1vOjToG0Lm!hskY0R<`F;#l9edO{Had1KKF9Dh#Rx7+d-2ulOB~{o zVZ<=xSJU?a29Y*z>Ak#J^+u>a*DAC(bpY&{LRag9VOQWC(0P8&eNJ1HjM=`MAN>y@ zhVXX+z!k8L?1fOA*~2`Md5SMs=E3BcC&GH|3XYj2{o{08s1`)fSNf$<4oL@hv>JE+ zEC@gPXX3<9_!%3<&*-0^+f;wtW)qz0obd@z!!~pv&WRo1=p%5IeZsbq+;Wr?DSgf@kbUjf~OXqQv(=ZcyTgEuO3oNnLt~_`M!bh2c@AznV}MKvUH%GW>b=$|<9%VILv6^M)4Lpef5W>RbUi)m z84mi?6Gh1rz~fJok^t^KzL0>_BPSC{H9>mvaoq*g)hMqgeJ%(+YDy*F9?V`FPEV<^ z&@hk&Rx}^h>=A&m2>3VxPQbG=xduCm5fu4pk#H$^e1FbsgAH!qggy6S~Oxg+p-C z0r7(fbpn+Wn$rR>iC>0I-ZBJOG=xth5FAq23WV{1U{k%8AilIgv`+MZopL$=k7Peo zt(X%YF{13Zto^o1%6xbOa z{-(V%T#{al5Zs?)eIFWxQwtr9vRi=H?9xfZK@e1=wFiagPZW zO?0@O*>sN_9JqPlz^%!dr%~n@kI{i!H66G;`2%b;N^m93Ppk(DnOVB~{!_)Ln4w|Xb6n`mV1Rpu)*Su@<(!)}hkJ%WeF|od>=w!y6KjrJ z!g-{Eo@BH9*27)+9yvf^J)DLB`$$+wpKQa)FtjB{Jb|vwv9_yc&p6(SSHi5TTl0~F za*Psofa8QaVhOH&RY%-$hqPfJymB`$ZsZ?`EQ?LnRC_s%I8cV0(s=cFXGt(lC*T7K zCh?JpY9C2ZiQVXPx@{wZ zQ6}iC@rT|Pgb9_hQs!#s;0-L$3n9E3xKfklb4+mpP`h4eHkhzNWll8_W9kpBU@hU4 zfNe2XJEseCvT6$ZulnFN~Avp=_ldSMjfPQq^dcc81xV^XkxIG)iOgvAUEWGw3^d> zV&uMd%yT0p1{2k7q~y3UbJL6zPa3}a;JXjLv+v0x;d>mu$KiVlzNeU>ASa7W zG|a%iV~SqF*pu@#c{U-R#BUsFUb);rAU|;LScCHRcD|ZafNjy0{E{O zS16s=fR$yJ?0}hB)h4e!vv2ZhpJV+Zrzje3w69aT&by#-{ys_ep;^#;9`lsOL*osa5yP#vAn-1Z`Zr6 zgjewvyt=y?y8djaQFzVQt%o|e2Gzu0>e_#lYo>#nMijj}(K`q(lBsIKyN*%k(ObDO z0BJXBg@=|R|*CcN=&gLkf_^ROnOaTscNH^s|z{o*Tz(PB9{ zuqhw}%V__FEzzy&&X<6BxO#%u$6-~6A5sW{jKd{3i`Ito(n@w4rT56N-{Ur$kNUe9 z^?t^j$)rPpS^DaXt0KcavmftjbA}rz@;ir{hF%zzj8=yGI44caH}-J<0%fp2H08XU zz*qG-@FcHu$#8$x!1E}L(ZlTziJj7n$Z*$>gEG@dX@l|pmwvqtGb>@gejk!%CH#l4 z!6ChICm%=${J-o}1wV9f4X%m55|asRtiyS{72;aqa2|5ImbR@Y-;{B0O9Oik>h5q0 z#i(p{-$VP$(cL_$4{3bfDxz}M)}obocBrg zS{s+MS{;|(&8MOI`@ik({ToNWMfbwIqxD(ZG;ICsS&FS4dzMnXZ1^Xqp%1|S>$nu( z(ljom`W54{A|c54@*!y$jI->)_~<~>Ubz!q0 z9R$8;Jb8zo-vqc$%>h(^;`(U=Cwt(xWckj8pXSM?6>=enGDd{WYlU)}lXvuNDl-Re zrTv+>T2m$B)EFAWixSuvyPG;h8pEX?HDDPimW%|8g<)Mt;a!S#IFc4efuT9S(F}EZ z7r=3D%u6*&lwv zWd{NL+VUOFpWK<=1w7)-wundm@8g=;V!~ToDMpl0PT;@KYT~2?Nngvu;)xSbd8|gn z=W$H~+>&NDX4M-0BOa>;3jXVBgW})V3_YKZEY|OJx}O%}p3N*uyTRAfi_ufHCFv!2 zkdg3~zn)%>cd)AX%LRKgEDau_TtaS9>UbO$V#p{Y9JA zh67Nu;NRf2kLDCK!d58o3lQsEkaBS#)D175;-iL9hOIG_yI4<;pzw8IF|hD{LSMs^ zaN@DB3(huVy<3!sTS{WUnYP0m?P+FxT%_25ah_t_=v+F6(*(Dpm!8F!%#As3H!-td zqgtB*fuG#>dh9KA&#FP_5y;EqZpTjB8EuY-`&Q9S<~Z3R^Fv=TN#B4A6imhv1Q}$y z=N6juVIGnpWOmHS4cX`!gsj|V(FB9l5+!OhiqT*V2J8;m zz%1EF5K+8i(TL&&WfxRH5;lQMhZSsXwV#i+)?T!&E!L{wm0U0h7X`E;iWR)H&bn4m zTL_@+@BN&aO*Vl2*w^d(&(D`(XU?4adCqg5`;mJ5V6zilhuTolNi1tX{TnJe$1X4= zxcUP!Tq&J}6G;aIW~Nc`fPi|qNY;|Y&5{_JEbv55+d$Fz+K_R_aaoNNJ3TSPT{?C5 zk-ha~!Q{^UN{raO5$Om6Pp(g#Xq3E@jvo@ZjuBWTEog}Oz%uFD(q{e@&`Vs#6cA>{=rPWf~IGpACwb}p3$q-ulSs;Enyf#wA{ zSx;uh7ZU^GoR;_x`4J9JNKUW#kNI3Cf1f>?vJ6(R08#Nkr`$D@nXF}(E8}xMJtzpG z&j*!aEf>S^z8_SI^&Y_#8)X%#c-fBK(g4L_ft-4uc9OW@DSE&cdDr1Y%~iJQh|tBo zT&bVS?L`_pjn-%a=m9IpNNz4N%Kll^v@Vik>Hb7vQXgnd9%$*=dc~Fn zIp&St#31Xal2&bH+t2j9`#h~?r9WU*7U0-TfyzMQ#AN01)|BI|$~?VdGX-W9BnDg6 zzEp{BDG{JVv0K8B5@%Rb&af(r+!Do7qA;z56Sbq#pjf$EEF{IoSX0JWm80BZk`Dl9jcF#kkcpU42D+h?@

%f8 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�GX6QJ4)08i8^qc(#iDY zqV)j$RVbC#^Lz}HPkLJxvSwHYyGF3ArlHNHu2{&dknFh~3QT*~&v}ksvafODm}etE z>9k!fy?^8U8T()N(WFJmk0zOIcMT-5N#eKnsen?S{a1a<5_u)H$E2zEj*Ekfwgwa9 zash$bbIj@XfuS>O_leNJc{uh}`Hv$sKz(b4){u1nnparjHfFE>aL@|;opQdRwmP?? zX)7u@1{#u~hM?($`0D-Y{P(x<&`FJ@!bEhT?_P*!9DW`sU8Vxo zG6;#S?quB&EqXJcR+zOne}NGYpv`fxGb%@A@#H9oV_{M z7cDz0lz6;YELGU~kqR37kX0{U9ba_0yC&l0li`Y#SK0xN|M3@t|6=Pf$$NtFlUWT` zomk1V?x$ZxR3Z)7+Nfpb_n3$r9T#5gv;! z!fao~j@z<)i8+jS+lqeA7M?7bL`1yM~O6CS}N<7v{;d z>aH^8K2M6WT09HROW0O-QnqlKV&lOzx>0=cwUn+`{R?LdYFtGE91jI zc`_C<83PUNhySi(W76Q8fCWIK&o2$yPm8(`vj5Xy)IoI>M7Ml~eeQytf&=QOmuI@{ zFJKS=5jb;aX-jZ^G4}aCAE(2kR{3?^d*}dK}#wLxDP)q z^5dkkh5#ue#r9>M_$bs2AXV9Jg?i#&$g0?8aY}RK&-AQw_fEt$71>;P(5(7grretH z1&`jM_0lH*yaoJlNujmk9qO^a>VfE7XkRwYpSazvm)%9697Y+HltJ{QB`>WKWIq!? z@UkMHRa7ebizmh>-RqCvc5l|=F8{sI*gO6Aj=&o5y(9Z>(lcVB^Nh$#KO+*;-F?|x zNaliktulEubouO_hg_DsYx@7FxOz`(EZsvpkmuPw-wsS$e_xBKD&BPBIhsM0H&9C;0Lr; zJWU|*=jD10pZDE7@oRi>FSh7vW)N`JHwmz&yjF9;;HXVW)|`zZ=$bR^OR^>oGlN)- z-MlXfa&lOKuI&bnz1-7xuE`XlTEL_FgN95~K(!k8DrIRUL4lbIr#)cHtVn+C9a1`R zr𝔞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 ctyqjp?!eAok-gph6 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⪚?AYL6*eJc&*EAzUeB@ybE( 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

L*LQL)Y)BzWQ08UgBM!RmGf7RZ&k7y3S$W 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%0Dl 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

b)uabr8-9?+|7}Gr!;)0Bf-nZ< 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 *+9k9b8A9#Lb}K2XC5w2bapm1b#|isrAyy^ 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%0DL*A%5*16019-Vj>i zLub)@ZY%a|i|+DKdzZsYH9fSd3* z|4^4J|4qdKeS_Xz`Z~4s>g}-Hh_`s~K0Z@zVhGoHq5SoII328aglB_Si_p3uSn@r>~oE0Es@Q-V+897U)~A4 z!wCOjzh2+B&m#3RYd-ZekH3{bL~IUXgC_gj+I}@6JdDfNxaVkWj2e45t7l|aX2-DB zjKI+1^a9}}ERhp27kNpaw=lj-w^{0^=@(JzH$Z?OwOx@%(?_wZ6Fbr`-`%v^k8j*p zoV7DDu&?5=;}?)8(d{0BA!@&R1kPNi!_WA54SN39(x)Qrbhv3NiaVq8fPfi${p=+? zk4)!R^l^fcbh~NYMsv{u3dpT#kvX>R8s|g1(G5UfqzV459S9h|A+*$MkiOU}_dGEt zn)9Y1w047T*2hum`oD6PWWTMq?WVQfNfGjkLiDz^{L9uKE_gCZT?F(x>2}ki%TW%$ zKzsTei0`(;b<;+NtxF^tb{(>ZdpKHE04o+!7NSo?x+9UdiQNUjIL#g4KJRKZtM_v@f4dEmo-aK8h3>wEBPby{USTPZrVC2iFFX` zVfxiL`qfDKmAva7)2cO0?fXhZ=GHr2MX;XjAe=9O^(HJgZJivaPOgQoFPHanxE~O{ zCzZ6sJMB*HoVh(({TR@CO41Iv=S}F}0c|GCfwbF?6$!5zKt@ll?fZJQw({iXi z>p+(~-R>E8L~f_|NM--2%gHgU;Pz3x4L^am;V1Go{3PCnpUm6vQ+OMGDstBo*;_dY zzB31Ye;RVCYSu{pW5-9v8m@%2=OXl^oSM$g<$MU^xv!r6M$X1Hu||6W@W>q?O4cSc zX6!}3CG?xDP3&)>_C#__I82eQaIFknFRjgbe?jtVw}GuH=gDZb3YfJ7 zKXSil;}kWdyF?|nl_F>Nvo74Ezpuf~5^-}~n!4`b1a(3CM73exB(<`6vdXWYs`6@2 zWd1uzjqEK}X`LI950okKa~N1J{wR`AnnVzf#N8J*ZbH(d$42h=e9f>%jJdf<0c)H`jbn|*eY6hWl4Fl+v3fixemq)jdIGuQQqm~#F$M{JE3i=P zNYg;t?Z-+*j^H0b|IVa;53~FCg#qfgyemM_zS|jbC-b25RL9c+Zqn9yM^reeN zs{HGt)$>69GP_LNv=2Eox?)`pS15Z}6DT(=o9VUB<`z5>t-cQ2Wc<5nA9pHw+1G-< z=+nvU3q$IJd7$Gh)+TQw`!@dFw7#R{vVp64#)sKSYBFUuo-)g(%rYsnp~3OU*x1LC zm>8oZo+e4F=s{A(5&m(il{wGzwYtuNt2cOniMoO7pAK0`_NS;N#>`-ZR&nXVQhJ3AfO*(u1*W*|Gu>7A*jbf2t7 zcFt16+GeZt;OWS1PJ`z?6#*YQ7eKp7o13;ohfM04yk;*X+%|M-Sd&k$k5nhtMyW~V z$kKaxOOrD+shz1RDTw@r`6_~WBkPeUH3!I9VdvRR>vaO_ULWp!9~-Vy?ue7}YD-rI zw@0aIcSNar@hf#$8?EWt*fp8(-7f*Y_MkR{thEunv>6$ZlHrCguy-Cu{nBlzJR+bbQ^k_4{G!_sDBrLnd6zyt|Hh zcNz2UeCFL#nRj!UcTZ&A9d3=W-*RnDES7x%y&gF%+R4=Qj1)Dak@r69!_g;?U=Cyt zhcX-1nSflJz6LMkLHDI4!lT{=GFM3%c#+vMp5iA&-xfcj)2#3l>Yn`-w|l}DccE?w z4|}(rHNwN1Mec2)F7oWR0IZQ7blelsUmK&$T>=H!SswODve+jfWo@HL?*!FT>QOa* zk2)ynm9|Eo7W$zwk9uF{K^;T8{pfpftVt@egEk?3Lc$16R9WcBtpxJVB;3+8Rk|;M zGxoft+nA)5)O$G-l&ntXEuYD~~E5PuUG=Z_)>J;J%9gK;XR zJzjr%mG6G}E_?&uxwwSAs<;8)RA^X?G43?!cD%=xX4bl`Gd%41c+^n|TjwKL)1PA( zQGlKFJLW!3&*Xkp#}2t=1au5A#j!&!py`t-1F<9i5L&`wZPjp%N8JrL`!8-fd0ZlV z^C<2a%3@AhptSa|dCOAHsc88RVNduCfA0WMu`P&|t;oe9AJE6HZCNXKZ0C{IeT3@ZE0VOTGEWZbt7x{dh~=?i%e!MlFt5O zNSU%Cv2qy?kWWr%j_i}eCv!eXONTfKlsz+6&1CQRMEH{t$SxD>;bGaM$Y=jLI>5YJ zXwvAS?emoxO3vcwvlZ|I9(aL>wh^j}_dm}~qdkkiu2|I-%v5*oL+=ZoA{PE368=HH zUjPKejr8Gi^^8=W`zdDw1*^#mjn&)BIMg{- z+l}Y`xni-uEKOa;_`H+xIl%b5nell8F zxcb87yE}e8=UNj(_bu29%w7_&mh4MJhA-<^FMMV)dt02#VqdXiu1D?3r!ScJLTKHm zc^_2PH4vAajBFOCP zvOQ`ypxg1cixi=wYrX%GC6|?7J3;U54o8 z(~o*7@9tD3_74KP2@bF zHP)+IWZTt>_hFCJKSz`{lHsp_NW&C(Ot6TnUN~0*o@WiusZxAbhgi9 zt_Hm8?0Rt1TE`Q)UP>M^gqk?J?%~JszvfY;=X=x= zdjpWg49Q6=&~l1kit0HbM&(b4QQZ=rjM4PdSo&!szeXCV#Tp+eMCP%NIr2liSs%3hNx_l;Y z#GXT1^sJ5yKAxECHB<1xN*~Nf7ap@wYWVRy{{PdU1QmoM&^hdC!KeB-Di8V zr@>2z%%`5a@H#VDTa8s&U&N@LU&g3*9S`}%KGY80(dEX<ZoJ8Wxts#=abWC82?IjrmD+{-xT>2X%p zv2Tq_eX*t}@WiNfvGCpJnKZCA7rFwNB6h?vkaqiV--Q56Wb6JMK33i!Am#XTT|p$J0} zh9V3_7$N>;?snYpJ@lIjO&4V#dFe|#v^#%R2J1HKOeH5TwB%d(z3L3^cw-Os$O!ed zgCmhMj-pRwsrk*>$mU0*Z!rcvpRwrVpjX(vk}+cy^I(iR2=wTDz)Ry-;aA~T;aA~T z;ZNaD;ZNZ&)DLy#3d3SgHoq}Z%|f?tT6wY>?pQ@ zw1m;;hwmZbLQ8u3;)Zso(UN_hkL{Zj^gf2jF}ssg>o<^DToS9wHxQ@j-l6l7S&QCo zCvws}^pW{?4-k~^5=Nt}3DKRyZu2)|)pcS|R0HV{e|&exW3g8{E^h*3+{k0cIFVb@ zCnM>TEvf9ir^TvXi9=*f^jA5&bZ?PTsK-%rkzMp@Xa_&6HK098W4IfkhAGC}) zWFB*f2OcMaeTt5onU8^D30LZwvjIZy{Vr#g#7?i5kUh3#X}f9Pi&2e^J@b%iKO^$Qt{ag_ z-9+Blo0Ph8)7B_-eVaM&;Ad|!FRg!n(Z@Rm@auAZF#*0r?!74Raz_nsIM$We;e^n7 zy%Vci8yFvfhZ1n(PDe0K+b4d9dEWRJcWyewuMQ900n&aU;K*m(w3eyXM0N2Fi@o2= zo{Aa~qw;{c8;M`SK=!R^?3Oro@N{#buL9OPcIeIseKQbn?9i7Kx(T>K>}36eo!pTf z;-4}Np$%W#bW4o-1z_vsQ*ZG7p?2(-x!s6Ac>KE2G3o_C-(hCTq4ly@bqH|E!A&Q} zBCE-b()vh6rOek~<8K=fl~{a+s3OT<9e-iLD7VgD9Zs~)-qqrEEO!bnQ9i~pPa)$3 zd$1vU7U<~IeHNpB1vKDX+L4>KSnJ6d_>^+ae!?&7b6m2nYDPB!`F!2zSoI>%E`I0o zwnQ!GboPa5yVtRQQ-?_zVK46b?Rev8038yRqMs0socmD3BmUjrwY~!~EPc+LJY~<1 zQuC?9*~oR}{7KH37_|{7_S<=K)3%;E`lPnZuOK^zdzz5nPC$M;!arKeZ&hlHDg(aBGXQ6=e&V`X+8LTTjO?r?}h&X`G9inv13Amb0|bUR1&RlnKx+>3=#=JK%8dISWYyyC=fF{MD|h1`<$kbsWWUX^+P>~X_@hmHld?I8t|0VXAJLb@ zPTK4MTEgn{BV#M^gv5cLkn}0|BjQw~OA)UkZHl-RX%@eVbaS62@{sY!Ip8}6t zF#covRXgclwS=$dl_Gn-?MPrePJ{2=fANX|*Hjm$8NZBJ}TjW0YU)NY6kz#1G#kuD-CL-SKPv zs@?2HwrUL{JB`Sgiq&J_v3U?Ucw_Fo0D_X z9SdUBAAl+FY&t*aoCsaEkTsv!k-mYn+mH2Px_YraN&TXCvU-v;C97G-%wruhyEYYF z5M*f9RF%<{-jUYI{m?ny0(~~{2)y1w?#khA#!U3y>m(lG^;ic9J))3vbtdkCwA+uR zWwWk5qnsF(Q_fu_=u7mybi@KJdtR)X*UtVeYx=BO*3G@}_}#-**V#XNv>SLAIFFQ9@Es<}O%Ro9LJXsqMry@>8oQgOVaVp|) zyR%Z^5$ro$I`r9#9r0=he9+W=ylnvgG7P>bE|{ev{P5+a%wIsO#4l|bJ|_b{N7mJ1 z{}RyQ64J*9Chqi&kMa4NZVrPVIVDG^!Xu=A>l&1(_l@E=bjSw;n`mZ*@qDM zfnM_?pDT}1t<=l#X~+UhoNij*>AhFqV59Yx^clBu#-!d<)(P~@DB3d6YW%usD~+>o z@Y|jP>}#a4ms^e;h<&gKX zI>Zm(-QikW)74hynlk2^bC@H}Vq9O!+;B2;Lk@F8x|JO&yODJc^HB_QNd8FL_^4R5 z%f#!Zt?5bZ@vx6Y*^NY(WMtkj#x3;4dXPZ1qE#X5s0`%H&Fr%@!Us?XJ+oreIj6*^ zP7|J+)^EV6z0s4{8$F>m89l!7iaT3cLu6&aDJ;rjnHI^n z#8nut3fqy}>`PE5HnUgAe(JE^lStE4?dCe%HS07nKj2Q`PT@}BPT@|%>32irxWd+a z`NrWrzOJDiLt0YW1JLv z3D7KdT5gh}={4BxckCEfg+3qXaO@Z_h29KwJ9h2tH$ex0qmJD{_MxD60`XNQjw9?( zL0<-BId(_mG<_|0d5+z_BqelP4QUiRirG#3*r!k08+r~@=4FZteY}zAVOJ<|xkx{v#|nnnJbpb9R6Hv$6HQf{eRGqT?rXOS(kPMW7LQpF{)C+l>6c6Un!lO zM`g|9VJ#!yP6c+!cRlWgYkEC)4JIA(-A#x1Asy~G^t{g)FJnDtkc+KViE34Slv>O> zTlPnM%tvS-b#Q8^Sl%(re$As^V=ewN`*FqSJ4LZSuCDc{vw?^Uq#T&1`L6h``0oB@ zEl*U-33~xypFUXFuY1(%`0d2+MiX{^gGb#26b}-%`15BdsT;i&ANod$wa`JiCN9$k6$b z@@Tlrqdo*OYA6qBE2Ky0zx~9c=8B!H-LX@+ce}MN9HK6SS6Sa2tqL1G%zrUz9_?%< zZF4wn*TiXRf;fM}ULyNqn~#R8^V`O-#$auGvqyaf)aiK058o7S6yM$7tha`%xA^u7 z>w+tfM5wQ~N2%g{+}F|UK^7IG=EI}Sq#qBb{~i;s+!1;(l6;{@{zH%2cnkVL#Ahu} zP|LADm9X*%Cmr5V^D?d6ijhNlKS)s@5a(gy6Wz^;#FIrl!wF|-CwoHZ8OZ$?E!0&6 zZ6SZVDL>L7^v!S34#bW&977!arELk#Bc ztNiq&s2=>hdz`#^Ox{|%*wg!6Xx@ZwK1|yP+Ib75`|}p!_dm#6sK0+NZ*D)A!>_7d&qw?gNj0vXAx&2sY4}mWX zSBr63`!$kB{RDjn zMRpy#Y0Xc|o!NTDLV1qhPM{!n@Ak5$Zi`g;F|q1WAZYx$X)SX_PeR{oD{~=nHF#KC z0xh`LdVQCP^pJ2z#-l$kZ*{{5bi!w~aej8lo04-p^sY z&t<%y#CSi3@!rRIT_0oqz%yr-$g#`ex%0SNY&UnV$oqhl^H9nw1s%PFHtsG%m!s+G zSoH$Xb-+HG}61fqO+S%d#MDDNLsVd6OcOSw(Ty)zE|u;E``0g>$hWV z>-H;kQN+2et76sNfb(94o7TMFZgaoA$U;5LlR>X4_;##%45-{mTw>Rjs_7T7+a-1q zHu)F&wg&Wx#g1_!gx2xX2Ck!=0expCZrrrB+{c}Y+>OGTFP}BvoLbRC;m(d;_Aohr zoZZPDX4_EiE6U_e<&6G48ws2CnRP>~IvsG%ow;d?J5)|9Le?-}zY=e+6Ej$2Qf~3I z3E}f{E@y2FEVRq5xhmBwCL+#+DU2d!mL)8X& zp91)t#qdva=}#w{{xp^TG?D&fpCcKDd?-WppA%!>ZWr%g0D3=a3bOKY_VMZev7L+! z^lAAv8hBsQB4x`sAoTfw+GXq*D}=rp$Pzo++CVzQkLLfRAJLcb(-%Je-086jk%>2l zsTGaz`1SVP<=N%jsd3m@F)^-5n!363=2G-@fIx&DzniwE#vpS@Vf`~+p@(H|w#TpN z>$Oc)t+}!41K^;fU1VX%9X!YcBDzo1_J849k9?ElSS#Ia-S5&ECNddH42 zNodbQ=-4@S2MH581-QboWBd|&HPGnTwTElE1-tviPSV1-CiDTIRqQCMP?~Zf&X9EA zCWM}Z?p8BruxX24+G1>NB<0B+Zol-X-vK?Z*z=5=_KlKz6o*nSDO!h4*4uT2YmfCq zRKtDf*aHRMw9^zqJ7xF?`2a%75c(nDI`JpvDrE@$CD7#9ksqNwkK)#`lQM)(2HG7v z%24P+;7!MlG8B3*&?9!H423=fMAX^o4W&&Py3-+L=%TGy?n(T)C+;5rW{Dp?9)xT9MeJ7SaL@(E?50EFF=dgn7hW82%EC?Cbprn)ZW)6b9`mT5 z0d0M8Mris`>|PK%afcjQ=udzy$Br>W=r4d?$1nX%=$OapSC^YS(9eWU0x}&t>O$xY zAjh$zp9y_Fu+Xuip9%dKuuklBIYx!1g}Mky+aUd>=LL9YWFbz!anrsr^l$PK!`LkR zZs-^^RCUmo@_yz~ojQJGV=mf$qm6en*ypsz8FyG*f@`Ix#E z`ZXX&>`a>xx(it7*wJ2veh*mZ*wJQ${s^cPJMu5_^@T68PuwW{YB?KmDdd77ZcKk( z`6PPgz#TdqyN$Zt>3crPxjW%7V}(v*xGH|hqpkva#Lo!Mk~N2M7CM5nwaAbf2Ye@O zA?~Fu1&690%Co4Yzf9e<5B?&Fvp({c3bO9LJF4xuVo1nb!L)6+&mi|R-iAD34{Lxc zrA)}nF?Q&-yWD7f$6y9L?NHY2X)3P3uKOht=J+V|L)n9&f5_aJ^;2Z>zzY(#tXpZT zQM7BZ`w%$d#EE^V9m~TIH|#${J7MX!gAOP6^xYX>9Gw$II`rBHUORrbee;EHlHApB zRXDeu6iE9#$kt|d7H4}puME!!ULWrDUl;DlyEZ)MIrbfZ+HaB0Gvd`5jZayp)jw^` zsBN{TmOo>qbzc$gY5P{VxH+?({Ty*eeh1R-aD3ov1e@}=N!cDd%y&-Ck+E>w?E&SSha>T z_A8N>q@n}O%BNM{ev-0i!ml2qdec?cE9|wtO8!llZrV3ChCMYOdukb^A9+NVNM`Li zC&_jgGADE(Z+w}(AQMIiExHM^rpk*_`G;avA>f>Y2%*JYQ1Zz=fVhcz9lqDxKN3Q_ z+{y9J1i*0@Lc8466(p+f0**U3E%%-$S`(C68KSMqz7YGt>E%A`^Fr*U>=s%|<&*a; z;9uPdBkp|D;^;4OhTA3M3dr3ob~)aG8*!Hf*!z5P#(}%}YV6Xs-)ZH}%3SWAM_;?> zYSI7V&kuyf=2J|?5$nRPq&b;B5U=8E>^?B?jn@Y8EANGVU;NgE>2a0vuKOfby$v|^ z5=s;D05_J5YrA=4bCTTGJesoy8U6A*SKjuKCLiY*h7^5`Hng5LbaqG^Y9eT@JG7_o z1cB!LePb9$kkt&a*93iK)k=7}-J)+$tk5?E@~*M_LMTnZ1Kike+1lr`r5ta;pVp1L z6GK>4n3c=h13}syZwUIvcsO&+J~Dd=Lk{SA(EX-d^1~f4&U*sV9@b&!zW1w_;B*=P zQ^KtY^No#NlfHVui-oi@@k?xvt?9&UuD;!nDplqF{YT zPl~Pol>Orf_2VLREJR+J5vT42dhn*_8tmP6F*43E#&KtmP7_fme`cK8I)eL7NR!|n z0Qb3Q$&-|s`~=4&SSsPN{``MGo4XBx2K)=wdQw`x1J5oecmd}v1UGH#?U?y=H}9Nz z;Z3L?_ZwVRGHV{>M9I1OTt%y_Tij{ za&Rv=EG$BWr>m&2Vymw`OMQk};VKM!+m><~!Z>nS$h@!LHnv7as*%haKKg~USGx|_ zvzisBehoNdeke`r$_sU4ahKtVL8ZnN@um@aXNYm^u>9ONcuE}aP0^NaumCu3?x^^E8m-r;Mt&x}dGgWFW&OXJj|K+cLpjk`C-soy~_hL+!S ze;m53{j@JNhWVU(ndCl@j((jP36CVJw)OO5pmiDj7%cSpUn5Lt`N_M;sg}7<#O1$k z2`sjT6zy`u#Z(6X>kAiQ8 zmf!SZ@&q{F9oqSBCGuX`W!zy_OdaU^t9Xwj$Q_!<96tc^8mI^9lbqd*M=tAOEQx^k zm2WW>#4X>6XCUqNug7f0dT0DgKbLn5fF@H;dXB3xXH5ObG*`!|EkOPuk;za}$Jilf zbi2{*0)4omIQ2uo?Jv|$g}8~4yF&{5G%9rZq+ZminNHt(7CJ~Xh-txD!zr!v(2gCIOhQ?S&F#XD9#{jzr7 z({bwQwo#lt$g=g#?2|!y4@u_1F5>f@z`h!~m?5Xs%sjb{1X;3&1s`kf>|!rW#^h1d zKlg$l!;yCY^H;{H9l(;^cKwIa9y$km*SJ-MTRqu+@R#1%X7+=rVr z-;7hy><`Otu&{36`wxM>u=E?Flu@DGwxuumFJlkl@;EitgfkNJ1Q(s0Mw;1^NXvsK zuJP)8ioYYc`RNsm^Tyx9m=C$=WFKv~n|((3NFQb9qs)ATLwcO_-(DZ5_5&oBjA*^y#G2PFC}b*6&u#KhwkFR^S!hubU8=D z1B}ca*3+l!T3pJZOdM&2-hk64(yotFrviO(xa!<-a|_?^ak;VE4eeFxP1ay|bTpcDyu9Cz{~u4<@efvx z*HDHx0Zv)lbx*w)B^+D#lRW5EitLwl4C9-;7p!?UWMKuric^bz4WHe}_$_NpWMe`< z_X2%Y>?ntUbci3>1H_LS7?#Y}1MI9!S-Xy8?aDf@C$+2Zwmr&Cepa%@JM&;^Yqjh# zl*1DWZGYC-H-YxzKY@1)$Le#d1c$rT*XPq0*+ehmP2ks4q2}E@}ynnP)&M|oIDP#2~Dj%S9o$PJ?_AJ)x-yU z*~}T%)k_|3X__4wuJ?f#IwZ%9-dj)bXY2ifc1$DQ-doEK?C*RmcNZEcKp z_dIUP#jW%m+$!9P|9*S;Q&*T)GW#!kV+(v!DFbWep!`|^!RWg|FG~xg7N-;>=Ljuh zXFTne_RG9#+I7HgvlpmQ)}}#aNLjQKA8X*Dc`K2j%^%c_bZ>o+%6zbvBP3}(9=qJ( zcWB#v<(|TRFYP*oG^7;TGB#U|l}Ub51`WTCa<_Sc{&~uo({H>cUi})_W9E>-#>X{R zb5AjD>K!-Ec~1J4w7b9X?K5D%!xu;y*TmXdE1M>@sD%M&{Hf>oRFy z^-#Rp40JhZmvK8ctRO`8Xx!e6yEfpH0d9TV^AJ@SmeYl-w7rY-k^Ju47q90#pS&}k zhn!`1Y=M05G2cIV6rD1DF%lnso%(p-5&Qx1=v*(u&0zJhgYTCBPFd+OkvLKd^;{ef z>8vGhyawT|nD0k0r;lL1ACaqHjcQFs&J?i`T|d&3|GOm0Q2L|I(^@HE$Zq2bl6fyL z&bTSZ&B9;U=^ZRRhn|U7zXzQ34CZFYv%KK}IBp#IoWqYT`(?a33y}7tvD9lf^%^ww zYUFt~|InwK9`H>~STl-od^qFyP{#4p)o2~|=#!kSA`6#xqGgjE|)&xEfBFM;e1vmJ=DX%&*dNT~ z4%Ez|AdK??l#kgtmZC{9((VV#|BwC}ul^47xlJSPX9uqM@jG1Z&`Om1m3oGBrFJB@CiSfW zXMBPF1#qQ_Px#+)=1h#%+3oPOI(I<`KRxR&N$S^><5i!S@dUlC;YAH$!}D$k8*W__ zX3qe2JI_ZvAp13=ioP2*D(|MSQPvG%deqfijP0fvHiGO}+tlom*+LR`AMNsE4%ammc+ar0sd@ zeSp1hkg{^>`%hlpPfAYcE33XXuE#dsVPHNULE9a{TsWdok8K_HT88&DXy-oKfRDEC z+dZVq=IK*uV=3g1bFjMy@;&$ohWP2xcfqj!%OH%58hd|2pU0}{TWb_M_YlA$sL(Yd z{i@Ivhwdx(9ORqI8H!qD+U2~t!h7Ax?5)|F(smuSN?6kN4}=A@Zf7s;yHoD_VhkZq z>cj*U1=QXF-;;{oCw!QPwTRe#^P~h-C-x$%fj1L+FVG}*k_PxYc_&`%z5w=#J@E~s zL;UeQBy3?=NKZ&QaO0*mpS3$7$I3(pg0)*FJWM8SEi-pWf!;HkPhRtE{^74PNej?Q z+Y;=Xz?opi^kIzY!x+yrNf$1B`&fb&B-&nrQaedcw7-Mi!q0Rl;b6UUtgWg9ibhRkz8K-ggzAkh|p!PiVJA#?vCkQ_7GxZF|zY(mGOFy@70LTe2n~P0P z_W{4Sk+z7NP&;JVu5hg6aP)mxgKVU%V&r{rW7hR;%<{%q&vrd9@P*&@!1GY=tGDb{Tfv-jcz^dn2-6X6ni2xAn*`?PM11+m^SYmqmXO`K2??4!MT11ZJCX zEcRH&`ByV96>p`?|}rh9dPKu_@y7*pP(KD z9DdQhJCm`8GBf9JiiJnd9>#dj9GBE>&fhTK_UuhizkZOn&F{6x6gO?lT~gH0-2-?G z;YotbAIy`!A~`PuUBfmj$Z_m;y^eOhmUdm#*RC66Y)unc5!k!Wtb?+?&n_=FZH z`zG(_je>6*#n>x-+ByLqD>zP_z}prlz=xi|*|E%?VO<#=>8-lY>v6}{J8{N~t6oV^ z_XFFVem#hr<(&zt25{Wi@{VasH+MuOa8 zZuhSa#u&T(L}PGzk`Jm@<$ao!Sq^r0vR zh7I*_YNC1y@D|wEc4PC3PFqS~fBRG*A2)*a-IRnUzd(1g##-i%DFbMQ&mZ_}VCztR zNA9=X+m!uJH&C9RanCx?G{|>x)i_8z1q0&o;;wxVcisW+Bs?cQwZu8_C-u{CoV4@| z5`Nch14E!3-aWQlitjwuos$mLa%?(~Dyj+C7XbT?lO89;`~mT?gQ~Lba=!NC@@ShywV(rDnCy6 z<%5J@e4f33C*d4lUDcd3&NFO zB4NpIw83)?)|UJgK4*VlZ17xzCmHNDILzRWe_^|S+u#=s-f!?-2Jbfb3WKW*UT5$U zgJ&8%-rzKY!wl|ev*YVF_@Kf24fdOKU1)HF!S@*4Y~0;saGk+HgWHU|-x};U_Nxq@ zBK62`p}~a)pKox$;5vi9Yw#TgKV)UKGERQ41Uj~Ym=dO8C-Ah zcMZPJ;Aag!Xz+Ume`0XN({_9*22U|~iNR+ZTyAi!!Pgjki^0tXKW^{~26q|!vB6QT zc6{juPce9*!5anX z27hMy?}rATZ*YylR~US&!S@-w-{5wGe`|2J!Mc(2_pBLL_88n^aKnJ{rpb&q>kM9K z@C^o68vN!HcKtkL=nG9aeuE1Qo^S9>gU1`3Zm=@=Lla)R3GYQiw;H_H;9Cs7#^4JL z_8VMa@LYo@89dBjkHJSxJbyCyb%S>q?37!Y>CX;*)HUvl9j_5iUpQ^rf||0DVA;a5 z3oA;?=2iJuUsMuUP+n3|rTo+V)25y1udIZF$K`_RZGno)GR7UuXRa(*x?)k`hP;!t z19c$0sHUW9dnF;QEZe@lWHaubQ41@!2TFpa<;H3)^L1E3S=rWp`d+oLY}49`Du4Aw z1vS;BxOg(Gpn7}otQ{3WC!n{&*HqP%ZLZiJEUQ^iS+adQu09MablWVd#qMHdXT=Uq ztR5ru?ZKMrowk*FAbfRs^+kqI?}x7m_(`xsXIp2K1?QCpD=u`b?g=|HP*$~|vLdjt zx}?U>X@CWl)!WPZEz~LDtIL9Y^um&032LAc&H%d))S_*H;LbiA zR__R^UrQ;LZe3ZuV|&@63(Km4szF?tf>=}=tSMPqwW(Uw7{9B7BwtO@@s$LEJ8CHP zT%96^@`e|dRhE^IX2<5du%+AW9IvUWD6QsA&5h!JaWzF;Q@x|gZ;Im-9cpC-sVFQf z4XSxM+#NOBt81trrB3gs)iUk2|Jy3cNjw%+uP&`AE2~m!WVmfAsb%}q0 z_Ow>5S-q%mdam7;Ca8rqC7aLMQC72aF%51W8ra%qaYa?db_6-&G&QfZv@8%52isMP zwYt2lvT{*vS?LbyQ>|XIXvGQ>T%00zQjOwtRmnC9FG1{9mt0upvZF~aTychz23~}z zEZMnQ$^-Xnm#$j5QYUVGI6mzX+P<)&hJvZC*@=tk)&9 zQL|kq7Pot~&8o6mW3e?%%3pFC4AxX^BnR7Z^&`8jEh(w;)9J1kH!DiE2N%`URM$`j zQEN*oq|#PbRBf&-J9Fa}siXPgiXyF{?4>)=6PNnc!N{Vrnr#(Tv=w71rH{)+wH3hy zw17U_f0`a-EJ($vlHa0=(ya?9ir~yVrBWhRmIThOD7)y)O_FByMdX^QZ6P*I686e! z|Bgy``MzVq7Ego_Al-!DsuolSOf?UWSXpgX$)ehMYD~n+9hJd~`8$JUMb&F7{ACPE zHEKnaV=Suf`>vKnoVgLW%b6A%6XNQ)urk}L#?TT+RDj1 zL$A=(RzoeOx$>Gqgl>HWWi^|sYqphCm6qx3m({4tj`@O*3wD%MmF`rXmiS&#v9YG4 zW~X{fNMCY~N_D5iX}3^2iG=cW zUrWqYe=;F1VbEVuQMGlg+Wr;!qu7zz+jGzAo!d56S5}nTzSdfcs$|ltsR&k3&8z97 zlnXaUhEu~AmK|gNz3`<~I4!BHxOm`4B00&7F$2A=CKegU3#uz5HZ=ivZu z?0!Kw9w|SYD%u%fxKw}A<9C6cTmBSbW{lN^Yo%{2sx7VDv7I>)j$vNu1v?n@j`=c` z(P(QK{fq+klY#20vrB3!N;V3&@TYpTli80RM@Msz$=^O6tC zPG?C?a7RFrwpJ~cS}@~VQ8|2zpW#gn)9!Y{9&9VBV0_;$Ek{i12d?s5y#fYe30~Cl zMTM&tIn#rhqn2*lCc)A+7?Raip`A(7*j*%cGSR~VRd3fBG_z!l^Mx!_xR{BhD_5GS zBsH=ySXoe7R4u8J_{mvgL}5thws*9LV zsJmJzG1olsthKmuyFI|EHZhZvvr8&>l&R;0!m&;LTqr$?+)e$K_$4uNn11PYGuBtv zEQSq)gD7CIV){_?TxIP{5Z|(7%5bPV2KFL765Q5rE0IWNr-g;vb?J9TgyN{RbPC;1 zRgC1&@Fz|!WQg6_6;yqR$-Gi6GCIl#zqzc&N##G7eU8(7)UI%fJ75=1oi^(NP{X23 zz+@yS)28~wJu>TDJjiIUEl@&R*Ru&Z=yvxa=8(4qt=7%eb}0Pp#S)rsxAaKWPHpYjUM}?f9h)|l)i8TZ6c-fF z_G+ekJ=-l{-(Z}}mH~}At#v|L%^*UHsc^(VKd9?VR+K+-M! z=iKTl_Xx~wZ4{eD zRToy&R99`I!Px~ZW$}uhM+f_KuH?n_!5L-Ns%{C*G)$>=rEV0rtAl+l?mgEm!K|Zm zEJdW$*>7@|zdp^IImUe6i~=*gMgtm8v`a z#K(`ECYU8*q_~k^Q&pmN-)eA&!CeOT7_6#ocV2_D44!515`)(n95A@f;6{U63~o1g z9lxxCRcB11!&b+dKQzE5mySiN6u70k5FXv^Q zV0Bm)zc7B`{37^8@{w!z6r|$d1cSbzj;P*Z{ z;^VBAElVzV?5}Und+LgBbiO|9&)sirJL}=j-d|q%%H?M_R;IQ#Z}ngN>BfJ)|9sgs zXRf!>4pl~#mY$mQ+20a8*SBX?%{kv&v7&ok@vAi#Y~J&7clg{hIwO|<^U8z+TOW?S z^RwoMXH+)so&VeCpLiqx)BX4TzVcx1j`i;>dMV+zZ=Q4N%lF=wb7=f2>g}`Y&U&pq zy`LWMoJrw`k*gwWSaMiBrlag1Iue*0d z$up-;-SkMqyf-h5y5J3Kf7XG$Z%#dRo9BC#{_j}pOW*4~YwK2)6`2Qf%C20cHh%oU%~6$KztbB2 zOt0s%wQWg%d+tz6S-~G4P5INlr>@;q|Jdj6jCgC~(y6Zx`RlG%t}9#7`Hyuadsn`A z*2AX+)&AQL=RDCl@6LCYy>|1#Q@6Ffe8)d}fBVXoKUOUG{7_Zi;`+@$?buiR`u3?2 z3*Q|PK7GTA*n6JemGIWw3nB~dnHP3~*BkfLx3c1&ANO$i+6S+!&Wh>W^w^KPOI}R; z^zHK-pFcElbYn-$L(Q-Ka_FfKo^xr!LnqEz|Ky`Tt$e&S>+*dcJo4bvKZrm4Ncay9 zJP@3H#;bq&*+mC_G-Ui65tpaGxjiMW^!HcH@!xdXmTd{m=We+;?xn=;AAK2f;|cex z*avQn{>H)^lX?!^?zyV`V{7CW&qh^zZSBUt|9W#--32o%eSe7BT6N*@&M&$qzjF1t z7r*X(VcA=otKWI-(@#Ho>V^eRJv#K&8(NBw-2U6&UUK8hx3xWca8}{R@0|IU%}>0% zdF}qY-imto^yM@6E_r=&!od~8V}JI^vhbP37e~zd`A5a?ta)d1^G7#SP22fY#p3H8 zEcx}Y%Qx+BI#4}s=Hc?fn=gugA^eQECmu@=8-3FF$Td&RdHfd>;-1{Q``m{nM{Id; z{ZGDp?b&HBbv%6St%s(Jxc}|*TAua)aQw%m@85F!mL0J-ZVS6RD(05cXD0sn%FWR= zscTi_Wy_wvIql+ohwq>Kz}IIDehjk|{U-gXOV1ns*eAccsHOU%Gak)&?_5uPU`x`MznT-ZX?>iP{N=4>->$fS z(UcBkSealMP!iJZB?WW1qlTLmr?xEXmi2wQUcOuWd z{-dy|(*I>3lCe$p>STO#e$D_T1CcZ4Wts6iaHl!K||}o40_fM z`#b6l`q%pBa6Mmi80_pW=B-cC_OlG0YjD27#yf9E+U|~rmzeJb2Cp-?*x+)50|wU) z_+Dq|*b6)eIOQwxK-K{vzuZ0VO#QwD@L&A>=4)98Hg$ga z<&H)>04M!6SE22sscHUVU|t=2?dmK3tgNs2_}};xM!4>>|8E2p;#I=cnGUi2uMxpF z?RFA)&Bir`mhk1oitujkU*Pp*-H*IS|7Y+w%`a%eO*7&Cr?}&got_g(tbl2c%E^~g z4-S?*xy?d<)$hm~cKFA0^MCz)V7i?07--*f$kg{6Hf}g<TkdfaB=wUcn%W|8&3mc;+fi2i@xOsueo5SHu?W{Tp=c3zfk%J8mt zY{PAL+W68RcYQ9V{7dRIZpQsHx4(XSmi_sd|4YBHt?~_i_}_Ft&$xdC_b=_~-ZMCAVoGXR(kw>-F1zj zk6Aws*QyNxCO4J9=-B|A4%m0h%k zv&&{qKl$X+*(Y!GZ!9^Dx*9CKj{j+!a%aq#S(-OJ_vGAZe*g3tB^&)^vo~(anLX>| z+}xRY|H}XD(oH9C+Ju))(>9jP$eWe3ac0@fO}QuM&7L+hC$IFl{wu3DSCod7>frTm zx1dmmgXIV9oDJ2RHlX9Qxv%U8b0_U{li9%Az?N^NtF({jeqh@l%-z3R@28L5u(W#n z#{4D!BHq)-(uyb{!p&c}=Jc_pC|7Jiy{IAxZTsyDVX*W#{8sfEpC|CE>ZAHU2ygIkHpu?7J;tnC zvSC$UD;PW5QjV}{#7$GZ)SOG?WIxE(A#o5Wc@^ASovPAUd*w`RkFnxLNI z{93KdaeCbTBl;et7ltNauy9L*>@N?<(qQg3EYJ>1*>4V(R0TsOok856%?KhMoU!A$ z>BOC#()@)B*KAn1kzY%_ajaP5nlAFI~13FY2 z%Gj&lP_ZpgnLls>?GN#*(kos!R8?s!?h4lOz)Aavpdj1Wz zW5D2aynei*x|BK?(BpLT9JC+nR$qa#k>NpYm;aCdv&wYt=oc*aQ5MuE+Zb~><~nc_ zAa^wj{yE@z+^cZ}8|rD81&;$JV9o)56KKV~;H(t%2`~#D4|HP|JO${*oC7`|n1x@# zKVySq31-0$1Lc?nKLONYZUslAA^*m&oV#2B$X%^+R`WVzmh+(>8?)kEXa+C=H(B5- z0dd~~{uq#O6j#pH0AgPUz6+52wt!=X+Ga2K@4QnX_KF9i?;XKeH_Sa???~dnEI1nw zH#y)XKt5){-vU-(7W^Hc7;`K5-U*y_zS+I}PYvsMC!(A6y6Y{FStU?_ndT zopNXae*moS^=dqXeVj_nf=>eKFz0|b19PA7ssQ**gzpX57l6M5-13H3nv#mnd}&uAE7juakao>@3^f3;y$L+r9_fJI6MwxzxjH zw53m}YjE`GlsQ@yUhpsTvB%s2ZktCHeomQ#S1;u3@0VUx3_kM=${+gz@SVVV+zY-3 zsKhMzs-?1#maH1UyMejgUX5EYuOJ-3yOwc}EoQ+DKrLp$_XG9f27CyZ^@&&GxaG7J z%z~c=)?*fY00>|fd=RL^Eck7p0dp5PdIj2il$GE$K-yD8ia}Rh`5o5tWy&7M?hIC>Ud?T<9v*7Oo<(QkmkE18{CgxV~ z$aS6Tz*DG}sX2A(S3ueKoKr7}f@ae!V z{0jaSa2;mB-vyd5H-TrL&)Llny(%9(zC@`zD9;@5Dxe#);1f5JU(AB11D>O}2j5dh z-laW&b2i)kx)?mAk}-rfmIHpHO7{7ZRTnt1nsUay;Hv`E3ueLB0|zk+z7aTrxe5Ft zAmggw6*aU6>PT=QumrQrkThTxoCM6pEO-d80&^C46(HdYZrZ`y zZ`cdI3+Tiw_&%T;a|`%wpq+Lo`0|TLGiJe814l6n{x;wtJq_Szf&KJl!5KSw^Axk- zk-!nmg2w_!G3S7<2Npg-Ie;%hvRq3!3;qdk9cIBl1#ZFI0v`Q!`WJo$zYAP}S#ZWK z#stiQM*_{51&=lMIp7xnxi?<$)!(4~5T@YAfi}#7TY*l@f}bPqSkvtSQU zfLZV(fFE<#x5x)@^gY@n_(wn*{aSDfFafjRXT|<7bpbvCc<3X7{{m!UR#(wZ>KQ*@ zWxfE9y4p5pfrnm0c~Vwc;NM+KnlSf(4_r^X`IvDG{NWAuIMxGxrGfrJ9=pIFf5*c=}CtUFU;$0($NSr{2ssu%EcVEr6cu!9Tx+`hALabu0Q3KW03k&o+Rs zyNxl6w;bh;g0}#fGKUeY#{w|po8Sf@6SLrlfQ6K8m)PyK!^r}l2?#${01g88G0xP1_XG8~ zZv_`VXqS00_;X`c4-pO^{F~qhfMVK@;HQBg=2q~VfVdHS;ls2C>;+!|6i9mmk9~x3 zfI1Rf3>?8M_$A80+4^J@_VL?g0M-kTO@#(Qg20llkDU8*?4_Y2XUl zc`JC#FKJ^38E?T`0dXGyzhdmW!0X!?Gi8hdUkgb14dBlJaj%|-X8^=L2Yi+>7lZcz z;-&?h@GINw1)m8>8VbPeFEU^LigE+zchDDpO`5^?0&OpQHNN6y`V?lt$p@faY2^0M6yVOw! z=>gyR2ioD2^mp(Ze5wr%0f%sfqf3R3OK@CAb3`#rFt<7 zt^_h^^8xUb8cWqvCOP2Fprt-1k6qx0zHg}&zoC7CANv7mqa0enU%Q?B{+2QXZ)wKA zgaclGx25jGO))s*eoNg%Ib?xv0c0!{{5;S}T!MRnBbe3Ci0cVU75slJoqv4P^8?4< zwcp!Kw;BzrjzWkoEf$NTVKg}@jfRV17*2}G%2mT?xO`W_aA~w^xL6s5!&DfK7Ng-} zG7N{6$>jTd-RJ&zJ)Tb=?|XmVpZBlN=Wf^bF7?BP?E_2+V;6+IUvQ0#h52%T3GNwS z8kv*gy+7jgtsnldZ-D9JcodfXJHU8wFFgOi0OQ}rGXQ+T3^Yx+cwop<^a6;*nuX>b$Q{t#|<=n^iLQ%jvr{swASDzQiY2j zl9jl4)CmJkBQB01I_`wKbX@m+_#f$H{)mZVxfWckcG6~CtR>m(v0^tFg-6A4yoPo< z;oWif!5Jr6$31XY+#|4UJbli52*aBS2C}ztT`=W*`ii+>hxJnl=MBJvFQk9ji$ou3 z!NrZF9T&SuH!j|M5pBlB`-q)6DLzLWxcEZ+xVVYraa{a}6yjnxnU0IcO{1T2@f=c% zi&v2*TwF+0-Up*Z_d#*&CHziR^*KzLNk8-4Vu#g47>F`wy^2)w_F`TRR$4G&*1F!q^}1HQA6KG(A@+~%X5zp+0oVjhv$+<@-I zyq5VOdWk;!65l8J)E|avOPF)C%?{6tyBp3XnulKKtG4PC`-#Sme->;O5xE~eOSC78 z5fa43;rFsP;tu#QQTYh`ov40uAHS!c$Q^K8++A>e4dY1rgV1rmRmKgcKR|c}^T0ca z{>Fs(8S&y~Df=AJ=TWA1pm~f${$Njl2Z;7A{=vRk^N>|02)})pzT$Z!3dj2g#y%@^ z!G}mGeJlP=%5m}GW$c-_SV#Q0_%aFLA^1rh{eU}{4>ZpZ7jxLTVxYN@s2@CV9??1y zA17NVBQ}yS9)dfG%82_(gyUlBqs$ZB0VfgF>4H}hl^0i&eA*yxAjNnDj#z13qXS++ z)c-+v{bTeUeeQ*u9%l~GZy~swsQxHCxt=wpxe7ND9S^|)Pg-?)pud6kF-BtYv#kB^ z?J+LLD{-;>Im+Q;HEG1f)1POL!o{gX$HnVO7#CNO2rh1qAGg22zDoL-&tBL`QW7bt@u%GC);z6&{cewb$ zYs^Dj43j!s{DL&#;`gK(kHXx|^a(CrPwcpOFBy&dVeS^z7w&))-=H6OAK`*2Z(7&l zgoz>ga2I_DZzQ^2AAE+iblGEE{1#(_iw}@a+z&q?J-GPO+gv;2DE>i4;o{DBI4>^t zkRsgGN+0Z`PdKj!_7PjRJ;p7c(H>kp_H&+BaB&53;o|vUu>a%YeB#BU@YgRXL;J-W zcG0&HdyMbnRd^UK?X>m{KlFdaUcu)u;@WRmvv?5hCWi9j84>yx7Z-m^-{RsEqyQKF zU93l3e2vWghR>tmgzs4oxcGE8`w1?-N}6#oN?LKT=0~1ma6jBZ^cj(O{7BhyGq#yUdUH@2X$JNjC2Fc;L_#GL8i~ETSH~%t@MEA7-Jo!NUwXh=YURWRZ0DOz+ zvk0;1Kjt(pmJlZ{UK4jO9BUF{pVv9zbNt=Z2y;VB9+*HMvv3j@QIQ9{@dM*3p{^Jg6YED@R<{+lXi;X6R8sy zCyb>$E?zp0KF7sdNDnRsNIx#7o|ItbQm2?ns&R2JS&55p8jkx$DX~CoLoYNCbK5J0?@r(ph zjEhrU)QP)c_}m23z#I_2ETSK9@t*T&2W~$*t5`$31&nEW5HO9 zmysS^9CT9xKM>$&3h-!>jf)qMQMfpl6yQF1#ci}r^A=XjO)%Zee=l5jJI5&#gzxhE z{44Mi-#f$~+gjJ-B^NJ4; zFD^bts&O$uR^s9&(u9kxB!r7^-AlhGe3W#JlymKV}Xl_ zZ!&*yF_-k>Vvr>2y$>87q8~Z#fD?%B@8ZM6$8j-4>T&Ufx2RvQg^6#|e%8Ak&LrBy zJ#fN1yjIV3a1RMnCJNu(#&PCq7^ZBu%G=@OxQmyQ63U44NCobL_k`&;-a`f9#h-F5 zyl?fu`$&i~Vl8RIMf(n}9T$5QTug6gycl0QJf7(1cjBYOjf-nY86Jf1?X>2082(ID zUM%^HeFGQENe%9UyU5Ddm?!XvUGzJB<%IJ{KkHpwOlrQO?mo;wZdk%1W0)LzPRr(z6Pfax5gDIbu zXmUtfdX{m(JNW(fTd2neUnaSD2>uy&!{7KGMapdaJQ`Mzl7q607e2|~R&!8i0Co}` zkHCM3llt{XAah9UT<~JjPTM^27E+i&J+OwTj2||}JqY)aUbQ(Z(JULBXj*hG_&sss zQFsl1Bgmv=#drg5!^J3Z;NtE4eY65xeDGjii;Fu+87@Z2T$P8mLlR9jE}lvnaB(te z!QJqtp^35YPI%!`qR&9Y({mC{C@m|-$#@6uhX0b-J(s@+b0X za3q?#9OeT&iZtNjZKMSk8%Y~39w42#IU><)B)Zp!;9*B{y^gFH7vf#Gct7dK!y_T_ z4$O*i$SAG_7jHQs(KO-W;KD@Hii`iA%h=%Jc}0wMLRO3~;@P-Zcpmc&7pu>=j*EYh zQjVJ`iRRS{aOPVGx~C@cJ3tv1_~5ieQ+yb651w;sHZ0N!~$*M1!J!0T_|x|s7}m{Gz0z;W@In-WbCF3u(%+;vN$Sw(dJ z3c@+J(gq!$lW2Y*UiOwKJd3|ORe-zU7NT_#hEL41JOEF+-D;=f4)y>NTRWAB=IJ|e z_VWPTM)clLym>xzhHDY;BptZxF6K4qrTt>0iaJ?$Vjs!D%>w#|bW_H$kh<^YHHI|^ z-&&MtYBg`+7mJxQ%=yR?{$5lyV$!|r3Ai|z6yf4gqy%@usid2AC*DJ< zkI#y6=6$S9+yl4O&}QaR82&}dnH%PQ{x%5d8o=K|gW1GK`^Aq)9WK830BaT(cat_; z9I%ve#Kn=M2Y15DAEe(HBe9-z;NmXQgGb;g4_W>1f?lG}aKw3}f^{VRMtr!~=BF-P zynPvS9v5FAAv{LB0}sI;;vR+RkFfu2vB&rj9$?Lijieb5!u>>FIu&oJ<8R*MV&Zc4 zPuvGL5zX@m9J+$}Mw>o7yT{xA?zXW{8tmr7~BgRh&~St!aw8g-kfMQli2+N zPT0a6<38?!&ym>Ynefopt>X?@MO5Ao2fkso(+-=7K93E-0U_4Tf1K+r=H%PV0p_;< z9oAMWb0e2M4PN^$*Fryg;o7aNYvy(s&e_JCA=P054kSf4*&d!xrm#OX#>%7qYsvc=~JGg z#JMDZi+_@4Tul0exrB>Zq!V|*y`%>h2YkwS;i8Y&IhXhd8I6lik$gM=f7;1@#dV2a zb+Dh~V#61V0WLn)$v%Te;pVTbu?WFqzqZE64L^^&`G$E)v~P>AN2p(I*iAnZht?+i zi|F$-@%(SOM^nZPhkr-?JS#fjPv27>kHP^zFmG`?97#IZ6U6nT3m2P6KW^`4e12u@ zn3L`(=lX-Sr02Ik6V2Zwc2DU|G*=U?UoU)t=y(tg-$!3D?oRjy(eW^x_?Ojw7i^4s z5blY)r;mH(-}Ei>&<$INt~Uht#ofO@(Y!)>*dN4SNFn>YIP@R(7Tf`QiRORsU)K14 zmOJ1f1Cy-x-7tk;AD777w!_<#lT6>C?33`(^dwVA8v^iVTas~7#t%Ovx~GKUeVLSD zow^T7GEbA(cnwN2tB8L7C7zO%Wc){E#dtm*#Kqr8EAAMaWJ-y?qb|Non%I}bbB83E z5blOI4NWp(JbZYP$<9qOqj{~kbXbxp!o{7#sS6kPk4Q3JTx@kD86O^o502z|=}$kL zI?8IZ8(wx4=Ngq2V-? zSwcLxIO41%GZz;}Pfjv5xcEP^5*Jeo>04a9H0~aF2XWJW@h(z|i%*|TAL8Qja~Vfm zOg%5jG~nWeWD71Ha(*6F+hl@p|0e8bWM4v^7rPGs4KYO(}n`9r)9uBKX$YjO%Bp$}a<1e9| zxY$E%+{eX-W+fR1F1B97TEN8}H*juTe58W&;o?T(#Y3>@CTp#^;ajAZbtJw=>T&Vv zTUZyk7d}h0uEhxH$Hh~<%m>z;7rst(-w`u!O){04JkP_Eh#wbckOtfXpC-+C0QQio zBe*Vj$Q*?qF^tX2p0nUW|)=;=$dON#-M>wH$_H?y}qm)2l4E z!>5S$zyLgZL43c0T|~#DaLq!-ntl$#3+}d#yWx7`0EbRX-PK6k;HWc%o>7%T4QT5$0u(vN%Lw?yAt z5Ift<>!eI}wFX7^u53?`f;!G04J#dYm zwTTDe=w-B-XJB#Ha_YgwgcbBZZill;7v)7CiQ?h|k1`)9BQ9H+WO8w_kvMTNNL;uW zB5qtf<}t>L_KPo(ATAa@!CruiSCI%V-avYB@m7*Jj5ff%qy`s{u4nJU#W$X$9k}=< zX~o5FNCz%gNwtT<-c(UoJq2&NBoA2 z(z)Q=HH;lDE+^A*@kvsSi%p~w55ju>{;-X?A)dF6{=~(f*VBi%IO_%GA}*c~T7jv;Nh6JEO2+V}j>xsCb5`wsE(?N*%u*hc2E&xrq!DqI}!9_v?oBTV~%e&I7@ zKm4BPb3d{8L#~%+GqIEy=D!D~d}N*14qqmEK6Hm!AD_}ElrcM)Go+mQ-7rdG?}^~W z?N<5dXFM}}&NXTehqr#iHPUZBI5iTl6OP@@+R5O0;g>{n#`P`N_+65zpnL!h=w{EP z9y@fBK8}ld#KwDDG4vySf{Xp65EobXFo$vRvR|y@;$~9Aaq+m{l1u=1!sOqX4>}jT za4&Q5D6SD+{WopEy)Zy@zZ2gecKTBsw4d?D#Yg%ngNr{9H!dFjFLMhQuO>P!mXo=- zcr&TSy>R0Ju9x$QC;i8se>BetaG6Oq4qWUedAK+vA=wn-;;o6vrUVy@l9EjYE?z>a za1Xqdv~a!Rr=*tSqBl9&G~!}_Y{A9klw{L}+u>zI-R9-AThV$W~mvrOeGSZI+;8q<^W87ilXkJ7Ah@(guE{-LYxD#GXR9;+3 zdU0_xu~A0cN*s6?{z+6`EI2mVOdn^*Ib2GR7(|mXcnMi`B$No#Mm9f&1ahMD>e(B*Hj~xhL@7xOfb)F`u3Ab~$s> z2Yn}6`;z!LvGG1g+(~k9F?%f6h>PctLR>5%({b?{QjUA!CZhU7@Jl(z#VjZ53l~dC zJ1#y#x^c0A^x@(LVq;80@Jl(z#jJ6(o9hxw$Vyy%h&171fNa6V=Sdh3!uN^l5eJ;a zUO^vTYH)l`bjOv#WELdpdK%Ll5C-#0KD@|uK5)9F}Rs%or-%% z?w#4Ssz#V}Xm`kZdPyh9{lN zb>c2~7s1P-w z{U@;}z*lB4F5FK;aLJ|Y?evKsuDP7P!h^8r3hsTlc!Y;B%jYv>cq4J*Ubv39aPj=v z%x7F|CDpk230aAY|6av;aWVgD<}mJpb4ZjniveQBaa}OEjCF*IZZZZJuOS7v7Y0c& zF0Q$TwSkLwUdtTA#m7i3ECyRB>V!{dCGJK@`;gYsec1<7Uph!-v9zJQBwl0w|OgnI#r^%X3tw&tW8 zUUx6|W#)z#-bEtEvqqqw^x)#4`xuKctP6My$;HJ2G6r|StBIcd#Cl?9Er@H#XgsK6 zHOyh=fOtRAvy&h0i@WoF+C_>eFIGLkIO1YGsm4PvV=4WX#LuAN43ayU=RmlCIB_3r zewcZ47UiMm5&DWXDDL|o*M*xpo{LtnZ=6XVLdRp;gLsaD2S3i7JOhU>5j_uwVA7Mk zmc7UhCzD!UD>gjEy2HiiNh=U;i34}TaSiM_lo2PA04}iZ=q!M?-J4i2cOq}xu=PP6{g$qay?t??#wAPmcoZYN%@S1f#wI&twrQjfdgn)jL8 zxcFcj4(e{>J%d%(f_!(kMwE0K2A0R!`8Lfp{t!f=XenMKWE+1PO*_V zncL#nFX$g!+)YYwv731DC>+{Jn{n|OvJw}wzM>Ct2fUZW_9D2RRG!Mu5aC5%v*+OA z+z5SziyKG>E`~`rE)LvHJv{%2gGny#fKPwNJlAs(e2wVycJYiZo&jiscr|Iqy)dbV zeFJyG3Zl08VEZrDvsnc85`B&&mi|GgUz|4Afz{mch&3fK|Eu<9}!=w`zJ4hcc)(uE8 zHlEGIpUEg(962z>g*5cyktQ#>Ju`l*h%{ zqz4!8BK^1z_GVLFbsn5z&LB2i9DYcO$;HJ5IrJwkzDFu?@h?(?n?pGl3FBf5>A}S> zhfyc*7sP(z#Kpsgrx+LRfOCkAH7HIvn!duti%2={f$twf|1%H6@JFKiviR2M6w}Fi z5x0?kJPe;ZHYK($g7D(w_>0h-OZ1+YV#;vwA<~HZ;ZLLm7cU;mwWvJ&HuFb#NVV;Nm8dhl}T&&o$s;`USiO7jL|j zF~!CCm#3I|TwF}H<6=GOz{Rzs8xO*(%jsL%?}Yi5xQ6&?n^;;&|KQ>iqzezg z@psZr=Cccqna_N{o$zZpdrkx{yUSWT0eE5+ZDvi0t_8Fi7jqX0p#-JN3E zaq&vhgNsM|ShKWKEFhzBv6STD0hqp+>!Q3J&L{f5qWCs(aa{b6OveLD7+a#}WN{zq zqkqH!)m#hD^L99zsEl|m*}|L=ZzW;e2Uil65kDiN*&oE+qyUe?aran#<${+HeLf?8 zL3)^z;?E?J@?sy!!Ogv_L89{FGUDdhSX@oYaWP1$aB;wW)|&Fd;QjIS1rK_FIm~m8 zIPyW}1}>gT%-M_!e2=)!XWxLme%1*trY%e1`@ZxEJZJ@De-3SXl=VwW&gHyt$!gle zaX);T=yP3hH)*AQ@zMs)i;GpH2NwgR9~Z;V@>=QzHpG7k#7z7q=1ZyF_q7BsJhIf%V`cU+@PzD#5kybnaHxu2P#09U? zZt535A=S9}842LxF4BUF5z>ZxUgKIevxlF@wZNxHAuev*!kWRw!(L~P!o}l>4|l?; zB%f;$XOJRX{FapB;;C;@9v3~N1s5M7+i~$l(uoIQ&kn|vwnbrbJNpU04@#`u$^WB_ zIG-5WATA|#+z(Iuob|4@!JQqv78mc?#Xds6iSH379)^jX^e<(^7r#m|4Y>FoX~)Cx zu&;5-i#d@L6UD`oNh0?z7cBjj{z>Gz;Ps@K^&;L%N^tQjQh|&Aea9H#;-D_}UtDyN zCS3H9Ex4H2%{4OT?eGVpeKiV){mAulTzrA#~P1B)Y!9D1YVX+ z8>X>0!drvVPaB%@?!^P#K6Bk#J9y|!=9+4V*KJ>vyh^|XqL0mIv z8(e>6s+o?9FOw=!Av7tB4ux)uk#oanub2M#^a8dC?n zfVeKqigAvP1p``G$)Rokl<4Vp9Qa#>Gt} zh>M#^2#*mD;~}_}MDQ?t#zniC58~g2^e25Q-g9=UDZu@3$+?UvYs3!+6s5-Y0p}F1 zgOpxG|HE-pX+JKuU&uVf#UtIc2N#P;2zSGqiM}Ht=1fa9QQ9M(N9?R+=f#XC(eqmn zo;-u=>zf=MKm{ZUR+#Hitr%ZM6{;Fk4TWYA?_uuxR_f(UAQ=h z^x)zh#IW{7Ke6NDo5X>Oc{g!h+yzg$h55s4T`)(`V*dY9jSm;AmZ$Q) zOU4E6C%!p+CmB|+q)%|s_5|(0?eMC4`T-a1tC*j+aU7PDEz~308rYw4(f=Idf{VYB z99}E#UBi6F#mHK&9T%50Q5Wuqy~KStdlB?L&v9IQj#S}6nEirPM)Z?%x7;%2+Xrgd>&?+N-LR|Oo><1G!@c(c-oJ-UmF-qzd@me_gCDu0X zgmpw^MElG1?P6XF=a6RH2b)O#LiRTuBSpCQFDb>v)Ml<37YCDST)dd9#Kjsaooj4#LaO(e37)$hvF-w4Hx&32reEVy||e6 z8f|5)#X%$&7juXc7q1|NxcDk5!9~Xw_C{PBM|`;Gio19XspGg8K27Y*CGlgDi;JHV zCoV=vAujGACAjz-sldh4Uguo6cmb)y#p$F07jJlzKF7toNGC2Xjl0-P^x6>24>33B zL-C}ySj)KB{xLZj^*Mc;^4Rot|zKTY-uGN7Yn!123#y7y|}nA?&9+# zm2nBe-9*1XO+4X!`iglXP9QGa1%1TBxx~&k`Ue+(BDHuFp7fzrMx637{li#@my%Z8 z1MeeI`ayh=^yA{OpE6#oYw={_#9eTSoc4=Bl8=jl9jr}UbnRp>z{M$~8h67xNDkL1 zK1)X7;s%nBiyx6LUx*I!^K&o4;N=2l4eq`;du<& za?(rzE}ll*xOn2>^c5~{CAGNNOH_}zFE@?92|yc$rI|cZa25Aukrd(LeWVl@mlH28 z21qq7mJjE;aPb+^gp0FAq?uOS16PqSeIl+U5nOzM^x`o(xUO>A27O1;hq%~A^u1{D zh>=_~9G2i_T*iyGyAP zwh;#|en#@}DBR*qGdVZ0hr`3iG5451;!!7Y?YMZ!c={6$!X+m&7Q9wmN~&=2l6=~O zi*=+C7k?rxcobfGYMN=kkOP(S5OAtU65u*;o>!uXeTZ{MBKO^_L124 ztWHleO%Sx z7Y}u(nFd@ubsFm(7w;lrTwFmScmVd1&Rh7IHJm)1|Hj2x#O`H%!PzsoE?g|Tgt>={ z_mE;-43JV>{GL?Y#pgosu$ix@ z*gWdzT;e2Bg^Q)ckBcD^#KrG#XH0Q%@*T`2T)dEU;cn<7Uanoty_5gO#hUrF6Bp}9 z8y2IF{$e;H?kS zZtC>G14MNif0}uj%+a8Mn6GJt1MxMex}yy}E+6E7ZyUBu(bit(it9LL3RkFxf0@gCBIi;y-yc^C+)Of-1%gh>Bhwf z>BpTA=Ne z(v7>}>Yo{pUDN|d^jO#KgvCT_#|@iE7x#4W9ny!3zF)Z(o>j!>eq)Squ`f!Sanb%e z`wTA5BvrWBL~3#IJrcmhPe>4tz+3-dZl6Q_aQL5GBflrX0XLE{+~37kQhBfVH;149sYsKGFcs(vArKX!i z%GlvzqWilazCnVN5nXBNW(zJZB6D$Zb9%a|#>Edv01v~zZJd{929uf2_qfwd6)x72 zMqGSqFm>W$`H*zeg^R05D*Jg59-N(Sdb!t&M-e;wo4EhrbTb+k%MPJ^xM({(ozFWN zJGhSY^Xw$9&ZSPCdBpW(6fRC5M!(_Wc2bOsUy)K={E<}PQRo^@U(r8ea0J)Iak1`* zbkl^3ACp!*3}+pg9{X904}L_pGf%`XNhdDeJBn+>#j!_m4LoOxj~|_G9JsiNIB~I! zxbQISJD&RKD>EkDOeVdvSl4hF>Bj@`x|3)#`@mW3mokVeQ(0Ix( z;Qj?4nm`+Hace$v4;ND=rkf&MJmNI^3KtuR7Z=OUNH;!QJm*aM2p1ndE8R5U;=7ZX z19%wzK*sQVE?!f}xp1+a6yxIW#Dj~y#EYA=X(wr;9`TiPcnvPTPNH}SE<7*Yn1$>o z@U-*kA6^@Pxfjw-TpTuyamB@3r!!u-_{dDg3m4l-4<3QbN*J%}dA5XaT*|z{#q%$t ze{k^wQi_Y~XR#h|aVx38#b3!vJPN1JW{kL}c;Ne_wS@kGGq2(raS!~9=-)?}tCYw2fPyy!aGjEh&03fu!{moqNxQR2fl zq?;04e3ew-A-Lp5#+u(V8GwC6_fu1mZq|?v+8>02Z{oGgTk%*@fs5ma4;Kqa9WEA; zMqHdhw&3CwB#evKkuF^Hl0IC#li0W~i;IZ^7nhPeTx^}gIdJj6`CL0L9#lnLxE&rs z^js$%NqX3y#Vd$m?TGgi2QGd?@^G<>6yf6d1zbBWt|R5RxQY1i5FE6S;1vFG68nWPmLZz1itxR7+=KKLrp-X4NaEaJ7?*8=cuQpmn79=4b{fQuVQ z86JXP5Iy&bhcDq8*{{T-NgnQm>q*gk<~F>lnm)wE9i$SEz^m`$TDaGE;aZ~KB_$qF z!)x#4THrWRio0M1>889mpY-D51^06;lo9=86fQnW^6>y{Bl^1);-5>?O*5|*_md9X zRhw>JAPsmB?jiclyg1`Q)(Q29_mfW54;>F#`@eWb+{Nd}D6UcbnB?POSopA2zZsiiD4ej$T5B$N7tvbt!(q=*|2^zu zaN=sp;Nq>M5f|&o7Cf{z-Q3s2SmS<}^*m+t{T$dz+Bh!$O1g1z-Uj;NUVeWX+(dG5 z@n_=1McYfv8Qc!165Ti5u-3PGX-qyq#`N zC%Q%#To`vBoYYDm>9z0{l6xQXA3jP(<6`2wvIC861zZ2d`DydVv za64_n#d#mHc5rccn6-wB`J@YX!NWhHZ>dv!iFD%P*d5%Da3|bB)Xx!^y_0isT>OBn z#KqLlI2Z1QwM2awggtSO!c#tHujEqrhBfZr0eCkm6lwE9*&jf|#@=u&VmO#7O8 z?q|-xZM%6MIFfbrZMymCJLU%8Pm98YJ@hB#?J%#Kb&ZFAOgESO#600S*$X><=6X2p z=wTj_G1Te(CEe^Ku|9`^Us-STo7hQW?Swmjqdk<5z$c?tnGihvcWWNH;L}9&FaYQM zVIB9ujeoMnd2I;p?X}$Or3{IU3tX^|aiWY5eofSe;xT`vn|h9mV@VJfCy@~Dg1bog z0on#H@3ZRkz`Kdsl`zga~9dPIYu9-R=@M+S>@c{gf#Mat>j5Sf6 zPFPD~?+aiseq8)G?qPV5$%x(eJ#a6{qfT+*zzpNY#b-zvE;f?6cn}Ur$cX*EWd|%F z>MIX?BJKgWBRRtu%17Y$DH)~)H>nxsF4C@RNy{+hMDx=NpSER~X37NMPx4IGU1o;4 zk?6X-@D@9DE@f`OW}@?k;m|Crj04V!y9fSBRK^U>;P?7chSvt*yCn8n_)px;kPPD@ zIxen_dk{{|wvKz?0umcLc=jO~rieP-u!ZP*l41BO@o+o}4s)r|P`DOxV%%M@d02)S zP5BV~l&Fk-c!s%_=x1#{xRdC36iykD5t~b1IM$I7+q>NGMxrtS_$|?Vi^7wRu-pSb zBo&-10&|YE+UABEiOPrIr$qHc;2&`}BQs1oiM0)$Nc24}(NAirQ+$>*;6eB!(bz@d zW23lEjt5|r^gqa0K-W2gk+X z$7YxwTpUmMLl*p7`wa6Map2;j<9IzTK1zyk@kvsO2jJhN3K!o!p7n@}Ib&!K?toKI z$S`)?4O>s7Kk+bZac0E6vlN2+No<~v%Pz>7}G zu)gyN4;xQ8&gF#X6V(%e33-;=;l#MR;H7c*!1*V0y${h&_{=F*dx9`6pLM};JDfve zZG+FnJqSODyEt?r?V-GwOR914cv6Rp1pfv)&%2PvEH@+JJ{=XPC>cvdVa%pJ=?qGs-wl85bN; z&i}(5@Ij(7VfYKl<6L6e^|T)sUneEFxPw&U;uoX_kHFbCWW=5&oHu6h@4c=2pdFr0 z^lyH}?{A`SnGfP#(u4?iak+Oh4oH(C7jWPu==`PkOo(ty^ z^_BQ533EIOmsc?-@s;pD;-ZXMz}z809fz$%^^4KCi?s{suR1=Hgg4#I_2OO_B&E2R z>0?}RJFF+Y)G6M)$f~~*ena$`c?6DJY@KTqJY`9S@$uSxxP++v)v&vodkV+RJ+za= z+6f2Nus1E|eF{8+sLoOFJ<>z@HaOsZtNujzG|8iU06zYJHIDW0-lbMQ*FZ)^hFC6M;9a;~9W@yzuwut=IO#t2S6(27i9Z8oM5NTeIbJVbiP3H?hlJ8dI$5H<1TpkF6($Md_>Otse@;CT63TX{uB3p`21Ja@gO|zJMNGCoY4tC z_}=m`{Ot#xE2!VsP22ur-s)U%T|eubJ`BRcj4k$B2fQi47TZ5dQf=k{Nqn3&m}WE2 z5qTr5$g-JSTs&-u&E(;^aN)r=Q-J&6-$ZkxAI>|(@=EyCP@A<6z?MTT7kh@;Vsl>n zX}Ha_KgQ3p;e#V=W;^bOr#LLnhhH3Fi;Z0;e03zRr_2^OXp}8B?sMU3M_XP1=Mn7{ zm2gAco8b+|*-SpKt$-gKPdo88*jB`K%3g#M?V z!kISnWr@xBd2J`0bE(ZV;B(=xMCXda>{&L`Njt?Si0TQzlS*x-h%pj#uCy5sF6I*- zE>5_L`f(TBKy+Tu)m-njHdD{>5S(=#<6g>G!*j~5`6K3DZ!=Al5z9yj7wh9L+HYWd zc~2_7Ks2v{aPBP}$HiB?j49p%pP56MCwR`e&1NpUgLcc|(kh#A;eL4DLTlc-VXn_| z7kq6AV@etEJyMQ~+4tH^6)v7uL;v97bP~eFdZKG@fxpGwcE8OWLv*jqhjSiaZq(Ce z_$}Fvcfri1oa0HZ5k5t{91p;uwYJ#j06FmSxHrPjNI7LX;QR-<2KJvS7;xcJy|n+fCf@ZLvlv3S(4QPHg7=W=Tzd^X=2`Xxd^DU( z@^EoAQ6C23CC^#&)&rB*SZ;@#;@$#(AS&Mt4{NkM7kXY`eNv|v9w7SJig}SbiOQG2 zV}dplP#fR{L}TiPbK*W1K1x)6CEOhM4mj^6TkM`#375TWGePQ!!ja83(~7&`9VCqV z;1{G1?}0Nn(dX>pCD2cNPccT&{R-{I#qll7VLT7cCTd$5+)hSuydUPjYPGEp4%o~( zSO=9KY?k$WR$GhOn*R4J*fm`Fg9e(+SbuFE6|C`pl>W7m;9OtzzxSwe5^}|En zvd)_WPl|gUyd~~l_%dndwOim{#QrpM4~~DEvBvY@x9?bcbr<}*)pFarHgh5AL;|1*NXp=F5G;|Yl-&r7C2&ubzKfPk?7hB;6kEt z@j-h#b@E#A#<*9&AW?bo)3~?8q@7kjr@~2bcfniZJ{PWydlNk5Gxp?Nc9R3kh}tH8 z@;Q3~*VPH{=wLs^E8*BLtU2a{Q;GH&H++<+Jpp*|m()Xf2P`E)ycX^ueLB92Hh0oL zcsq1{WwlwHPgGA8ob)y8g)%PKMcQ!tH>?$+c`jy0tUk_& zZRRSX`)nDkBs!NkqRVmzbjMwMB<^)^CsF+!@PY5Ce-+mSKO#CFh9B->f8cl+cKpCz z%^o5S>1MCscs86))CO@Ksp9x{xZy|o8E=O3daSXig!6y1>ZyWn>GSlI~f3Vl7JPazdM_llyRlg5r^fE4#vB4)v6c51he{(I*un)k~_OmYV z0yy&@%S&KeKXr0kEc@50UtDy6b;0p!`0{{ElZ!XQ;R%_s=K%*CnwV+YIi3RpM13gU zn3NfthZXR;luT2!n(xoRN7FO;TRps|fSWQhO*gM?fkW+?CWqrW@Z_vaNrs<+g5xl}d8P>Z8o;{NKS&v1q zZ&aq~r;O-5n(|zWIOG_s{lzft*i2(@VC>+FMAs68e-Zs$pbtKOe5M&gnJ_$m4E>3_ z;ocK6&2-$Hm}!zpB`)4QHq-cU@g)+##RH@T7YB{wT5vIkbm5|t^y1>#B=K3^f5FR1 zHZIN~qj5icjp*kZA^3h?rg3pR4EGZqHxn|=c%r%Of{&e?Y4Rx(5>KK1ayTZR*HT8z zo0!RS3i}59gXr(XnNu@ON^##dAAz>BGR;cr6h9zMxVW2y@F*Nvn91*`piiLpY|F#YbuM#^<6>J8e@H^3cnZ-)uzTgMY&{S>Po#M)x|pJ&KA_|S!n9rgI(Jr`w~ z2D}DdKP}Ug;T7GT`kBVIz^;^NYonWhG>g|-sBhyXxclJX%NY-ji?%CRvuo&2IEy%O5A+e;Ys5g@#fevPy_9i54^bI$ zpeHl-@2BkWt*bLlF=fOaQihA3YiNh+hYPNwUR)GpWp#K}W-@(&v;o3P~02_&(4aA4%aLttQ!?)#(Zz~*lyH!3B+U{Vz zP)2N2xJL)!>6P(y0pE#x7$(lQ>aoKWMBjxLbM9izP>*;fDaOU=areMYMD?30)(ug6 z#2*&WUzAV0JJZbfvBtTNG{9X%*OIu1xlc4d#lsdeXDFWw7ZKG{4X0IeEo-?q!B2?x zsCHO!k5xvTeIHJlGPvV@&P6@#u=WAg2`=^!ol8tzYPlGGkakc;oc9oIpq@&2?!#97 zMKBU~@zY1>2gfa5*zp5@kFT>}TKq-}g2l?Z!?Z5?Ic ztB+ad+5)FNZuxZhXg%$to|Q20B=ZxG!e^ec&eZ^~c$z(kdOYxZqR+UxVfi!k73IC~ z;nn;%W&E(_S>``3I-g_C@Oh&+d5u-35H4BA`k_oUJaxTQrU1Uu#2&@*7U+9{HsRuS zGI~AFByb2sH3oKU zVvIO04t|w;C7umezGn5OxbJn=5y#CNndXQ$*%R?m@KK`urwM*SGzZ$@w;`*}F6ev9 znxA4Mg=FJ>@b+!i{I7&B6V2OZc7OM7akQf5c3hm;l@Y}HZP8gDhn)-qsiW4)z)kRVd#p$}79b)X`FzC=+8 zww8HNiFjcy$y}33M37jk4(LO~+fWOpN--5F(W(quj;Y1sZ)K*nJyz-s1U(1-{65y6 zy)yHyZ+-u@v-jEiems%&?ZUHvN)4PzpMkIV8T0a58hkI3ef53tgFk2gFm6E)$?*w1 zV_V(NF?cmHm|ybT2dlhEUi^#dc_sZvs4K3?Pf~B_PGZSV|B>egJbL-M)c@6lTJ`QxfEk&G?)btG#(hrdQ+t}mLZxEC3B zQcLh8GKm}Ksp2@2XD1!@P>Wdd2Nzc3B@``HbQqT$T~v)bk{8#X3(tC46}RA8#`wz? zUi)%Y6ucK|zz5KVxP&)os)%@x(S{GB;wL=sD^+nh>V1p84Zm2&IXqd%tyihyJxE@o zU!sbek&G?)xjJ^>ck9@`R25%E@|qkzRL8x`RPkYScr6&zaqrcPBRRf>XSb`k0Z-Ji z{Tfw#1IcSjc>J~XJTR`~CA|NM_;ticUN2s+ic67xP<4up}M9GZ>(bj z-c`po{AL~J@OO1w!k1iLeXb5aP{$VhQXM<+hjm=Q$Lmv#wQB#Z?ETspFwh5@}hUtbHZzo z9GASgjxG2JB!6d-WL(FR_aS+`R9sQbu9S>B=1M^EA@B|e~aWA zNj~r0)tr(S*0JP?I+nbljwNraW66h+To=h>z3R0Z@G2zlQ-?+!OWuwq^vogrERwxf z@_T47;#>p^WD`raudn*Kw3u$D zyXk%^0wrh!&7c)@0zK#ky`Uc$ff?ArIB)Be<$4yU83JsnT~dWT!?v3%NHYC)SjJ@p<&u^o?NCywG}yo&R99T)K? z-p0GQjQ6ofl%$a~lUAZ7?WB|FNjK>w{lrMj#7e|a6;1Ac=a>H8f8w4QSaQC6ju2zl zaU*x>uH4*RyM?=Px9-j@-MuS3#cOy?ujOf8+v|9`*Y$c{-!nYZv%G;f^hTcTjXlSU zyrsADv{`4?o%LttY%m+m#*>b*`=kxWvm~ZCW`EFj$_j8dcStDy^txU_> zStrx8Zr02CnUR^9l?}3CHp=X5oH<#PEwfdYXX~uUHrY1YWo5R{#6np#7R^O#p)J~r z&O%>w7rjM)VJysrwHPdhi_yYfj2F%#S}Yf+GD;**n5j+=kn9 zTdwA|-HxlfUAO1B9qK2qXF+>Euj9e3(#H4n8~ zRY_GNRfSabp&Y8Cs*S2LgmENV%-4vTQ7h7;Zq$qVkrA1Z6%C?cB!)-g0zN()B>4d#t0y8rtlVB|D^Gca-dm z2D_roj_9!)EOvs;E?9cGS9n{m^n~B=TYlTu{hn|5mOu1u-|?4z?ic=+eJCakx=EXE z(xa1D^bwmLvOM&UExkib8`BouL#J~XQ;W`FPo3$K&Q?sfbPPdHYtbom`k4_}!H|CD z1j`@~ieMX*fe0I6D{O~)*b9x&3WxMLCtQZ2I1-oeymIDl-IYw{A3WKcoN2`CtfpMF zJrYg&gME1Nr+0@_dqcH`&(srg*0W$mx2$Q&stR8rH%+pmk)IA3>XM^ASu)AffJ}|Z z)tGEWSD*G#VSbsBi$`TrZWlH-Wmuna}iIP{1f{lTI)*pU-0qdY32 zE!{}ai&}Id9oIDILPMO&iTR~eVo2@Cy=k&8BRn#~AJ@3!4rf$Y0}XHN;)^ELH^LPo zs%~Aowt{18(g$&CGZ+LT+&T(Y!8+IkyI>zEVKdaiPS_3mp&1Us5iTC#<7+&87w$ua zzNSST`dXi!Hi$;iIEtcGw2n5>?$AMH|CHUckIxU{5$+n{tZQ6#hodUEsfLqwaZxiF zB%@@UM9C^yC!1uK>=PwzrdrxbyJa0CBs|SU$t8PPgbHre#IH0QtAl5CajibSW#U|eusZb?&v4$YPBi*cPP;>P=#Jf~ zu`>tcU`!S^WT2=|j$+HtL+~6H{b-HPHt|6dZ_RO39T&~Hrv~?6;+HGBUyF{HM-4jL nlCGf94QyUPkm)`-UNW~Jt9`Or&UDTo20N6q>FIy}g$(=!f5q>< delta 499771 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 L0Q*zDKhfXLe@F% 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

bJHH3tzDJ;H*?5rZGhvOF=^(s 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�XbiAPwtr`nzpK9iWv(PROwaqb!jU{r)==j zy%h1L+`M7#T#)9ud{UA1+5mwClZt`{etK9o8440i=ky;}WK6=8X54g@H%i_}dtR!; z^Ol`oL5^Z-6N~|L=6|{>c-=vyc%4%%63JL^1;W`Fn`?w;0lfWDD%%LV&3+Mu{S@MUfxq84G>~Mth&Z{xz54a?pvP_m*~9NpI*g0>g65a2 ztE-8BUfv{5-$dN8kp=dmlC>kdc&ZpP?Y8#m82Xq@qEO5HLUw-lC30^rzMhBp*3=b79 z#@(OnxmwcX3xJAwv6gaa^bR|0`!hpeIV%t8Hv-@SY}L)0Nq zc#vE?W<9M27$MbNjR;2$@N&i*G-Ib8n@Y`m^makbiK^a)5{|rmvN6`2++Mis?yc7d zaZsxUx=ebd{2M?r;TLD*bX;u-k5)(B+8>tlAZc1N7Ky5x}~|Jds;Fu9%JCw1BeRtz<0#Y4kyjIIY3#S zIgtKM_rM{Y?g=t61f^p_Br!~+Ixe$WuSql8+U!Aw3i+Z9rpsAZgwRdXxpad zWyOu~+}O8wq!7&6ucr)-icVuI{UFh%wmTwzi8M#nF)vtSLW>I+6`78R;)IybdJJtryx4g~?VPX4}i_hZ!RG6n;s4!c$Fu0K%D1kRWH^!|H`|5PoFMuQSsw zi+ZoY?Yx}t!0>k|d>j9u0HuPwWzAS9OI65VJUg^l1TNei(C>a3G7 zr%Z{(r#txPuvO9NOK4mvs&_=hlMml*>B)!n>cb-~U939!Y831X*8E9Epg7)rcnVoDd-RbNdg_l{2nQ>7E3Ay7EISVkWAcBJQ z078)8*_;LW0Nnf{DGv(L1N8~px2t0N?r%*DPxgC{wU@I^+#)VJuN)!nvfEdo0xBKl zx~gsi{P2WqnevZjkcnPc_uUs+#P!|#=0_?S4+Sm21R0I(9R#!gWg)lK8s$8*3GRZJ zm5YZnRiH3a0fXENhy%+reR^8oXw3TjpR5LvZ87m99{ZV%(ZI^ws}|0AwGr8d$twk& zD%~zeCigIcg|H6`QkF$+zX9;J*T$vz)Ariro|rk?Rf&8jXECvjXwE1Kpo+KUBaSS) zlpj!vprK@h12VKhfADvV1N+2vm#kJ6lPj{&%ygyozU1BW*3J=o?L?QUwbNvdb){Vu zoxl?+&jEeNJJeD7nE=&2_jx0uIz~fwjr4*BL}J#Fn?x_m9;fr({3vGC@#g3U3={Lv zbl=>_ZS2aE_mxL}AT8x%icvl5;H22>lc*}}{0W)x4>d%kAGUu4gG4@&$?F)D_U2G& zUoy8u=<`7}bo$LbZ+W$If<)6A^Ltfmdtr8HBK_vR!zCNN!Y?M%^5(nkb#_eYknKH%f+fD2-jx#w0+7bqQ38f|fph+4TI{K!F<@W(ee!^Aa74B2B<= zbCTJdmDbA*03(ylm*WOX3=k^tQ9|0@GGnuO$%Sbbe;?R+Bl5gu9}8R-c)dtnKLYx! z6!s&LoVg`p5Jl{iMR7L_vY}O;41L9X3=444)eOwUprHwa2E~%%_;29U|a6b1TCPl`G*NZQg4!O1j4wYYA|{q59xDIve!9tH*3_Xxm@uNp5*18&sA!p=xMvt>h&iiAT2IHKBF$XbBW+Mr~-7Be^@ zBjUraaW+f%1L7 zETRC3dY2d*5bLFDr1!V#de+SAm3C3)IJdrGXAs8+0}vdV(|e_PdhNA#{+R}%8$u95L^uJ|}ld>l7nf1sjIp}lwV|CC&B?jz8q|8@JHhXOmji{py>^3Sr3T4!~Q`9 zZvUVgU6y;OjJ}PEpDX<(dp`*bC~9v*W&388_KegYd<9#{7S7ha!Hu_~S0{g=+)z&N z@k2bJBMA>Z&k;Mo3<5S!iN`!K!WC!=7v^WKMygxk`8$%nQ6Xun@(>&1`{?g5Yx1IYFjwijHBg*v{tk6cRY#3&?MGQBPXRHa#x!gWsj$SVodxkxCUT`ljB#3)0GKwUadjqOiParsnS zS}kef9jbVGwbW9aQ4OzbkDl`}7sMX3V9m^G@q2gbt7Zc+ygQd%r5d=GV%q9NF-ofC z!x9Q?FR7!5qu!m1Q66#)-0+~VGI0Fk>iZnG=um@<1jpNkVM!w0<>HX@g`;XT_H3_(BN?<2g@;~9_u2S);YxyNeIMK za5ilA?VC0vGiY;G^KDg;oBO5>@A>dJr7D7tzg@!NyXEK$SE50P|C8XtUjAjM0M4oXSmUZ2;v6F_VrYX z5QW}4J@$?RQ4&zNNxr!mjeXa^w`0)Xb>eLpVjow- z_rpvXln+Lqv!%{T7wyFL`b&~_%UXWQSL!bvvR$}SOf$t8bz}?ZFE#PMKal$_F9W#; ziS(O`m>EjK%`eI({EikCyC2TPNCl!eM4h>{h%mYfc^r(j7U>TJSsL>4ols)RmJ0L@ z|1M9T$=&C2cbcs2#zVJ!!u<*U+bY(uL}BvFuMp{_JItbfX?RN0haS2om9^c%iv1fa zcE5jFnTrOual{D6PxSb9a}~!}SS0YnnjYLB>$mPb!A*t3RNt+E2YJbfHMkZZAYFp8 zrCmYU^)4TH1Nw&4%JwOdJ;6t68%ImNvjLv}9}V!R1}GVfZ}9)nfGBzZ-!%dw|9><< zuw$amsS)sfcLM|o^KRQ|toq$9GwfXaMvenWDQE3&)9B(-c zJIpQhoL4>7c4`=RNXxbe0FeU^SNo!pti<>M;|J+5XhEtAyv<8|P^u^b5;T~2KLy5k z+?-fTuMpQ@sEgH_r@A{`(XD7Ar5mq{a?-`*^2g_;^H2DXT9k}jN;O6N#bx^fCIl$TuRvx)lNT-R}R`}={yellojxXqeuP2vyo7Gp1 z7q6Y7;N%w7j2t;P<^Znq(Ecu+b$%c-##!VD>e#{~mO8OST{6{r{Wlw;IcdL1-f-2G zX&K2;0BZF{!HzKAY_P8b@BWRPw57*LTf5s%TmPcEiau3;y##X9ZuOTcPqb8;DlY-0O2SiJqbkl?ztX<0U1eX_NT3G_?RyEW zmC9S~%GQ5rUsopC@1N^vsND!P#2pQhdJr3wfcMx#{7uwuVRL&U{?3(qSGC=`QW;a| z5PK{iwj1)?TKl^03H!Qc9as5;q8PWQRjRAnZnkTs-3`||yIZccAKPQI-fHi^OyQbi z>Olro4U!C~n%aNZ=`u!YfbB6*gUNWQ!E7JDtZJdPnBnzeg(5Tks(oEk+uk6%*{*@f z3)T2Nry3At{n;&21GV1nqidz~i3&Q`qTN@S$#d(@Zd_;M87tK=8l=`C&oZ%D)m!X_ zJl9}f*Y38jYZ|$3cy>tI+LUOXjibf31OZ(j zXb-)$t!?eS{%`%&wpygN>LkG=h(dy>QG5g+?Zo)N7Y}*N@4NPy2?4e3{r@g}GIM61 z{akzRwbx$H0n!22U2pSkm>=LP%yF!;P0>J7gMyOtXi z$UIRbcXG%6ExZIFmQZrCcATS~6oRsUR$PqjZvT5eJ}S`UO9T8+M8Z9E@d#2b;%m&! z(^KqJksQS649%yw9x1*mHILtqh9a+0>=R+3@)NcQpGc_n$N!PDtcgy2Z8sT1`n18N z6Kq{KfuT6+6vKz9v2g5^p#tgq-EOGaY3<9$O0Lvff>=(r;qt2izOe#E;I2gD?Qc4% z=Oe#~wT7cZ#@Ylq3RQ&hc=k}f-wc$Bl9BHIjT8)l#3awnPA->jmwZ&oV~s8!3n&FC zCH&<=p3>EmT+E3cX?qEk9tr;zDMvm~V)i*Tw=6$}+><{4p{%(pR2H~>TO0q+(KDU1vb%a45*sTcT>+BZolQpIH|U|U&5=fOF7 z64@(n+|!sDlrijC7eM?#Q3P4??sDg{DI`^Q(9;2V=#-CLeALA0Fj8~~zxU*6084K2 z@Yil$c^;$1vp{(n;M&TcprWm-4yDz~;cl-qczM+?l6x;OM9Lyv+)q8#fPfTu{d#Mr z0xb9ZLi@&cymaJDvC-#TAAIlb0uIbS>53Z1V_98b>acD1=pq9Q~6xwY0C=W8c~ zKC=;UtD5%cWf{_OqCmXn#VrTxiH=j{3rTsAIO5>Fkk%-s@|uw{=6-(HJkQmdVZ2V) z-$6D&Qq}vCWw8ub5#zi<4-~E-xfyMhFgH&JfYKefasWe(6{)HktI8wMGIAGMx0GrV zuhw%}^{VfcsX>T0Tg7f~lC@Ly_f*k#6n%h6c^PU|NVNpWgV(IWE`n=BK63~K?Dqn zmbXxWtQ4wc6$^_A@W~L5lkUpIR}BwN(x;;8lLRmi_A24wNTv}GP(U3C0&heBs+6$g z+lcxd)*GeT`MS+Zw)xLsOsnR`Q72_8&a>s2q0P3|&OkVcK+cQjiYvuw1s7<+&Vjn! zK4NBxZ_Jm&hY2ry;|UxVsUziE{9wnIJ;+DpYFS+OD!wI~xr3zp7ef4zTD?k+7Bqtio)**ZICwlLQ*zuT$P*!YdpuvHvy9xXlB49T80om2MO4jl zkI~2`k$%UG_IL8VW8!ke2-}SP-^ACL8>a7lT8B4DP{3%;Sq?0~qlZPJq9>S*2t zqE=o-R!Dea_BD9Opic>!>vn>oY%L(6qTp1)>zekuoCjBIvA1(IIz0d29Tmu5%>duKkZ~9N z-O#TQ1o<9+I{;no;$dSreoSmt4YJllw3tUh)jCZgTKr#Za@aJEHfxm8+v4tgHA)ou zXwwbCrqR6r)kcMbfIXhD6KGU`y0{y(#y~lCX_OAo=0v+qsCUSO|G&T$&gC$Cg>6Z@ z!o;Lqu7#WRHHFCF;VIr?Px195rnu0a;t+GZ$)4j)|D+p`v%_;7=Xp@(_=DsezXPLE zEaGVQ`lDwV2IcMgR)H@exxuMsWpFDC+jcAOV z)%&F}WF=}r$!Zh1X72TS4ypm~**BCcs+Zn9kQT4=l z&b;rc?ccNXB=BU6*IZvXwH5y4o?w$|r_$BTPn-lb15qs3lR3q|#nf1eSOdj`2WUZg zkSs6tL#mA+(-zuf8kx$nhjO{AmUR->bg8j&?_1H1CR`li*g?g2=+{hso5gKm3e= z2kUTqRx~dl0=ti%;xG^brhu_1`uT54PAI(rnNNF( zZnh*K+(I?KXgSQo?u|g4JB0{?QoX=XfzduOxY;=i>D&iYdojyj?vLM9r2W+_AlAlA zu_5%XdIz#Ot)W;(sHn(lTad@3+5TS`tWB*!+Ska|+hs00kK7`ytnT6A6?tIz47!ld z`xHnoN}E^9N!0oyW<{n=(JH`6v`=ygPL`xmDakvV?0Ci|F5sz>3ZFl>Qqc_yIZ~<+ zQkR!`BMYr<-zCZ+P_wD3g^G41-6qr^sRr)_nDiYpG$<-GNMv06R-#RDJyY`nDZqrQ zEX~M8n=vsPev;pmq<_fSq*uLWcbO@zu@{N-TY6yzGYaQf?X$GwLyBxv{p+y%&QgIi z6TV(F+-zp^zw|6RH(X1*hHvxZMl{oItB((A8??V zQoHKh+F?TV3qTu5h(&~OQ*>DLa%6HsWA-X__!P}qADLdCkgLTou~r{h;tXM^BRRxz zP!&szl^;j|0jP12MY0{d2wlqNMDt!86wV)uM?B-E>(O_WNM^pNKbYu63hxRDD7 zbOX>JD)an!?V!XIS#@-o$0Qm5Wib4w%O_<@fiwqu8Cf((FQ1SkEpaB7PaqK!n6LRI zB!|F!(zh3=`@cIUM~1JEuv#_Y=EA9Ifxo6?$zXdMCyILDLMBY~NrXby+xB4HBsxETlT%dJ!!#@m{fC6_}?k}Z<*`+4howJEa`TB2(IUv8^T&j);?1$ zDBAlWa`U2hWv!nFX(a0Piq*pL@pl=8^C1#nREg{>=p`m(o{Cj?(0=qw(Rm-pY6Iax z2L#EsiNq>aig-(KXXafeR~cayu(CKG#(N_ITSQY5V@Oxa>T_zVM)e-FT&)~>$nZBy zCVg7Y--3+d_CG^-P>txH$e~z$kgQMhP_qw$XYcYcG}WpOwIS(DjMkK1f~?O4KtTKj zb}lc2cD=5j3zL3!=S`#J;-t^*9Li_u#(x=9@>xb8X4PJWKSY(AjtHqp2yXFvvY)!2 z<8PCs3r|Baz3JuF<;SD^0!8?;UZf`PHF^2=kVx-d=LlS<>r`UXm%D9N@KF?BzHWvV(b)^nKP!$P?qfQt=b|*IW@iMG zQsy%Y(szFOal9(9@-=lGEI+LG- zD^ZkE5U`na3y%WUSIi4RSZz8)adc7(D78xd<@!i1kN+{sue3q!jaWH1WaXT0(-El| zU`7PYlSNHeTflyHX#M6pO zS7+n5P^D65pvWZ^P=~I;=vfi)@-t^0S{p(-DPn8YKGCrq;tH~=x$t_qOn{ga6PRyk zs;gyLv$oYLN7&M-D0PKR_X2IeCG15(tcr^YlCQ#*(Xs5$F96Ci=4j()rfAP4!|V8e z13HS(96SyB48$b#m7?qQqE|U4=J6vaM8BMjfDYU#(kf1E<{gf@h^DFr6*h;ZX%8;N zMn1v|RRR|or`36ZHcl@)def@0eQhN9uF$2bjoOvM?=j<)B6-%&=V)V3X0eQ{@0fdm z^^{K=KXqj3B<=r|M3!1b$B$e^@ZMR_LRMKNm74EDy!DnB1tiQ6_eFm(9#T-dGtCxe z+CeCgk*at8s5252*GFz=3wlD!;kkl1ibWbKraahr_7i@ z!V~hD2aHw!XaNR#YhG%|>WVfzUZ9Yi6f9H(-%FccH8IIyP$oGis&A=z`NA;1Cp}4) zIcmjx)iOJJ$iqcg2S@cP1>9q1-V-vyZIX@ICFB)$AaqEF<4x}g=ZEcPgKPgt z4;)1IvAu4nbgq+UnwOFJtVB$aizkN+gMoJmJ*ViN3% zRH49^w&6Oqh&@pYxU2}Nd8B6o4i=dJQI`Bn*s@huJMBHK+<7cG0Az(oVkyvaM6D!_ z^&~Dis_l(hBqSncm!fSZj%Jgtp$%6VScnyz5X7~ch z3$fB;Png7A7{)A8R|>Oyp;gMsvBaSN-4e1$RL5Mb-nk=Bysxf&`oCD{$Lz(g*ALqO zsPl(L{KfV$jAv_qkmo;uiXl=0efy85PrRPznlrJ>pJ*=RuMK#(tGfsHG>aNi)%Y;FgZdjWaXvJ3D)!IZ$ zuhmX@Y~{7u85tRs>DI&7X{X7{2k}(Weyw)0wXRkhYi;?qc04|g{h8LU0@_Jd=-XOW zNyNVT_z+qf(aH>8bS@5Kxw{=B8JJl}u0)3sy^P_BgBR63UvyT6HSOD4!MHCB`LYo}nnG>LSGLq5ce)WBq^`^C z4&ts^vqpVOJ5{LKJZ6&2M}}T$ee`W@+&I))l>>r(EE1M=&U>@6tkdeWi$?pu4_^uw zY@;l>`v#*7!jLxM zLwWTx{+3O9LsM-RZ$1y9C1c{6cek- zhN5C31Su=5YizrahN;kfTg+auql*9WXG(%q5t9CK@6p{?fw4tHgsiuorwDg4P6x+S zzanBKY)Eq|`VYvhSqbU&Dvg^BI+Hc%Od{d&s?VU@y7j6#&Te|3Nd3P{m0TyUeTxk6 z(9~xos9vbrn)a*sjru@$8LUJ5LJtG+J@Q{C_Pe=DlGL%P1dd`{wK7jBC82;rzA7|2 zQi2U7XrM1OR{M9f1JbL1+xTG;KSz|LB`NSm0+Jq{(x&PCeU z(-ZCF20N=Uj4O{`Ku_?`%P0_5-CY= z`oGHQ6o2B^R^RuvNg2QRwYB^E+Q}I!e{H#ML=e}IZ3hHYSV}pzD+tzs683{iT(hHj zd&14V1DKUg>}@y=Xl(R*j9NlYndLE_7B*bLC<|-{#9Nie2bJ(s42s}}13 zQK@x{N>Bc9Fx+4rEZ2{c9Zi_Q-T{1y_A=^|@lVnem~lz3^z@P?JSh)RTjM9t#i99u z@XB~v<2>=dJG%_s_ls2MlCR?fvexc-Ao>&OdHgT?RIevN8m~7Tm)vW3E_t<4r}+J8 zjhq6PCL&owqo8dte$Tz6=bnKdOt^ra@~=#EyKo8j9w)7J4ODezIa>Td^G)T< zQw$C;g_^c|S(P>M6GHf1_9Rx`byrsgOeZVvauk?wMR*C^A#wr?zYqoUJ0Ta=%Oul# zd~_}@#Bp$gcvxu0aq!O2Y(d`N!g}%u?l$`cb!&fRO{NW%rrdJ&E7Yvd>EC-G>6SCJ zMNoFWjk5Qf{X;oN@{$i;$2w~8n$Me0GZ#yWySosWkb)!7y)Wzjp74S6mBlz3*n7Ym zElbDE@2NN+Najgz+q`m|*;(A7{LAg_cl6_^3nPeN-Ho`enRjV)W|7zF*}t;b$~{v% z{u|04r(wP%Migf}aTsia!ho1J5F>SErFfqa7naj6k7i>c0tmv1Y0FRF_&Y)fnA`S# zXa#|~>~$Q#Wwtl!JkbzuaMj+PCMGJ_)6BCn zXm$!3%~gDgV4;Wwas$o)B!}nF%0CWWCkPRf(3GeQLlh%gW>+1E6(1mUHIkZ3N9b3a$-v)sX1&-uK~q5zsk4+0h$yUV&%4;&{|I zT@O4hcE1eoi(?3Vc^l&Ew&|D^WpA$JzFPI3w4GYEqKnS5omnEw_9J{~qRxR<0*8+% z9)e}%7!uDH%Vy(L6NeL1)!c7x$hPj@?9979fa4%sRuE9BH$LO9hw-K>%UcU1SGU3P z9-Jh|GGepcL`9H=)6^39l+6fjasn?pq7{8-er8|1#?>#ON)e(iR?y+iccZfFU zjjvfNc{=T*haDWAh)(4cM-&3IFODDlvjZ{sCG*haHO$McCzokw`=oR6*;Ew3sZxTw zC~lJU+?hRm;OIj7=J`xty9i9cC~IW5VwNwkTOt-tHl}^ZI;TM^a)JUot!o=J|J7{z zrtn|HaRv0|%Pa8&*XLi=zM9|hiOp=w+0K&pF$2n19y!bxumb97+pN#&6V;t9e-Sqi zv)z&6lI`&i{-%Bu@YtDY9cs`ja(3`O^1J(~%QPRgiW~7Xp^*E7s+<|)MdWvqLYaog zt@|3a(~pa8Je)vK8Cg_W5{vv!`eAKr)TV|OJVN!v&{eS^l2}VQUJpVeg8zvI-f(e+ zId@^8&Zw<0I|9+{j-aP+S#e-SX~P)ozg$62`_hkxPVz^MeL+ub*;x256~!Ha_I-}o z5od>y2-Nx`*OZDKQ>A&?^EpeiJ`Ayo=DVgyL*DLEPj@6WP6=Zx*pnV`S{^2{Bpo!V8c-Q(v*6S-> zr`|LF3Ac5iNy{6%LY3Nvvvo(j-LfX#tetkxz^c(q?8}&Km;salJbf$S?&f8Ux3=bv z8WpYZY^u$7BnyUR$`5tqRwuyle59`xbv3Wq zcF6DFvV!i-=vh;IUi?M&ft{rbgdWgUKGi`e zd!p!QaMd0GSFR!8f(EtWb;3^$Ss$KHkn(5WN>0gde)6T@d3Ypvoce9D<-P!(I{}Y1 z44%aT9tE9m8>RrqF#+FY>)CJHW9{r7!Ps zS(n_ZO%6RKZQ=loqoF!@%B;0xZL*c`t> z(T1Hc3OemBlDTZ@*Yyo^GXgjwG;^xRi@$r~22w)bP@XOYSG6ZD29@GvGZDh&E_*3e zI$F8QpJ_!qN zq{Vxvih8)$q}piN=U(d9Hv}BgoshoaN+Yy3CQ) zxt7kP7Q{6@RJ5ui9r355k0T%>{vMYseZv?vZbv8kgM0i>9lReNRfuT?W?CaK3oxuJ zGgN0(c}M*JsPeN(FVFC&DyYVz?olwwYQ!CifrnWeFbp;4?N5&ejAH~~n6^JtuRV&; z5vVw&nt)TxAM>8ha9YQ#a#cbqeM40D?_?!n=nzIGH_RY-S8b|5EY1>|44IejRjWRKjZ zd!)T^$epgYJ;h_deAPQ+aiMpGE>v~}Wn8`)Qwy6vt7v;$Z~ZwrQd(;Ge-Ml>@R(U> z6d#&V8p>VAJaUfGAJS)(uEf__t7^e#K1Zw>iRw{6STu2qq@s4%{v#a3k(%QSo#S~r z^fk1rrAN)W$BuZ=oYgqNb9lvgb1w`l8NC^owJ^QH3~e1EP(097os{mi{XlRUFpQB; zZYWK{acEIL9#CHL#XN5vzawI4g+C{GMF3mWSXXVjpC87xoS-Fm>}>Z(eh5&{8JTXM zs1ob;YU7&nXlSad1R9vghlJ4anY(dpJ>#quAw^^vtSZkND~o-26@Omlrx>;Ghqog* zB%#O0LC!MU>UH!Dl^Df6@?Bg3`QsxTPjLs1lFVMCcwB|~G7P)p2vg=|VVN%#Kksv( zh)gGlsvUW(Gsr$EP{vNme^!iPmh4ft zhgufYK7NW5V$@B&=DX%rulXWZ$D$FthKP;9MX|Bm7LAtX((H8I*ACCf?5Xy#I^U8d zB=$o_glLcrll^s@g_ejfT!WQ7GvVS@0BbFn52KC9*Gpo99u9rEZtRwRY!}-kK?k%! zXa2yGm)PR*Ra$Y4tTS%Tjc5An*4W(?67XG9=s5_;nBMwb&`PS2lI`&FWH90yk-yDP zuok$uevTwhUprRid~;o3(W_&LiR-bxcbj&KtDVm2PeBadbDMU?ERVPVkr)`HjOGr~ zj8fnHJ*31X#U-~A_S5|LNg0q7r!saB$=4GMom zex+dZC5MxqeEvh=@QyX7VDU}`$w_}TGhg1w?;}L(}^qy zS)_2B5dP-L#FB<776ZXeFUB1Rb@ z7T?|=9v(jCmtTk|6AtOt_<_@?C7RjGJDBLn#J}5#og_xeIm9F^WKwJAiW=dRd>T2N3pq>H&@Aw|EGz@TWDn<$dS{NiTVOa2FfHZt6^` zB&FLYzH_8eZ{$0b{MGXJVEnUFCFCpz0Of*_-?RvDBfpXBEMJ0A`C88xl%t~y&25xP z>-^p2L6Qn|_myR$>;n@SHZCDDItbz!FR0g-^=H@XD?9WlS8eq4gidJN+%yi$F&!L& zm*|zfkTTA6@yZ)B^bIk8w4$HW{_@_)RXks{Fq zKR)@mBYEt!p7;T`n60M@e!wqdBc-LT9;r+6<(AjRA2^XW=0Ww-*KhjXp5Yr0-s-F16r>KRK zA%dyg*-P}cU(lS_Tv4eO+FkrGeYLoPS?;e}@t~}&l_W8@ugKi?dD=r-#23Ryiz8AY z(<9RrkB4r-WYw%7g8X-S`0G_b4!1B1ZHcA=$f}o`PW0>#9dEW5cYAt6@HV<5SMBgS zd>e^_$?Wo%85$Ie=|VC)dWJIpg6VBqWOg2IF1yPKPLsf8?1p(4U~av^dx67ff78X{F7-Nk8ybDl z>zp!0kXtzHr;c<2ENyU3=R!h!(}u}#4jheyjGuQ-25--CP}b2Kem6ZtjM2|WHJ&Yr znNsi^dNA)C&9DnfLY6!mj+pxFa`Y0w6b(-w_Ko+1Z!Jx0nB=c3pD2Alm)z4!RNprO zdU`$++AhYWuIY#{8$X)Eggp?2@SS zIBwfSf0wxMx#@i7<*GpN8EPQXL-oet*v@c$M2ue$b^e%&5QZj;IdjP|FE?Ek%cOv# zmxL?4xpozHaaEgobdrOr)U$#>>PHGRM%0=6xXej;G&|kXu6sK=H_Fe>pP1U^XRj?* zvkC_YBFMj}XKehT+aN@uSPuCk4)Y~H2TY4}5A6HxVyoHID#lC)XnymDD0=L(c9>dO zXk!ue#gCKgVmIs?h4@zAh1@h)x7&DJ&L=`>b6B4td&aX4+i>HrCw9Dj;Cb{N>!>es0x={OD zF2~D|@->WgqHsGFZ5|uHew7?~c<2WSXVDjZgKcS75%p!u?X=|mfMZ)X#O^-0cvm#JX$U3wm$e-iV#yhJ4!H(z46dfQPybmFXq1*3J5lVtjb)tQ&cXdr^w%7A~bBwx-Cj}C|lAW^tN05sYIZfsN2uf?-H?mva zbno$gBRiu3ugn`t03nPNplE#cn9Wyl;aWxNg-$$;ji5UbvhYMxqn3 zWZpNto}JCV6Xs|#UbpG279@Ab(8l3ly3~BKJX;4NBak*LzcaN7lOr^MyF4@Wd zJ-Bz|T6zZYa!6l@15cqZwQNW=Zld~Ai?xi^_C#^po2R$EBFkw{!}-JsmI!#;#PzN? zS1mP6q|pe~y=DmQ?V7?O{tDuE3;s&ZwAYjqakF9WF!uHt;a%wsh~K15$R_-I$!hmP zS4%hdcxOPTKQ(a%J*b(H(U|Rc#pigf?|{*FU}#jLi!hO|_)J`Fuv}O-buf!Nq&OUE z?+j;%8MKudyoF1;q^A1F#2LVZnppGvc{9=zF+n(71SnECPkLT87-nolo@g}Cotu87 zR;oL*Zy&7689bdWPu>|BQm=zLn`el+O2dpSpLx({e)a^N52XzSC@meLqHLI*xVwL> z`wxyGtz`QjGMJCm6fSw6a)mSKIp2$CNaSVuULTn^BTL3r35h9?5RO1?qKiO;HToKS zH7ADL$tmUHX3ycVQxO_57bB)(G{HTg=7j8Qp<;i8Y~6#cAP7Cu$0v014=y_WPgzg_ z*Nuk6cAww+$E>t~<8|68ft9oy=+_Pa_+1laqinN z9~IcbI0hus66#u6J~-A7c4EIVKRTVpBb- zT-o)@t)Y+Whd4dlPPMKEj*W8Z(q^jV3mQvRTki;Utfv|1G!+g|WH`hGJUp1epeb0^ zaQT-PwENQ`e6aP>5BnIHeiYYwm68uC<{&ljc0``kvX&@;>eS?5aA@oSP1XL!VMu6M#v0;2dv!0BCY+VF~CuL&&(aPeU6Vw zxBb;ypWOw!_HB7HFf=N@GfgEA80L$?s6G1}fcVaJyl8}11Tk-qyTk!*W_&LEMsqhP ze{CN+FktcUKJ-GCa>hV-q8HLaH#xg(1S6~Knw=GO?SVzTWA$s^=0-Uh#genQS~|JU z`p$yFLvN`X|Fc`9=gKTj9>n6owsyfhk+F$!N0pd4REZ}U+f43NG%VUN1+n_>#v>+I z-?QWnJQ@wjvnVcBbmGOS`g!FF6o4o@3tYm!Eh;V4shl0CI-j@eq&j)nL7gB3sc5RW z(ZqV#J332ox|755%V?5Ap-mY|=-+5ly8mVEfrqGJDvoY|j?{bfSm=)GEyI!C3=b)3 zCuk2V^#3p}`0e&|eaX1~jbW+Ii8}6=jZMMQ9$pHRUoymhK3%Hnq#2uX`h@nh97X9 zT6qHg?Hi5@AR;th3NC8rCe{-V-Ma}f7ANcy&V)c+w-of(bqSX+;Mf{pE^jFX6L?!Z z01qd%L;~jF_zZq?)^m~+=&gcgZHjuZT|_IXLU|(!iKyn1n5YT(|BD!^ioC zrJZ7})kbH39Y&{t*KSeSl`~zjhK`)kL+evFpR%j{bxU1AaUt-{YW>`J)i)Cb$x2kJdN96n(hc%2=;?v)*VXc1E)mTuu{5hSFqc{Fdl=5}75h8yv8exWkM1uT?4=3^=Ah?E~1W`h%#2g0qRd%Y-b zU-Tl?+@wWsBWPNpGkTkdIJjuvbiNdGpSzj<<25>SG3kyDEDZo_k4no%4$4hKRg`)k zqJqq11v8|A<5UG3@BLgzlFh{(#qD2Sh00M3@Hdkq{Q1Pjt5x&B>fFt8Go}m1n3$CH zL5a}?CNJF=sb*F?kT^Bx*x3+c+WG3X*rlYC<*80e4dKrx>1`Vsvech1^~V%%fHv$B zv47gmc*%662&^=fo#qmqy!tL3%}e)=>5#5TzjBY{KQ`~NS##`ahqFCzL}#bleR5{l zsYWE=>MV(MK5K3HnfCg5umPO;!o4F?~jXA^7Pi=71N z&V1{&`?U3hmRtUFt-!fGXufRy$Io$l+%Y!l9LMVCMqxypE~Crq%61?Usj4rJ%*%K3 z8O+b(3O$MpZ_Zr0VMLVt{FR{gAqbAmjT^5mU>viYoZo@yo_7n)c&tIIoq>&YdN z;DjvrD6URbCa~z4u}8|4*#*T5^6B!rQvJqAhO3Zzr0rShc1@~|l9>9DA?;xkFw45- z7ucU%E_Vr(3y-j8kmOfM2*oLg8#p^|$Ror6gXZyvZjM4+4iHK}oCM$mh(*D}TTqr$ zaq}=0XFNC-fXJ&_qr_c2wA%7628y^MKn1x*9yulQ*3_Oz@U+6|0douY$D%(ux%Dci zB~#nu;sRSVt;*$hR9&5?a-~Zy5T|66Ov1BJxu2nzk}>ykk-A(>e{-i? zogL4k3IWv!l_`bU%dQU3V5@#CaV=X>Li?q5W9VBV7&JUvR%%A%vWZ^vW$uKfp3aq7 z;O9cK-?ME6PnYEnWtiJM9r8S@faeamI+pp!=k!HpO%%DU=XqlEMy^28+`d8*^F6&Q zB%wee*@MPv2o#%`HT}9yf1NR1(R8xBD*cYRMfH(cYB`khkX5#NX*PFMxu=2($*Vtx zv|LWkfH{k-^U_^`x>+jKKQa~7A*tQka=&(VNc?T7coMTgBIWp7>(QgiGd7ZHcFL%k z6PH%aJh|~Qk=1!(p_y&5rc#hP&nvc=2w7t*PKCLi5cXQ$D1E~-yldH|x9ry&9%^}W zcgyFy8y=8sJ&8S>#IB%(Qm(&-}K$yM zsdo%^33qbZtE7kAKXflI!Da4)XQ3F6*E8`Zq|7dccn~*tHAqoO!9&Z_xK&jy`*2Ru zFW`Z7j5i!64jP?L-cM|qCRhq^#3CpPagz8;dqmyCTg{F2Fkj*~{Q zfY)wGPa6jwX#qUqw9^~?reXwH#s8_zpL_}1k%_?`XF7f1*g@$m@@ zO+R^Wrkx2z6!Bxl+n}8Z{f_u6)+hg|U7CKk<@qn|0)0MNhb~~zf4Y1M@u#f0|Ahzn zshQTV|4TdT(llNgXxeyo>TA4k=QvPuW**2y?_`wVhPK$}O8J+)ETsPc{UubXo2j3F zKN<^aqZeI|Bj(%(wPHNHabi_U1k==ED!LeGaWogY&5jCU7?>}^cdKzZVPU#54fyO{ zM}I>FOtK3hHlWpG=t;M~=`_&cau9eV!_(b}_S|KVpij<9XD^<}55z!E&dT6N4nG|7 z!-3lVcq4HU&Zs(@pG5M)p}^gTRy*|#v%s^LVFr;(f^FJ9KnyKXUG2N_)x#J^d#82c z|A%YZcZC^Qi#~?vxHS3cax{n|!Ho#*(&B#x4;$v|N}dIrIjW`-m8odO2`W?kjNLGc zwj}WSx27q4Afx#We_caivxtQsr8MVZlVIBid6vox5oY|rk{@uA`_ z1hJg%UFeKVMcf9Pla?g9M1jPDqbEo{L0ch}z!4ii<>*e?dacKHZOwTein%?la#7n9ykY+C0#z=#4EDqm3mMb-UzbNSP1>%`OE* z6t~+qfYM5~n_b~}27>ZA>>6+kB6aFi55M9;IC1F>mmp7BeG?h##i1=r%UMduoYL@s z#yVn+ISYz07Z}TLuVZ`3_C&jPHEHP6?A>FmPKP+zJUD~WQp-7fkL*yYzR(vdG!EGn zCac@{93V3GzS;h6hOs)AN}nElNA*yu-N}z45P35-WC^ZFNUSE-b(8xHdLVDO2w>!AS z^W2Il3X@sicu1Rgv9a1&iqY@u0SD^DT|UoVeT@!U5hE4sSD1X!nJV&^JR9$SDFdpb zhD{dUBw;$xoxZm7v7bJqY3UP!pUEkTt0&@93RbO!0D46Jj$D;jlU;*W8;G*F{=5FelNEr`6tptxCX&ObT7qKb@;u7VZtWD|G4G% z+KFd3XdK^}1){aFSt&XFQcV@MgRZ4jD3ibs4!^li82n;{W5s^2{m6q>G9jOohSp8j z3S*{U2^1e=^`%TeBo+%Y6I4OOrb$V%-cF^!u&&!`kWE4BJbH<^F@VD)e=3+MX-Y#;6lu1^ z9~I>a_4KZ2cpz_yOJ?PvR5(ep4!yWLW#fYfp67i(DGCkP3ZsIu;%Ad4wJom^eij2! z>W?AO`n#W3smskmr5I$x8->@aCBP&^68L59?~?ch4n3#?CPHL>LCH?kSa%~ci`*KA zC`FrfAZYHYh%D+ShK+=$2J1+0YmqGxS8FwX#T661 z8qhir{8JmK!!QZLD(9S!;Gr?~et*=tia{@wPBE}DtOr1zP6WJQUnX;duv7d(015E} z^#WCq>%G%y%%~}J>T6v>@lAQOaJNvGQ~s7&IKYE7;ZH=aIGHA(mhUUPpCpl9O)C0W zr94o$juh#}>3`p?QXVR7Nv3?Qg%sJi74($58x4P6vK`?LTFM!Ah=i*B(v98m$A6#6 z+3qY9&z)EhAylr5Nv`;>c;Rmg?QAHKF_%(Y7N|aL*~F!}e$(NPqz5AeKKaecM<-2(56bQ$PFC>|3(z;Pe#;RuQ9YtuQYbDkWaz$$xQO z&$0PPH4qlDc^6<0MoOP304Aum0)Lmn zvAzx&#@W3GmO57wV?Yb=B@8?@pPgC zWQAAD#Vootzp&nXR4Y3HdJK~>7LKUn$wHLqk#2`&{26{i5x*NS=522SIIs- zAQSz*=#-}M-jCi!t?2z#$q&zN;V5s7XOUCzfb2@a#FIbY5{h2Ff9JQqA1SrJ|0x1Z#0E;E0)S4dwH+fnJ&rf&zD|uXu64W|hh{$;B zQH5$D67PeMEY}N8(5FroTX1nRmtL4_Qxf@e3g2>wEMq9?rXWc`j0xGMYC8|F^> zT_*iD*W9-L4s-?_&m?x?YW4awHfn7{j@hNGO&$FpzuIWICTb1W3tJjfrw~?7UdL{q z=hM(6R2Q4_)jBmh+cv8vb#Irsd$1B{k4V41u*zqCYQH)^`6}5)It#^+()QaEc&oxV zbkIE{6RKr~Ij@aNlsnkggComr@#6?o3si?&u*<&6R>O)~Uvr0DmW@54_)wR6w(I@K&r4Ov&!rFl#x zA~!w+Ysj12OY`EH^cJza@mBzz27}ns)%@FIx_)Y^>(7xT7!BnO%~!n@wvqf~x>`qAg@fAc1Pjmt*&+F)n(FlE=(-o zL7cz|M)8|bwe#5iea~btI4*~>XwCUm;J#(MtzCOZ?? zN81FW)NPR#%r3Dqb_b)crdop0G2E0?8AakP9(g&vRmS1E-QH+FQ=ytFh(GWaEkrLx zg7XGVthorl44zCo;lo+_8Vq^iYqbC)7Pl-b)yCU=&TAWxM${OBs^8qyq#$(UpfW%+Fl;&41a(KWifN>YJ%H z3{Q9SqiW^q(a#wRQ!cCJi<{$ryf-#7j=}U)?|(tv^!{_@Rv`4<|D`srQm{I*|70`| zD9Gv2uhHUHKq(~4$)1XT2BwW5{6PaR8nXP?yv|U}*TZk6H{>SQ*c4u|vfoufFlZ`O zsZ6ZVk~pbx4Dx7v2(zGZiBR+oi%c&P@BJYbu`u4$`c5qs`Xp;Xi4oL7xRB;WNvG%o z)n4;21~DS;En^5reCE`s->QIg|9wZrk2;iqG7#ax$mTX!|CBh;$_+)P`B9(>WNqYMnPy zu|EFU%W8B(*}=%QE>w=(~f1d@YIt!kN0P-zBQ*F*!Pg#4KW(MCGg|u~qJzm5I&} zePWR>l!L9Nkb7CD&-}zbY5XGc7Qk>*U;82OhSudhrppOc1fMj|(Q}CCEp4bO{QyOI zb&xBy`5!z}F9$p|$s2m|vdiv{O#sMYZ|){bXyw+y0eCd_$#0+VO0?=8al#AlzDVED z6CONOZxx0{co2@qiK&M_(TVVW48&&3qBuN8Uo(pb=E_|WhZl#RYxfFqd0ZtLJUfKE zd|rMj-;|-37$s^1vshmFvFog^C0v2=p4wfISU-cg8iX&a|DL=2>J?N0WA0DNz3H=mRD%DlV zbC89P@tAO!hwBvg-XrTg&#v=Y;jva7kfOfbWRcjsRr~d8E@~Z{l{WY*0m$2`df`RfZ31`kKG9GVGoL-shyN9IEu;RXIEO zB|Jeotsp?HfGg+29K(3dQ;;g`q0OKsi%_YBFtpet6LsqM;SuBPkJyJa8Lp$)w=fjd$*6|jK} zV9yEEptZe%fS|SQaFEx&D!)=Rwme_eJNO@;%3j(Q@7S40C@#+6H>h=}*_n3r?anm$ z_O5WIHS?FV(wTO6MaY@vZn0lB-R4Z|4?EF#w13|Y%`Amde^Pi=@^2Is)bb~3ODO-f zRnD~clYf%`5$YXLNDoSBWwoYK;(;we}UQUh2nz^ z#N~W7i`pGr?UZOn^HyWYxp=iZoZy1}Hgl-1J#t!~&XglXRBNANaCN!7`n!M{@JyPg6x!bNm&0L z()#rWRSCCu9S-?Ztq2EG3ar~ifpt5iCn9U1JO$zuP+fTRNP!2WThtvh!h_Co)&3u( z1QpP!9frBt2=903cS`UhyyAGcwV8c*a;p6}okI}pc5X_yoj+n=b*SQ&XZg3q^V&}TV*SbB2^))60m8iUcv}79CHAM?L zQHDD-^fx{a4{f0Gp+Dj(!`!T$6)M3Lv)kAXwut{4uj!l}b+&*bg5lj>JRgBF zb*rNU(P4*f#XKDi7m~|qmTcCiJ;VHz#5^bj`(mi2Q-ki#HqCh^N3_$NWqM8AFq`gK z$Og?>5t3C&oHFa~F?z0JmWjCB9Vt&`2%2vD#I^azk5xXS?MQdzZ*f>>K8v%w51w&Y zbD!0wI-cU8MIP4i@bI(RsgAGj%zSLev)T*kj(d6>))|tK9h1Wdz61P?*GK4$3 ziJgg*jwcZ>R$+&O1h`VR>qCVFl$S)=*HwZ6t21k*EDt%?$OB?D5uB-@>zf~YtQWRr z$o9oGPlb=QWeua(9g#J7VP*)mVwnBLQQ`(}1Rr70?iKe^``fnbYY)@72pgIzjz|~E z?p4wSBPm{(OBN+m*h`J-;WufgrNj%D2?zgXa+qBNnhMtSnCbMWhAlFZZiPD)_DPy}NPkv+tUJFr}eDj~v`Nf7d+#`a@H2l!>-gpj+iI}sm5y6gN~Gt;E0>2FDc=ENSmBxL&19Kd3Mf) zF#liiC%P4D`Jlcgn|&w86QZ;v-@h8)1SyukQW+dpKLdd>^B8x-XwMf82E1I@DL3w7 zQq9ln^~Gjo6Xjm2}vapyD!p%6Wwl zXy@NUEZbGPFcWB5p(QqlH}AuFi~fVJEhgD8KPmnw2^CnRuxwuE^y=aJ>3V(1W-hfo zkc9R6;Vt|nlS@xW!G77ta2t2*fXI7s-ewq|a5W^~vR7PoQhwAgTKt<+6;Ri|s--BE zces*LLjV5Tm4xhu{a>i13Wugr3vP=>jH$vAOLeGT|KgAq+G8nac7jw?}389nHPx6njXP%**U(*(y2!G zEP`03l~qKRif&Uravv3*z3j^5b|*L*Hy1=I62DpKedV{!cJv0rziv01J91xP3vUoB zuFOwP+?*)Bd?Ue*JY}P|wfVz#T!=1`(m@Z z_Ci*RNL=t&@wS}LOY98{y1(8q8@jm#P3#sS?h6z*7r7+*kZ?!5=5s=eVK3B$W^R1a ze*+pfm$gclumHJJc?&}Y6`-Nkn^e0<8wLv;&xxOf8-nH>UTtou4d7(ZhgaK3!0C@% zS`aWZyfe~P_TO8sDx#2F5b zDm^bYcPU>fl_E7f274UgH2ckJ9EAKWje_P4r9??UueTVPa52gR4}V(k*xh&zhGNAT zlH`Ey4aYur;NfYr9@SxF2k>;l8}t{C=r+&qtcUy4SOp?4&XQtUyI7NY(R8^@0{KZ2 zH{W3KDD*uY9gd!mRENbii>3G(Y_CT79Zyp@AJt}W{un9TacuQSyze4E4LS8TkqWAI zj3>k*7WsB_ah51hNHfjFqka0r2l;!I0UfOOIxzR~7LVegzuxHkkRPGqG4&3VGy8^o zp6B#CXC(WW9c>gFx#Aq@W{=n0(>I7Gz)>7czG&X`fTK%vL8YJRfW?6VGI832SjN1Y zQIEX9tE9#$F{D(EfmkOMfJgD1(d&1JAe>?t4^H?Cz$r9O>hPYJ3y^jIm)^z;@aOS!Sy!0U`W??P$O&#TdMD%pL&?%n z@5880e=K&?#CVIhl4eigdcUI^Syie6iUP|CZW(F&QHAQmp~Kk?qnXMa^k`_4c8bw) z5z{lT0zSMCc^oSWyUAxg`K&Z1ObX%Av-oH^z0d6R6+dtEeeQES&zNzB2yYw1`I#)( zc^-P>oqQY>w!i5PDN|qXIqvp>d^IbR$EoGIEYoLp3{9oqlgCT;<0bnpHv%|*Bt}*dpQR+1s8-98NUClina9vo`qE)>K(WSE$7)Z^o!6Pv44jhK;9tS%&bo zM8#+xK)P@9UZKkUt#XdQf28=q19Cu`hm+T62UT<{s&`A2M_ z&p2<`7FshgPHru1VJx8D_^Yp4cfY31f#P1sQkGD3Q z)ER(wPDU~_;bT*xiW1z2t*^hX1w(^ei`!y2DfQ~Udlj9m`|c|g&f!o+eB#6MQeXW? zeg@4;UC1&h3t@{DUuQYX$K~KN=*qyXng_3IRJ}ti{2=L{+OFQal!YS}ZLdIS-1rP; zL|E}5W`zS@wN;)UT=({v33etMX*?K|QKrU%wV%>0y)i$6Njtz2B)ymDe3c+2a_4t5xZXS9(VcD6e zO0^UJ)97@ztDT4{&ZttmbVJEsU<9Yd-+Jp%0*9|sVOqlp{yH&cnm7vsYFEZzPF_r+ z?)`A+xKsrto9WGu+r#Y>h5r`+#~TOX(@ot<XKq@}f6{^7Wf* zWx`pm@pD!jPT;RB(e2r%uW4Xs!TMxAtgWp$gbp9Vg~nvy+;Z!vw8kPxqeKikb28pB zaRnN~4hALjiKcV37)?qoF|Q}qysN8xRC>_Nxt@zEE`Mb-gye|Gv?3qO4c%0-n6ATtr1Do%G>(lGj$8-a2!y#zf? z>(D-KGmdLm6i;0s*@NZ}+~xxGJ{}Vr_n`S$i+q749^|EMclY#(7~^*qG<>Z-{8ScY z5)G%t)3aqaHJ+$csp5{~l*i5@xJ%{zM1 zN7G9}TnD3tz1FYxYo0uD-E}|h#sB_0hrlKl@a(bT`?ZqUcTAM-M4ysnDC=TQHag;< zY4=6f#o)Q<3lIn7s!UAwouAsdU}`(jgwY=#$Y1t-K1VOhgiUYNe6B5Z+ib-) z4ozk?_|0G5PyOoBU?Wiuust&piM^Myqusa$7o_}Ik>nhHpEX)I)^ir4PJxX!8tX9d za0@2=G=ET8f=|F*cyWUhxGq@NX>P#-W_Z_RfBU{nw5{6G^xyR8;U~m30r#H#z@k`_ z*PMvAw&#uTn*}}-PTqjKA=d|Hl${cExmi#j4Si2N`}v&bn#rhxt{~%uFZcLcIZMZq z>~+l}0sWx`JrGrGrb{`DjN_|_o$O>!JQ$&=8_d^85u5ZAXTp# zG|ZQbJ)N$G(|C{)C#i}iqMLMwsK)UP+hD=2A*9KDiB8We`kDzGB%+NY>m@l+5(D>s zekv%Yv9TAt$I1{M76u4ZX!XeWY0lcD>U7`vH~agSF}|Y)i0~}(RmpLTP`hfUDu&Sl zF%L)*q#()A3{@B}i)4pmwL^Qt-B9t!Hn<|)~-X^ zL_~V%UDf@>MH8TP$s@{zO*6cA9c;*Eo1Zs7D=n@eO*hOofv_>-_I+epA@54%-Ov*U z6VT^PX)8113sxUW#J|ah?34}D$tMp_ic?FzeG8MQOrD!;v=!n!yCcX5Rx4UTc=wvH zpB1vAN#TGSk=x@^L$U)A)d8uv?S9_!kgIT^fd4}Msb2^KOMmi?^QhF^qW=!Z!fPeT z-`ytYOa8^zs} z=KSQZ0@>VFRUm%-iC6<8V!*z1yD&z)d57$6oDO7dl-Mv%rdU=Bl}TWc1)<$TH%j$a z`LVirW@*h)?`1@zN%=*L5-OJP%PbSwkX7u>DzV~m-(E_mRWuTbQVBK^a7Y^EtbMAZ z*JAd*;NzhzUM;vuhLJlwHNFW!+U*gg(pq6YED>GO%BA0;cq33U(mzLIbM=9_|>>UjPWOh)bO&&Pyuf(bM;ouFiKkz!}XsaT% z;bNj7xQ!WUjTZ#!h=&vX@j_CAH}q6eN6;}k7>UYMHJnv}Q@cRa&k?ES&L3GVQ#5p( zzrZdsVouSbkuqXoUEnVsZJnF$DxCe3Ub2h$e&Lam>e4HRk2vVU&22&#t`p*-!u(MW z*^ThcZUn}1GXlKE%z$~D5Ifd=>8^ZYCVg~~>m(wgsWgAxy8C6&=4#m)eg_6Vxxv2O ze9r6pl+T(zB%!(2_ZcQ-<|ASaz5t3FSB-a+b0}MWJ6-bAIZD=Ys5al0xz|*J z?W%i+#z<;y{<+}a?G@1<2}vf0LnBc%%G_vz6r(JVQWmZT&5LU4wGzs>rZx}5Bilx* z#-As2Fek^e0kaI$n46v6y0bxPkfkT&#Nw~2f6$dcWlI^ipm|xQoKV+?Z*F3G(O^Z; z{-oSk8W-zNtx_1*)1?l%$g9kces)e6!7P@e8ZHIaooij>bQOjkvGZ+hI1zV&`Tj+H zP3*~FMqYgGxnS(bBiTT|K74BvHzX(U)gKEVCvzAzkCzvbuvmG3;Bi^>h`gwWZQRPi zL5_R!`OQTV3rtCTgv8*Y{wA>wDut(k>vG&-osFBzZ(=8@x2};TqzI*YUxY-WC~WmP z`Ywq&F_P|Rn5HJ(N;p~B!HjQ`gnqK!28+WxqkQqovmn<2BBBQdqCYh+{hK@$VgKo@ z6l-=*`Qql+l0~}07t^`)fHQTxsErRnY2bjgI=rIW2!JCnMkmwhiB~ zTRLI!$}@#UBkjNg_b+;;iAKEX*8Q2TDYHC&^U4A)5BYx2GYtjwx|Q-^`SiZ{p5DUr z)yCr0#v=SOHu1i3uq*79`cwT0i|cZ0r{*dy-se>4an(Uy>(g4~o~hsdmYvwLM1DuaO@;NEU68s(a7-8srNF}=WgXq3yB z{)+YSDA(yHJ}R(!{QoldCh$>J=i_%)av>pi0s+Dj2oNBwVG#ubHbW*d!9-B71dKoh zQxqx)lYod!a1tRMg0wEzwzk@8)mB@zDj=XF0g|u?2`Hc_1l%T$T0jkmNZ#*r?o2Xa zE82fQ@6V59?sD$A=brPNXJ3w5^auWKj?FeGQH5&(9ezw$=uOw!Kd?4zd4kTr;7c#8Co##>?*>Eu-c(yu zBqHHOMc*P^q2res?jrgAjFCkJ?BTr0;DHqiQ@KtzI5MmSZ{8(a+wn6KPmGOYN0YHl zFvTACKBwn1#CDr|EH2}V=2Aieb;2n3K9O#As~e}eV6(m!?8PU~>1(tHUBoDvY{@KV zOCS2N-F?`$@|naLjE9*;mo@ke3%5Nx@0W}!^pHBT1ui1&WcGr|a>)*fcfNSNFB;@2 zn#-kL;V=54L4>}_m4WLrTF7IsB^LOu4FBW>)n=)wl^VU{g>d6)i#EU+;1O+i&x=!1 z<=7a;RPuq(c(_O8^kGUt!>a8<70~!>#Wz;mLpP#P!mkK zJaEX`lj(&YJBaV5$EhStAGI_b$IfM;sY6MQ-fQb3M0m7S6RfWYdJwNOR*0aZEc6eG z%rnU|JOdY^27>Amsl>Wulsr_(3q*|ghWD#fM;09S@I_K8mMW#P6dx`So2T3ktII29 zQyIszt%8mSuzn~`zJ$7f92*m)GkV`FQnk#w{K={CtgJ-9Ah=3EZ$m;*L9pc2=dYe# zT|6n#o@cS5*D~QN+`29pW89FT4XK6o`XgnYFK-jY6-mt|W%BN9ap|-xQyrAvmIz0U zmt3}I@=l|B8?Eg$!m5zGf_S}N_%H|bJDU^Eie%Xt+iU8}(HiYmE<97d^-SA#76}tI zso>T#(&iD>2B}b-J7B9znW1)D#6^(^{^%MkAq42!|+BzN>PXU$88 z<&x{orA!t8R?Qg_Hs&q~3ewj(oWvn*w^kI%e8D`dlTGR=HoGf&nl|zUCACb0vIooA z9}jXSQ8XMs>Z1}{tee580u1E1O2!>>?2)2F_u`O?_?uHMIRoIE#Mwm3%}y)x7!QXs zP++g4Y^?+iLx>y|QsxCG@6jYuE>Ut+}UV1E+-QtEL#1 zSZ#`~J0y(8L_d=KdU34QE9$oCP1#?K8h2z{qcm3Q7V^jEjia$zzi2X`OQWsG%-i{5+dG^>O~#SE6hZh<8MJzBb-!r*(A36DiIFKY&un?J8i3iXRjR zB{9W(*etiuWkBq{r2?|*zU1B!CDl{X)(q9tH@gyP$5|~Gg(a|&=KmnarWWdji?arq zB?GFX>Rpe}F4)m4y{Ocf(q2m*?EEXr>jypqdGKP_00txVJs;T5gyJTI1>MSWzB%9fu_tnKpk}4>~DubUCHQ$E_eoOPl*?A+lc5+dM6D4~)yk0em>_ zBpq|DW&hT#ky|6T<>|JOW|0FlKZOm((hl0Bn0LCuD@~@ z6{q#+{I=Sv37%fWQ1H={5>YW(sEa{UV}6{L&?UVwHp~N)K(7KFg1_~mgT{+-T3p0t zPH=TGs^hdF5y47<6>Ml7wb9PtM0!V8kARRPH^6`P{6w2umxQ`@pGI5a!pZiHN1Jab zQM||Qs-z&!5Bh^Pc7sl(#{ym=VPG<^qO_GYpe&^$Lr>m#6$`b1msngPIkRN>!#H{P zWn*(kt@o%|#3{UyjmCVFD*xbL1yNVYOyYx=cRTX9OZAfN?*%1VY5q8)Qzvcs)tNl) zf6N=;2q&U*o|}TKC{q#`B%Dfh~B8UNqb|)JZcet!C$< zd!OZYO`$z9`0fvi2vA)h}dDx>TZ(joyP=_Pk` zwz@t(n;v@BmeR0n7M=*L-IY!=z^&4~#~ZO;<00{uJp}`Sw20HdiDe@)X72X<@PstY~QI$saQlg5VkT)lY`F1|3ZU>X;ITp_x zN(k+S1MwvC^i7#F)6QmwZpoNQUOw})T!e#$)(kt8nNpsirxV_NNH6NgCQL8B&RV=I zEX#ePmQkFq4cj~N(fK`tf|jL_x`2{X*r$pXb8gg5&|>=(iEhcESu0a#2{~&hPf?AR zR*2V7ODSY^FWBz`i zl$;P+igzvX>$Z@qtRt=XyZng;6ekQDQ-DZ+PnfkJBRYY6#*QA=dTX>e^;&`*Ez!Kh z*h0FXcvlCOF$J?i79OWyj0-;qR~7lt*M(`4|0`r_eOZ_z5%x19y7XumS>6&$N0D&8 z;Am;Vcd4)}V^-Qi=E|QrICog1$i_w(MrMeEhn=>N+pR-0q6?0Ojv34)Tgq*ScEebS z#?L7n2Ki8+j;rDQJp$S5nPm-Sgfxd0%o-7WL_I+E8AP$X1o`|-(SCfzr^>n|kWDJx zJ>e>>26|zoe80Xn`<{9yp+H5F11w$Nd}9}AIQvjet~H-{l+ zjfqa6jxDZH+n0V+_ki@mEEenxv#!j(r(m2piSe{T3u_5+C~azL7o}T`Nrg+D5jcNL zpC#96ElyR_*IgVS0%k9!arUe$Q|Iz;j=pXTDWccf9VCHEy?y97nKKe`Ilw84As-C8(KDuGb12zGa-g(DSUB`!e{T%uviIe2ZS>tm39SYi>%7Ub36ROm`NJeyMzY zA!kh8Oeu-8IIZ5M-4o`BWPj8w_0|c6moHB%$P5x^UN0P+2 z(+B|Dmo;;X>sUAOkuCc!+#R)2f4W9@9TF;5ngvv4hNi{kN^y-RG5s@*cCv?eE1&}; z%T#fJ!zDCzHf+O)EO$QjYxZQ69St94b)QOe#|{y{^M!O(GLA?Wh;3}?4Q|^IZ470k zlY;W1$MHKjD6d6YanumpHg>3}t~4WJnAR(}!5BD9i+AGb2e%9<3R-4?J(o2HaPAKq zww=lt^c<8+eJBlsHZ)x^nLu`_U~BzMiE*jd)f5c4=E zcDB7FCw8v2GL#Dq=3g)Vv6B*KWtI>Iml?V@Gt~J$jR=wteIF;A*u_@YXP9BX3U`OS zV$)wZT^#mGgDrNx`X-PG@8NF(Y18f~k>%^WK&QVM&xWcyP zVOu@9b3PBmpgJK0HC=z<6Se+Ur&=o^zZ1}?Ne!q~H=|r*x&gvmlOoDq0(nx~jul?@ z^$$>2am%ejha%9X;-ORxbkU56U`6H)r5Gv+dsEiY>dp&u|N05Q-c@l9;mRyzWS@D^ z9-89>di1`ld|nNGA5p#>a1zU)ycSioR`pEX+A?pr;yF?(+~@T1r>WjddRwXF8SV*2 z=#?bC2#ka6?ln*GCO92OV&=?($2lfP28lSrJ%7&-24s@7`L(q1+lq$Ka=G>BPO=zOVMw!JgG)TE@E4ohiqbtrNeiRIu8b zp+Fx{dJGt-0|wmstJTFsxs;~6?+BAUA_|g~Gw56n)<_Zsc8weth=PLh5dr|~B_`F@ zzgBXy%-j#A4oEtk!et}l`nG`!$DlKT{j&KSX-9|t_ z1=QZrLPlU-`kd8~d(#iX(necPr2+~eL3se!^aDg&+4_HKE&DD+`5Xv5AY>4P6rw*6 z$%z%qpR)Z-N?e=~>fD=IGRkdtUu!Q3dq`@Ew#-av&|M!ffA*C3s?Q#IYA9!{q_53`a!GCgeBuV9q#9OqstT~^UfJTY)F2Xt)i zs1;WI>Fo=xf^Dq&s|3|Xt!UVt;m)!E?5)`RF^o56w(RU|Ih%m}a0@|T_>#M}B@N~yV1x_S zV?yXHnBK-&>ZnN8phyj&g(`;oUM^VO>BO=oJ!0%0q4jf)=L6S>(0jdnJm}wD?sGD6 zhq-VuS=hsT=T7-Jd7rgm7w@6Sa=|7o@V0akR*5X&q^IpgH7EihZu~ zDy2Y+@n(wFaoqHQEwHQ4+CTZyA9_HiJ#kXb&{Y@I!#!S9Ym0+{$ar-)6~E#o<5Wmi(%tLUHd zwwcy04m8Mm;h#C9=yqI|`wvQ`iwz;e?K0L}r}dVxx|Fq;vARSx`J=`lOXyES%d-?Yio#*WcipZ{{|0QBX9>B~25{t0`P?ALI8 z%+-6784UF!&YP}_Oi<|ma)wTXF++CuR_i2;N(E|leqkX!Ea9uOkK2pq!(1+|#n6;l zJo_M1c=G3ry13A(v|6VM-bvyKv>c9TcMSeEMSbzNv7n&OLK&TeAqA)z53)Fn&2xnP z&El2je|92a>?6t2ZA0SL)8B(1%z#RXnov|$!bpjTkQG{!MZ86!nB^$bDIx!FsR4%C z$5FqNlI(h+K$jwiBU7)+i?G(G-lOG3o8m}W-sg1>aT^1MRSfJHt6Crc+(Wcbm9=2T zJ*VvMZT9|=MuAmpN8;j}+QVrWccp5#UB5#w>I3JVp3)^zFBD~Srn|G>?m5ImtXoLo?-VsXp(m{M zrEz&(l{zmD_rP93wLw7xgA&*gTAJ1?{!LaIG=F`9t$5j0#dnWDSjZF5kN51m-H+-pTefXvW`#CoJ}o=Ani))l=NS@(H3JT2cM zx>EVDqTeVs5UpW?Xbs6BKoFWQvz&Y)`bdEkvCc_m8({)xh_u;zzCaSQK;V{4uUXNn$pKWxtY3-f6JWGdhwK6P`o8l^3z>hU2Agz_@WKnMo1BTzLST3D` z(WDF?7;Tnvx)2o@9t0?2^qX-Xz|x4l)lix^YSu;So5w_tw9Z}Dsd%XSrn&Bxp1z?l zSx}?u{?3P_Rq+k8^mRAP%`CY&Hn*6xsJN1>d#HdL)M@5|g&N3l#S6klE=0UJ#OpVU zPVp^9V1j*pkhZ=HCrIVvqV2kk#J_6~fxRsfqLX?RskT)f-4OgL#t{^;E_Eu@WemLe zx>V=wau{VDYIlejj}&WN$v+WOJ5;388U8G}nA}gH5^)a6a<3fl;GDFa#mp`nRSxd%6Z6a7mDjln(8Ra*O9{}?~|1AIb@I#Kh9lZ#Db+2V^)=Pm1%(? z36>+P#TprAd0rFeKj z?a$t*fgLG2QtAHO<|dW?Y5{V-I-|rImZ_(gW(gXXJpAb+2Rr&^h{Ad1YEe>4EEsvA zv)rfyw%b!`Xk1R?yaRO!v<9}aqd^R-EXKz-Xx*KEWj%-u{z2U7h)c3YC+^BD9vKx? zY1P1)4J)nDxy3i(0&2BLgh{-ucm$2QChoEo-y18f;>=cEY1M^R2?4DJsaA>7N;1&V z*C1LApw-~UR?fB7>r}I=q}d3w*>yA<#W$pqWq>m0JM~r5xnWD$d4IqEFick&9C8^g zm+rR~*xL|IP?}ymnC&?`ia*)WbyH=+ibvRI{z<0FUgA_!CYUGH{X^MjVXn%~D050; zQ#=D&VGwdZs8GwOP~ZFu(o4-?RGFbW9j)0plC>~K%3k2Tm_hB$$_?@ft{+H;^rD*C zTN(>qU37w-|MMBX`~*+Hh=CiJe}=bR*$m?cwoPU@LuR-vy?6+dd#B9sozcd1!J(av z>KnCLq^=)6Udwj=My8PD%wn~`rXuDPmY*WO%#TdGg>Y!FDEYD15$EVS=A;0r9F~0^ zQD3e*+Hg{pTUHlIrAkUZz8dUpE4RV#(!zh!eP0whrcnq%dmV%2vHsG$H}Xnf*HP#4 zvg(MSpgA?fCRdf!MYxUUmx}?yaVw~~URAFEL5BH(jxm|3LJ9tmonJ8a3xvuiTxy*eoHw??oT2F0FXSj)dk>`w* zn{lwZd95+$X06MOnOwyxgyTzBqNS=lj!5+hdAfaO)^U629#7k~@E`8enI)XM_fVnt z8xlA6mcBB4O?&&BdR{l)y;Yhh12Zl+1HH@6SY2Z+vIK)n^CH&_w(QV z&6okwZ3uF@6>bL~C`*lmR z=eGX4zkSWxEC~H8`n9bZZK16+-1h0DGzm1P3X?=rd8?A5AQbUrD8RKt(aY`0hcf97=d`!I5 zr)$NFg!W$#x^1^Lt_6B43}kzt3ki}>cqI#+i4c488`JCldQBfx0mslmpIXfWFYo}Z zC62z@vzs=<>N85F#SSaYwWeGjrI#cM<}3U%kHnP?d2tBzd2NlaZqYinnrA-fS@De# z^K&hB_AfZsrxF40>+2WvRi74Z$x|5~LwVJB-xFiGLvN0*lqrnn`dF^R-S8xp9I5tm zx`iiEHNjU2=Zdsev>E1mHu4*zA51e-Lj`pbEhGe8B{?x=;tJ@nV0{sPgB+9C zA3wLKjgebatv`B8S$(;a^09?gj%(Ex$xW$VFc=j_tutKVjH+4ekk2E_JQ1#1o!H(v zWwT^(q2;`L@{?@hp^Zav_=b{t(ztiBHad8+v2L<G zPAIW1-aULnE$E{j42&RH4y%Mh)G5v_+^&ozig_h(=eO6kD%FK-KRKC!;Ym_rI-kG5j z;|iAiD#$USV9DJ1NIAi~<12~MCkAEAY;>c+Y7#9BD!t4`qHJAX z=a!ctiQtGaE*EVWKeLoS^&jBNg*CI|ki-wl8>M|m8_WZorOHK%YleAmg0ysPO_Hec z#+pLLrdE+HGgBw3i5KB@0`rZx)hpN11uma@VL2Zxz-IU4NeOf2EK2q|_~&Lc(d0hZD%ml&VsI*B%l?|FDP0GsR6{ zuLIQWu9Z_VR6rY4*6d&R6%^-|R-S1epx-avXg)z##V^Ra1x8bgUzG<1B<&Th4>%02 za4~czBVFf`k>;9~}LS_4K+#<5W1l$BB&Rv$FY7Qxrrx>S@ z6;f|kqC#K!286m1q`E4GX_-_E)?LRY43=nEc1myFp&p-^tNn=v*?YJ}_ zaC9tK8hlq!o)lSHiUrg?ajv&TLuHo!LXFawmM^Vx?@@M^UA!)hHWYTUix_5Z{&@8Rp_^smC;uha3OaM)s-AE7^OwY zp`KH70G^RKKjxhVoti2crh>G*o73Gl%*7C~EF%k<(`Nv8tF_GvEq4-iau@z;R$2q^ zj+W9#&C*&g@y^)T;n9cM^VI8+&spWv+r`!{(3T+37bl!v64y7%A`9A6r4_bFWITzL zz-G(8c$r~jx<|jCBI59Ol4k%v!}a24_`JUPI_qMNu)_kRE$z$8o~N6}$N+*+=~P7q zL{*DyxXNQfztq)Nn z=`;eZ6+1!pz1RuFC3E_5+sH*s={0<~xCuVbvkXRDSn*(Nz3O+$u~{5>Ic@hV9cqbL zxt3NEwfhvm%H(1lh%Oro4+~k13edVxeA;*WdG!wJ&Ok6i+j!o9DyC&360@>!}(q@pikt5s4x72h%&_k!P`r8`oGt8L0`@`f`gSQUzIu zOO^uxYZ8zot0+*rB|nk|M2(z(t5=M@OMW;?`h~~oEyOWM+{dMs!@B+6c=6?MZ^`Jd zE6u%e`j_mHtw!(J+Mu!D$+loC2xSE|{O)6ZW~NnsxnZ6bpqyCQgMGTSyTwOv{pna0;(K10vb^k3aPE+dN|hc6PAB!6x>P3 z1}fLw$`z@AOEB?qU6kwriGNP`+)Vct&*Wah7LB)aj7v`jXH4Pfqq)S2DK0hL{Q=Ea zbfSZF_dB-YXADYWdj+? z%gr&`+>fYHG0?PZJR`4?1*=R;K-h9_2F}9Vk&dv!?e~UNq|FURLYzAyZH^;qW!fB{ zF~J>KaNnFDcbTIlaGuxVU%}omch%6nSZ{u)sXJA(a^hY1FkD;Xh^$y)WiW(~PrS=Y zoHXY$vFe;4Gn1zqP`EcwuUH}MF7I+qyi467C^^>53=o#bW4^l+@2U^AI3jSrzQN)R zm!B?VBZa6i(uIrYsFi$DPTe>@m7|%{mV(nv(^%LXNAL`91YsAlOc)zv zac%BT?PWh0YvyPL!DU9wT&+(pSsQV*OwiZvwd%H-Vsp9b%Pd5ulItTuwy|;BT)ddR zOxM%v>dQ1o3??*i{&5?$T4vm_g?&DeEuzD#qxWD&7(0{`r^bNEX^IJxvN}96P~x|g)YV*DQ`2i z*yZPpg}>5P4d1>f3>-Ypyed<$Jzu#QLhQU(5u7lCQ78DGfe!4>C3Dgipo~eM zauAg8TB6qvUQ-7Mm&nZ%xQ7A?e0U^e8*TW6o9-w$hA45_DyEPmUuQ2d3UGF)9hhpvM+! zN&VBrY*CHZPRtBaudsSu>7Q6bLN&czZN*(;ykXL-K#f7HOTQuJYE);lQCzfr2UA&WGZhmepsOOSb$d! zSRMJA^A|$w*?|jj@##7LWdo8+*@x*V`}I}hgrX-OSa6@hFQk!N01VebyBhLm%k`N^ zD~qQY8y3Rak75LZVxuP5Vei2Eaf)&4#X8!^x&q%;&0!|-^5hEUpDL#z=~!a8COMWL z_jAx>J&_%Gp>Tow70x+haka+{RU{ih-PYo+cW4u=f07Wq z$_G^pD6`>dx1Q)aw#+{*yaC;Tr&zUMWGg(}7c7;39cPA!C;YB9C~Y**xednIqpw>b zE|*B@R{hDX{49%Jty9qKw)R`PdWP`rB%lwz&u6HhG+bQ*sGlGOAl3N6C<(LH$aM_JGSozG9 ziacU3lS+wG{n`l6*K}tLGko0rHvQS{WuJ%lj9T;cSXM7a(~HD`pZc%|(kg8+VH^j^ z!C-MNHJc1De@2-<_<+*$4)S+O`3v0ks5_f{A|J+%3K?A6BG<~48+J^h{A9)?eVs-Q zv`I08p=5h~k7J>h>KV6@wkN4ZPd;gOAXgzPx0RdE4=|q}oGT-`n}Jo>Vt%Fm&JUJL zVEclf)%_+^t@d-J44vnx*=2dDievKnLuG(g!jp|3^0lr*QSm;M#Pp2OH``iG&80lW zA{wilHvRo+_QANY^eh9ZATnDSH!adShO73*yhS8ZP*+8=B|=Ps4Rchw9+^JIYRQQS zlOJ0QTZ7~e9L|avWqw4Q{K$R%HpTED7$5Xq!a~h3R>=5etC7}65@t;~!mlqW&;X&e zk}0S!aGg!jH0;K7Hz_7cf_*4Q$3Wlqem!~@_u$WFFlil$ zgI}nkto#G!MtLPTtzc=)UBG;1%sfZ8g3XyMXi#2zs@um(a>JN~&+B>bKYu)L|IqDT z=Q}S4%jTG0xZTmJ5Mg*N3JcruwB=FA0ztvB05S4fje6T1(~84la?_w}xH8CvPI5sQ zki@Zi^4yrj1zmij2i~{k>$K>s9w~lOA|O@TA#)l==@om)mL==sjInz=sBg9dD(}b* z@*t@7vHM5fTRocBO%gH2EUf;#;27I_M_Q{)PU;Gd&Tq9tK6RmgXCJ@cHx3cJ!|g<; z>B+|z$;SB_&^j(d$P_5ceh65grX^wc-P+fXQ=gihLn)&oaf-sQq5d*fEYW86u3I1+ zqI?7K$HEH2j0txZ>}cVtJy$#yYY9HthUGpjsh7P(Z59XOz9pE~iQub(s^#~zz%RCD zW7>UM4`Pyv?$Z`ty`q)?JjuC*wtkQ2&QBT|hJ9%*o~Ko;kTCS%)RixZjs{Vr6+aCP zsUuzzUr1x{QZ3h+KGS~Au-vbu zYl`>G9O*J{yI;GBuX^cztwYMIgA+-E)stCpUBwaL9IQ!JEQ>8TikQg(a+d@N!SgUm zq)eW>^lyp=TVQuq8o|r74jp3OKG)!Fn^Cex1a@Br56_W*7(U}NcrsC2hk5R5De~D3n#a1y_;4ABiP&@t5gyt^i5gTz`A`b3VM&DU zh(KvoKJsXdgydN%gWw*0O;;_bm-5~0>qwkWo_)P9arajJQAlQAY6(FW%az`6u)Bs> zVj;4Wez%bfzGq&0;diAji9V=uNo<~RuTyJnm-l!(yb`?9bhPJ3y-eTmnYKXlB~Vnf zF+P52cu>ih)70T|eUyNv+^6!h>W@|EgAN!com#T<8D&vay28}Fd8pPR{;Jk^78Cu@ zQw)ZncnS{OHUT5ouBX+ljDpRB1ca?_sh;!NinAOm?)0D@mnVeL=_^k109(e<-cB%#K>7x#PLSvNR>8)R z$KasG5;^bM{CGl8P$-;9?RppM`bH3^`1^YLaZ|l#K{uh&it}il&Pcp*2zBP^U*xo< z5dYTqjYrCMzwH@@dnM@$pb1k>5boZdFA9H}I-x#|A8n_XdNU~hbbmb7k1gzrsq72? zT^z%fn@#%2gK6}C>JZ|^PRW(|#&p6|O~s+vhO{sBRKb-c79up|xGICopp1>nwT^w3 zeGwicaUIi+gCt~?;lGk{B--i4M3GY*iCjM(WPHC|>m2iPuw;}h*gT8*3(D(LSZe%o zh4!<%{>)B7elP_{AC1ddC*Jlz5!1@)0?-VG2>sU zHS`02FEWtM6zWMOnWS$xA~Lz(@%$BsJNH4U4s1AA;$ywblb&ciw^AG8T;QJvM~?b( zH3un&?{AIvtip9XxPL|Hw$OtqA1)i|zi_<&x1oo<{ZbAujZS%Q8EE2MegtpM3vnN& zp3H~NXbMC`>&d6`+nQHDOxfv(vKHSK#B{d6KzCdv>4bR}mq_PIUMQ}T^Tla$245+vH{zz;ZyUIqmW zEh1p`0u=BmTZuh$9ts$B11R8yKV2CLcs1|xC_raiKLQ2x3iqLa-oL*L3TVmA3s68J zBMCqO%jMKW0aM4BD4@;V7ova%yiJ?@LKHCatERi>p@1Ir--H4lpL#_ofI%5&AJjVa z$@%QcP{8OFmqY<~UI7Z2PKmJq6!6r-CKOOO|v0t~PS43K}t7@*e`VE|)ILaX*p%s3M)#da+)p@3;IM1!6H zTDFP|2tN`3MO!gce1)B2y%j$X3G3*)_<23)B>O$}aX14)@Kw^1GyIZV8N{;_>`M|F zk;(D2)01nsGZ%+maO|S)>H44@ON@wL<4PnAyzLclAcyb<@@9R*rzUG4CyF%~Sb7h2 z#Y#`3s3ek2c!N~^v29W(dPzcFR~Y$D@VZi$D2FU#$)5a3A(8r&SDy#DyEdvsG>m}k zWBi?!n40%17>Cz?f7U5z<94Wu`zc;zat@K#gEp4@PN9vl1si>w0}2kyCYRzI@NxOn zWE@7j=7Tjh`WT0JbL8+1Z8_rYqieZc*MbwbE0AqC!MjqCA==w5P?k9En|wokLy!^m z8?8%=Q;&c&HX39G>EL{yW0}lezoIks=1xMI6n_x^TfU(MCcO_#G!dVaE@)zp zr*^iWiPJ*3zbAXR;uI!)Djeb_#jJ=G)|>8XfK!lE+$F6e>H=>Hr=aqG_B?fj$=wRg z-6J&ju3MzGM?e>F38X`ra*nu6;SWYnVW1LuC26|@mZY_w9DemNAG$aVKlGXc4}b;0 z;B=E(dil0qWKKbgN~Trhz=u|8?K}9Ghm9ulkVIbPMArVaG4Hq9wHfcL*|uE6JE^GQ zn_I<0G)?Ug+?N6n$O3YT`FV(+Pa>nT;((3OC0h5;w>`fzeo>`v@W#oUz7&f~Kkqf+&?z;)6N*aZRS?SS*{e4W9nn)7CLM@l5397%6> zG3U7VDrvjOBKLF-EAv}2wmi`epO6RS&i;I~vdO0#?-;MF*4pdr2*0J6s=gD9WFw;E z5Wb%M;`7nVi~viMXmgmwAHf-Kl_sgF}_l3)8u zAGV-ow_ph{2v|aPxt*#{jCr5i%n}F=0biu@SHb{bLl^Z#v>5dMl9)VQ4h}DAn-{}w zXtf}6=ytG1BOY;@$6OjL3*kp3auOtO8~E+#K1A}BES}Z%NdPk0x1=we>2`8Evj8V$ z_GL_U`E7wkm!J}TYUxQVySe(*(>|;sQO7USHzS>uI3aJoAeR1*D&%oTbG))V6})o% zVRdU<0A68Gg(hM_eE?z+T0bTH6sFro%+l5T6u(3w_b1K~)M6Z6qqS>q;u27aC?8E! za_1QzD!J>SCRCEeu|g%abgtgjQQ%H8_zwRCm%MERlkn}|coB;%!~gg*6Or69lY~qt z4rO2!eoV5p)88oQA6lj<#%f0Gt9gktLVU>m%5t$4T9CZ3K{$ zT)qHYnY?9DYw4$I0flvv59Wt8M=*UsFukBsTkumI#EVOfvQ^qJXG_F4`T@}pfc`rc zT_#>3nx={W6JlThqB%0V3DIo1Q4q~DzG(BLTEB!K}mt&;-JZ=hJw> z7^3%;HsBujGfn_d8p|~r$}_Z-RCad_R_N$U!S*(N>Q`RTS8wzQHe}B--^t{DtWRw? zsb`-%4`<2naflJ&<{^t5p7!A^nfbB)ablirKF~cf(4WabC28o?DqiZ6m&!7|&8ncY zln|B}bcz zel5sx#AZ41?rm7sds=I{py-73|Prf`U5c>3fuJr_v^wqaj)nV$anplp$kSh zPhIn`Z;Zo_LAhQnzKp2$7&k8v)n1v^OjL{Jy*^RxvyrB#_9VF|{mFcvr_ZTFZ5Dtc`(dMJk1BmmbVewf=pDg0wq^>Q zDxX4!;Dt>0+oY87xH=0aQ3#TzqS_YR;^eM8t=ds{SfR(i4HW(YlljzoR6cf}&IhJ~ zJ+VEbxyq-DQu#DO2%av26|cc(g&vq-nQ-Dt6-P(Vo;gr+NOBU%i*Y>>#Q3qX@^{+J zPBT-xf7%`M{S)mNWJfbZEwZ(E{vQvv_phL090^tJsE4j^x_aE+|64mMqG7aNYO$jv zidKuEF|m0>_Z}u27LPc&wR0K0!P~X--TIJA4rl8OQ(F{)lGyuIpt|UaWJMpx_mj}n z@T)_$VF9{iLW$1P8eJSs8E1a44Y~clKuu?7TpBfr$ar1eD7d^4#_B(kEY~M0u2rJq zTS`=vNOYMUP$;T3rDfj9{`aA+)lYHDloh)V2W_n(s+wCF1#bmtnKwOnzLt6Pk>-luWDT`ECGaLUQz>t!#z1x*ZI-*$i#T%bL)Z({=@D>n~<+nP{TR@xP!tV++Aj_0AQ)fb?w zN*~HPO`5D`DC9;Z>QL>)Yz1xWxC`c z18qvh87W{8qi&H91v0Voa_H^I!T|I}Aw?g0%MU)AhHiM|E7( z##%CNvodDvtNmLL5!8hw9|8Y|4<~I0j0#4;)k?KO@ySjX&*yD=jB_U zqKm*{toV%wPT`EYh@U=#yQK1wIfdoC<|j@ePyX~7#P#<|r|>||#i!8IqaQN}t8u{; zzN=qi3IW0A88#s3?BO|o0YRCEExwB{#R3Ykr@pr)>3MtuHyfaRIji_x=1&&Y#qbE61Gdd;hi<{P+LIzV`#IGXQmFUL19PmfdVN z8&RicXm9_%hdFPCJ3o%R_{I;M!NDKP3_1ge&ySeG`o<~z;=h_f=TAqS{we&=Gx!`V z=EaDQ=VW3_+3c3qSMLiqI_}bXb+?m#@%-6bf@@GCB{H1PX(K{sB@Q+=JO}$?x&a^% zBPo5RKX?;ryIg%B;d-p1LftTB!&sG|dS%J!=cxkY%7g2^JVPM5{g- z9oF3k31!3mP@lAw&T8{x^yKgJTOd5wc+ngty`#KD_vPaCQmx;*SIG-AP`;E0v_GTT zZ&&SisrEbcK}VLf&WjZNli3$(W)3Wg%xfvVi{I&X8A|xOeH5Fy9jgmH6R5`!$XTYc)6eLyYKJo z?SVX&t~;gY(>zh;*(6u=X>uZoY{Wrw%6A-OfA5{e2QTW&JS<9-!R(OcC1wY5Vm`mr z_q_LN88qWm1K%!ff5EMQf!C;kXG;65fbohdPNs&5RV$5MgQ-kvjGjw5a(|3`X(f-B zas&AA_Tsma|IJe)_3v6w1z_|4p~V>m&uQ0~;P&?m!R=N*xUqUEN8DRXfYb4{RNw{~ z@H;*wNXxtIh!afEp znF(vrT>J^Jb^u06KxLQi^x>xpxpGNZJ0tk*`vClA_&R8WwFiCAUj)|Xa4TToCanG3 zY=2w~yQhugFKHdFIS--vfzNRPh;?m_)~kTZ~;V zlOto>b^#B_-_)a4eNvg8^qtsGYBBUj;$S5Jaut@8FY*(>mW)*bzo#DbCUWht{@`4R zH%Z!8H(UMU3F5ymRPF;4geFP);YrG_SDPQpbKZPnviHzdf-MZ^E83Wl*SZ>8UeVI7 z?>0__G?j5uR!3XH| zfV_q+Q10nZV=f$_t#l?9vMrwW@y3u>wUtKctJ-kq9&ds@g-T*O?E3hf-dK+BCvWUd zZ!3EWb#mpZM1HJFES1eWc`s#F^#>2Jp=Bc%a1GUns7*<2xP|RHdSwN+Rg-%mRa+)} zi`w9+1W)Rdd+ivDy_8-~Wp?(bx}{4(5~Qd!MY_E}j$yX6kmu?S$>t2Yqgw zeoY%RU~*@fzwOAy{gh?>J>4~1)~}JSRM%y5&fHEpX-s~dQ2Gtm8%ti-y7bp4x6asR zF0SHOUhHHp?p0iDwzv;>GRj`pMzy_#2C^Pv0ANYVJho1TWvzDAP0_v^JN-9)=qT*w zG(KrBBIbUt4c>F~;;k}L5&})$BP*?#jdy4mu+s0TmEPRZcyz6{ENYLv{}I$=>eGyF z>+mB%vGE=tX#d6c1mXh5j?8x*j3)^O<>{$pf9PoC^OxbDI$L{mSa3GiV zc_X;Vr2`iL$3u7-pAQ@uDp(!?2={?Zli3hYTs>`{(_DMS4o^KwO1;GqvV^C-q!lfd zVCtGWS8cF8vP#DO9fngj>KGD5#1E-v zGLZLWAmyZ7GY3+x_$CGdM2d^LiB5c@04Cchpxn(U1f5K+Q9${w(foyqfRc z;l<0h-0adGSuU5Vc&`biJZ1?`>0qpULrc;BIYuC(R1nZk(zX~8Z&P#f#2a7-U^K2Q z07ma?Z^CFO7n{N8?d^>r8?n)+ukVH0HA)@&b-lxg?7n>^8s~isUJ`k zN>Uv3(=-eKR1+nwZYO{`+8DD@`&qQT|A8iW-J#%hh*FVA!bpN>6&iY1cP#}C5mrv7 z3=V+9_%C94U9xupMF`4_fn{0`NzFH|Z%= z_rt@$pPyqF>w}_?nG68Ea{GkwyG?MU&$7it+&Ibyr0bbg`lMd>(5bwpPQUd_2KPBs z`wKnk6FrF{={e7+%o)JZBkDj;-n9U4%$fxe)E{oo_lYCWAf6D(P-^T=6ItjzHHw{{ zYZBoBKwG8Ugi9GvTIUq)5G{zr%6VU!%qhDV`z&y@iB|=3o*C->%J!Xl+V0*zGbfC*SF>Arqc79 z#x|cC@04pjV-KxUoBSy2R_pD`qP8wxXGCt%CK@xgXdU9;U={FOQY-Qgjujg>Shj5I zeyxp1wrJN*{E&qa-tuaCGI{+PcsmGz(DG`1^1%B?aAWe`{2uVyimY#AdV~m0E%o}S zy6;RF`>iaP(P^tT`_3)$m6Pj*>C>lzu(qDmZ`;Bl+*Tp|v|IX_ z)OPt7g4z}5en?OLfYKwZPnHne_sy--E~AxkM+HV|m^uByFtw8NMo*wmMWqKmJ6z#h zQ7OUqn4BIf^YO_n@TjohKrG}`vHMjh#bDEWKy3~QXLji&gx?oofGMn(j%vQn7^n9; zL09Zpvnvty56iZC8@`fh_)cx8Gg%O3()}nc8sKwUAN2JSJ&)iA-iX7WwEV%CU#Yco zz5@UNDF`JHR{Ei~vJbRUbkx$W1AVC5n zFD6#;5U~G*IsiO`ZojAKwh1OjO)%;5s(SKm;kJy3Dy_9;SPUE$uu=vPo%$C*lu)Jh z92n%k3Ks}g77&&XSk#M8UX&o>0F-|!$fMHpuEm&NrM2t2nui$*Q4W(U^vUP&y_;64 zPn9tCQqNy3#?w_=pQvEkD3sf7-7CiaD((7E*3{^>T^kaDq;SJ_ty}*uVeHlFf6Rfo zq_R!h^@|WBnS63VNAeb%Q)N85UF&E3u0o3pe$m*uUAqc4Kj}Rd4OQ{v_?w3M8F!Yi z%FAQTIDH|@+fib`-?HhqzAVtR%`eR5<7x{dg`arRmdkDOZGagJu*td~^%_s?&^j3n zJG9=Tn?SBMzl{imf^2vC0R^Br3!E%$4kzy~vE-3_KDow7-KoXJ3D>k+aQ|-h)+fLU zn{KQA;3;GNPHm{OVKCDTh`a}W-qJ#?DqQk0@r@Ne?mT!<|J_$T4TOc+^j5_W0boTG)9q0JV6I4h4c zgi1y=jj>PN?&;z0!uvP*tVQum#G<%n(9;lQzNOUrpdg-7UZ92%2t_g+1x93j;x(<-Y=wAxhD9YY$7`>QaR`(C%@GkAX&`16eZsfd8&I^QhfCL#)PePqg zchy!#$bo(3dIl0i=G)>&RM>#~G;&}989IdLr6v|YZOK`$>5rAk(Wv#- z{@bkmzabhRE*Q6h^psDS%Y6bm2lOoHa!$Lu86Pe!kEkyz+@1%4yL-2iS#S<-Ckz6H z3RZNQq%50W!Tj-7=U6p)=*`r&UcXQ%{sqL470VU4HvYi*pLGk*nUAdT9Qme)2~=teJebHnQH zkZw9q&Pq&@^k&rQ!bJ$Jv8U@nYA%_tWb7ih?PdO|Wsg>KvQs7%J=PQ{H=ex*mR~MZ z$e(g@5iICsUdfJ=OW9niSkM+%NR|Z;7#shJ6Q?|Mia*m%zcN0p9v_?S4gT@_Z~6;xAL@0RH2ey-4kgZ!E~JH zFW7X@ap6#p@Osxqn7>|k4H%1c6umYdt!h3{vO^wJzb~o~5o7RPtxN6=%#!4pmepsR7XI18m{IzEuTEmBSQJ?+ z38*WD-Jaaw)flR*ghUz0sDKsU5P=X>wv5tauLG<27K)iLe)GQ8F=M}H+S>{tT=0~e z{6D)rmUpGvYO-uCw|uxjK$+APysg4Zfcf+amRUT{+(!4KTDy^Y(SFiroiY>R1O+7k z;oG=ynNh9rkVe8c8s~n`KX>uIkr8^~eLQ9@j(9b=ZXriQ57jy3!lidX`a6_K*rYZd z^Fv+;bN(Eo89C(;+1f`qGSRr8m+n8vDrbjxl;3oH%KQ9rW*<=-M(}`4@NRDk=gRt= z9mY3g$A58_)=UA?zoe10*h%Y=(|W&oH5+)BjI3&NW$%|EOklO%V2cNB(D-9rkGHZQ zH5o=s7mcG>N!Jt;g_{^!LMK*GAp|DgdL*%c)|?88)|0@{{1wE!d}}Q?%(!uD&aL<| z;Fj>ysKSY=K&n96pLRif3kXxa^Ac3S>i$ybf%{}5aades5{LhiDmZ;);R};2G^Yw_ zZ1bFU%f6RoYoZFh+}q%+L|uS3*r(4YPAe~2nPc^*}GD1a*5$tLkpg&y&Kst{)$ zK^4wn`Sw$VV*vgIRN-%SMHQx&*aNA8psdmDdG>s&a6QR?{ZygHcVUVu+@h$$cpho3 za|xb?j3fY+5QhDK@ezj8rv>&J3B&yduaqzh-ur)=Fr57OqJ-i3%8MgzlQ49u`5zO8 zYZ+AlVK`m!6A8ok>K{iK`q#@UXNUKc-zz2z_21I^0>V&hUj6@zFqpoT@)r`3S!^dL z7&75cLGEEMAsEDzM+B*S0)o8Lksy3RLL(7?8aY9nmS>b;(a20&UR0bp=cce=aeod~ zIG9;Hqgvz1|%miEk?h z5Qjaqnj-F2*+=9Q)*|K!vTjZIko3fZ{@IKo%%hN(KZ{^@|F;l;@Z#8HN%T z>gjpf32y{niE^&gloKSzQ21+J{(FRdY`z40QIVNL5*Y=7o$nels z4R44y>JMu@L;h}6m_Ks0)r_BR-96q&J)*_Ux#2~H?qrdor z$d;DyC~hqv{Xr#WGqM&eiO35V83A9620Frbc9UZqr`=cLr}loQ69 zgSh>WidC%--U0&oYLb1j0>|(ACtOW-W@3UYgy-trmmmwB)%)AYLoQ*uD_l?UH>hqf zJzt#ncbd$>$^a zsX^-cpejNfvCPFFCwTc36V@AFG!*S?vMF&H33Xa*SS_|VdnIG>L6L_S# zn6;6XT)g;hVVs`v2rB-kMdkxCB_10KgxbzZ=n%~nozPKEyUza>K*|npE5C}Ypmsqs zDy{kaohBM#8}0F?aqbs7^qfMoLyAi2I5ud`JMa;D(C{ zA%fLox&$+Qu~H%2FNKJt!3Y)}MAAbfv~g66>{7b7#Lc{^n0 z#D*p^^SnuBoNL7S2vlnd8@vIf4P-`OgsZ$u&Rc5tVk)}Z_I(;7Lv2&uW{%gd3PiQHutO-K_`(+z{&o{P&P z;@|4I%nMQf7eyHWQ{k*%zBRU&Gdx~i7XH6uXdIy4cW zK|h4ZJ1vR;Iay`W13-bKHz43YP@v;#Pe6fW()FUJE=7SZAV31+W;PYHsZCpI*!dLb z*v?B*AQ_=-lm86`y5T$uloCLJ{%BI5@1mPgp!eGwf2)Q96!Uzt+o7{x zdt8>KpWxP}W$FFbCYluDHEGfWW*usu!78-=>hmxdg{hT@92*}oMUEaHat)&6(?zKx zAwMUYlb;?=bA}(0WfbHs3&d<;gfZ1s9A7|!WGOsfZvT-aXoxK31?neflm1CaP~+>H zXh$;=l=Q&`BuJ*oM}n4Y@{yp6bkmFk4Po#m3F>ww$|+~wUChU8zR?K@nkfj-WEU_Our~80c#and`%(e3rLbuA76|l zHQPUd+eb)JI7KxC@5|H8Ns`*%7m%bAp9yefhu6t(07>%iwabts)uE82f2uwLNYWq8 zP76)0)6|DGk)#<6?P8?JPl=q(6=Fh)#1K--WPvx&(}mxr`^lN>dgP6ql^R*l5ya<-GOE6|W-xI1Ju+D)>W*-g5zU3{M&Cx1O~fqpD@d?vnh$V)e@ zZB&vqdz3ozB5Xx%^OLA6p-`Al-o?t%%zUzy3%(g^_5z<#=L>93J}p@+DOS{&e*bzy zLx$K;mhfzbvY{;C2pfu+QZBP2tXqGas_esBS@7)ecjXs;S{YIPqYdSGX$_m*+=lX7 z^Xh-2Dsw6$%1^VQG^xt2oLHPsE1ZZqe}3_NVsYfB6N?}IvpwZ_fR+7bKe2eZ(aip` zA{J+T_LSztB2C<6+YMxVfy81Q#KKub$ym@GDaOP4jX{PQsV zUDC|*lzBHN-jIVUq#-$E?%woxGa~YX)07MuF)4+P5ma?Fn)4KvV3{U0U` z3-(=_G}vFhIOg_|h76Qgru6bZA`Nd~bvmCk7%%-q(y*-b$B~BLzb6Zx9sXPSy<*aE zhqS(cG>kW|{x_sy%zsZBjB}^8(av9tk;>|6+OWOW^|n^RZd7^Rek?3#4KZML*VY6j zc#t^2^+f^|lc{N`NomLyp7(f;HaAQ#Pj~oEQ_a(jzSF_x>5J;r-f)Qt9$$Y?Imu6oZHbd??$cs>k~G(n)_L-Fud}7+ z>l5EA1T~DpY&$)@JWLY$wRQ;%-d>XRB-1V2+a$@3S86X#Uq}3yNB`sZxUzh>{G$S1 z=t#^es&{m2YA7!*$#Q0}I-fqF=3GkQPA*M%e`|GpnyT`^p78c8I^^hJIDXLnKg!+& zKC0?${GTL~RW46lT?Ws9s!|0dCHq9x->GO1mw(f0RN1@jz1OHQuM1 zKU%Lt=LG}smc`jM+u2|V7=rIie-t3vXO~Ic;`6v^uRZuy6)v;5>lx?NC+5iQE_%~` z>-LP39i#Wg{54F9mvh85ZPRfMHD}@=DZ>cXjQ+)5EA?^Qo~=sIn<}CTGOhv1`<#y2 z1ESm0AKO^7G1YqgpXT3BvyXNiaUTMVm_I6RY^}L(oa|U5I!G=OjEKg}=P8k%FfPGp zpz%6zx(=knKVe8faR^YXo*u8!9D z@>T_Mz?hza#_W&695!vt_>dnfKVMBe;6WyU<)SbF$aPe|RBrVYpLhb7$Ns4e??r5; z-{28k6ln3I@qoSBy}`^)(ENke0AumwdbZ&=6-XI2zp*u@CW=*HKANBnHGlPDa<4)d z=0dKnxgO6w)s%p9q<3O*Co?_|chZet|5Pfvlh*(EBE-k1*R=p0T}_!0`hiyYlAe+ zShP|ixk~oyl~9@z&%EB^u*dmIf_Ox!CW&{-O;f~iqj{B6>z8rGlS)_sbFHrro3otS z=o_y1O6Kx@nQO4PSd2-d8Rx6ncox#3{9U#zS`77)KQzsNHQn01PFmO2rWOK4?-owY z>Ok6K>3ID&sSdMwlry_`^}0BT`!nf|O~`UU>Gay)nK{YYfU{OD5|Cy*5dop@c-p)+ zSvxm6Z8~`03_^{+{B5U91|h~b=0TmmWSn^amiO6r^4P)@g|y3+mZ4+(L*2_i5G@W7 z9Bz|R*xTYD%uO7Xz8lR$=u1h(aX-G38B5k&KJ1p%_-hdb(GlGV-5g^krfAnD{_?lx z4Jq1<&Ws}+9b%f_*W8t&4K}|?(fSUut)T;rcX}+au@8MKF)|)91^vD%F+MQ|+|X@6 zG@Lm~45{U-cZxVouh=Yp847t9lrshtlK~H>a*Mf($YNt>fGZBuq%?jV{91FM?xXh_ zt*m+L2FWeM6S*JpwcUaN#`QSGZaQ8vEycUB&FNkE34@d1UAWz!km$Oy(fQy7zF3K8 zOrT)*>>kSHSNvvm?RX=tF zrky1#RZ&`OTtl((c1Mc!$G_W4R>uEq?^@W^n$?TVUbSfXJOS#nmOgZ%!+L9@*_@^g z=IF5N&jL%9!M%*EYrU*B)*dcrsIHpih@`%nV7)%yF8H;X7;P9eck+~_alrf|toa0n zzS8P+#A@WLw`Tpjg~9`cT4f-s*NHM41g!ZQGPdR{zENA*7ITWGrL%t(S|W`g zD$@>Nr78(Qt?kxXTrk7M)b-0qAq!feVBmV$Xz;F1a1_d{s$4Bt-Sj@_c38jhs3d5T z0<8zzWY%ThfG_t3e~6Tm30cEomP!o30kP7vj$I8@gr0wE`5@eigjiSNVZO7u6z6(e zwU6E=H^WyDQzn-1lRyIij1^uQzR2z>GTc8I@~W+w10(Zd!j1 z3b+-442Fui#^AN3HiWqnlW~xFS|hwyapRI&feJj-y))R2!n1?!g2*rnnN+G^`^o~f zbX|I@bTt@)gRn0DOz|5mTqVTNP}lR)e)`{Ym9#zy0GcPdY3H4nZ7Bf#lih3^K)afp z4r{}RGav^>3RY%GcdgG^oBzUm;W*Kp^JGZOd%J5x`aeRPAVTta+ng*>(mdyEbq_vCTPR^)HJkG*L!KuCbIWIYX^_)-HQJ&Gg86TE1?DjJ=@N8(T%|g0<{a zGb0^B#(r5O*}4rXnZHiVDi*xuHazlHG|-Mp4< z%49-GLr25YeIVxS7(oEF64$#8<`Ute4Grc!{MDH zV7@MmD9K;h3X>I19Nk=!|Jp%WD(YlEEl>yh72l!>*XImOum%p{B-m)&!9`Kp&?U%rJ%y#l&i{uK~vmIRRN(5J$A1%ySI zBx@-g7v}^y_kBb1N@eI!{!c-_ES0d>UGt`8#R(8zsA9H!K~4HA@bJ$;D|WBJeXIfrw%ha z`lhC#t+banI?*E6ObQmsfdoM_VSEbZ_vb6-S_)-leA~K!65Erdr?n{dTjAo67D8*u z0Z+7UKktGSdGMDZqL_+MCL;MYj@!SFMAKNVtgVL>y)@nx^3Jm5upU7|@Ihq9*lV1# zI?kQRLT7CQ1k%;oY-Xj*!3$(CbE?<9;3jWmP{1%myc0c`!-{{&1RR@FA4N9KXPe9qJ?r3BVv0N!Wa`XpeqSqtBzoVw=lS(P=bKcrx$ z?O1_LT}LF%@*I*%j)ON#5Avz8=rlp|kfh21mt9x5IRD1%;3T7<_f2U$Zc8UZU4pD| zn;DxKo$g`I-o$ipU6IAtO|q`)Avy27=xYii3GgHZGcoioZ`XOoainHW%INK*545MM z#mD%du?R9K!UoUj9?ze+y}BdPgED^#RP(g<^|4~?N2uQ9pBdXf52A0=hZQ&{wpHb^s&I{s0O)DPK-?4W3Km-|A zVbdR4EE-JN9c~h}OGsUxS7Ic$8OR_tKX&MkHhUYYPoKjaZm8~%pIF0j`Po)|iXSHK zs_I>jp+V3rMi!g88d_0z8IH|i5LYl;{r*+$7Ma#!N&CF23g zc)g!?QS`S@0jD_}$UdSk+9e?4rXtK7fBT$-Yvg88aN=d9r^ylDQJ-+iR4RO2ZQhs5 zqQd)>gZjwt<$Tdzb-oD9t9X~oqgfj$4h2ZgZpC+ir)Ak8m9y-E`SQ!An%qEM_MUm~ z*;+vcIPfvb5fP=w9yHgStzFw=1x;Y19WLV@B$QbVaS0{bC83D6x;Xa0!9Zi_mk5(y zQoyAA%d4L|yH)vI^6TeLSWz6CZCQV4S4>Ot@75`m%f}^#AL)dvS4;l|Xhb@Hq(-F( zejI3ACE_rhFa1n7CTM=Evhz%#jm^x05dJI`Cly*G&>?^60qW(Lxk%7{@%XdO)~bZo zO`?gszor<*gnlw2nUQ0p7WpSa(#)z8w1bzb127U?P|kNrRF!0H>M8g;U+#l^-BS%P z@L|1x`du0KtrcF#8ud5T!p2a#w?MQoqvAn1derFawUf!A&?K^s}ufe`ypqSf9W9uCd3+vV0 zol8*u`r}j->3yvJYiW^Ni!L5V{Apt++oEu)sd7MHW_>;xVVhCWOQsG zOPZJa1AMygvyRQ)J=q>6RwkNkArY*6>4dQn#)=yi>} zNV&DLy7=y3k6ltm)~w9NrNZ74h*4oe0W>;{JU1iN1MOSurI1(dQ#|JrqZ<(`Gt$mA6 zbhLMmm(c5fDS3fi^6*qCx%Qj;rb*^mow@eB)zzMMY`DL<&&M^`9@9Hm8yij84TE-} z)Zvs!A3TnXM7-0H%a3kOTL&~8;qd`|{SwtBB}^?|@)XS#65;V1+fcr|jKu}8@73^> z!qN8Lokgka97t7|8_ud;Fo)pI%2Uhh?bbUND8#iS*{kyG^ ze>0yQqMbKn!h#bW$SBWl^yR-{*Wl!Yw9g)}*AlFx?dBIl(7{#gG}F(~`b9_Wjl)*2 zo17r+Q{v&3k-0SQEaGX}H8*VO{k$&spoKruodtfRhJ-%q8>Ge9f#6^ULTc zgi~nyS5mTp0V+6B0WS($w0y0bU?`zx_`fQZ47PQURu#(*7<@f;h~_3o7C<7?Q;)vv*P0%asDNt zJ=GebGN6`D-By1)kVxQjH5np3YUX>~wyT_C&1Lwz5{i!zBOtFKPvDk;TWB*F}G1{H?^WtY_{wrw-Mo`}T)rVau$N&4&#v zLRCC6BWNf>5xll!R(&k5p8@BkvX^0f;DX_2F=q{qlcH7KPMYb%v=IsQX2CG+y#D9E zisIpmx0Q;1|Cw~`SZ#dLTsTY{G-&F>jK>DioZG7N;nykE`MLa9&b}wj4a2m16PG<} zj{1c*qPG}=)NPMyv>^G;15O90Ym-mTPc>)%Lc7Xyz4wMd-Wjsh>@S9K17x;W9 zcPf?`KfulvK4F%8r=1ghLb%C5tYT>wN0aLmR2x50<=A5b(^~e9z_FNB3MKh#o79>= z{*_m3MO>a*#M!y9)o^~Z7)t!iTqMC_x=RC10TF!6A;L;J2o~_gMGbf%(uSMS;{|Dl2}^IEwYq)JZu}ZKrqj1ue>0b>E8bEb+XYYEB7}3^WdYbSCAuyj!9>|6kPR|U(4qf9JCs>hW4Bl}$!?B~Y+z=^1A?Ey zsI_7CsgCyRt1oqgCri~7#=h~CA+qvpsWVbNt6rEb5`Nk~Qt1T=KS+SRyq$)+uV#^eOTM4g_< z4-2TmzThHjQ>GfNQI4=1V6!RCEZs6E3%=ZxX=9Y$MlTjwFPfq~ZQ9bFI4ZSS4(=Ru zm@`wmWo2Kx5@eXRtn;cu?t6tBH@_Z^+Jf@VGrlb`#&4aQ$^d`FPPph0W;r2AtM!~O zij57Oa&26q2_2+YcL@OYOZU()WZoshN<>^$6|Nw3>ptiP0%&H18XD0WRD6t&diexp zE{*F-z`z%G(nF=&nJ%-X=p+cW8;Ibei#_C^2x zmzs-*YY*tPvzR=zVeG4aLf3D+ofo_Ziw3%ihju0n0aTbZ8+%)mx0>M*XlakmJS9_N zz$Vf&<67)3I7&aoGNOzjtRz|R=+?y~0qyS*MY$=GnotZrl(ulE9X(mJT1js^0>)Co zN0AY7_#6c0p;CYo3homi>_&K(?Ji)&TUqv+YXl~!M#0U$iJMMFe-og^zTt-CdG87+ zL!47mSBj#har62kX+z?BImCgp%m|Ihth$HSO#f_omOfyuoMO%y3Br`lwiC!VHJvEH znmgqbvjIn6lfXZ*2M0KUfXhL9uFmAN*X#fl&K8Hg4;-X96Lz0L#-H3hEStjDmfqmK zP84Y@oF9kT;50tr)IuTy#dJ7wvF=)?AZ4r&ycD;7dPvr!Yn;X&4pGDvP`NZxt!Sd> zvf3Oc&4OHQXu?MG=3MQn;r>4gG23aKV!>1+B2?)xFK{EZ2O?UY&7aEwoJMnhu6E8f z^>^EYdJQ>6!If)|s@x!GEMs!MDOwVnkCOfPT(445kzI|O?r+7^fhNf*i+1Pf4lCt5 zGkBraf85v4D`|c3k0+E+CVHwre1s%|N>$WST+Lk3brc~GEBB;{ijn0!dF1R=bNPi@ z-ay}$6CE`>`T-teUy0FT;JKt6l~~Od_f2h~?&i@8wcMoVXQi6wj?yj~G$}=Rh_RKk z6j#O;B_Op{Y?h86w3cl$7mU&#?cWdaS51o&&rG#kylWj}yIgEM9yCXc)&>up4NcO#d>X{0+?M@t+2h z&2L7t)&A-4IU`pu>zSmimnCJWTGDv?^HaQm(=y*4?WCp^&6WAjtYr6eL6+or{3U{d zt&dA$Q7z@XCp#mo+aTdHG7_NQ4qHo{zd<_P+PUDcmYY>$v>vX{e{~9_;^T+dR78tn z&M}`Iqun^PA5+)fpF4QZ$&R*v$$Gl>%d_;FO9^pCv|_PdKiV8IR=emIx9B;?Fo(?B z30K)Os$k&rgw@VP2zbes);uaU7mw9OO+|TU?M*w~(ar{`YM}Mpo027jW(NR~QJ9Q* z(#qxZLbRPz$qWE}p6RfF(p%PB-r1?L=G}e@>ugmHglCx*dea7JtPQ*JvFqZ9N9D9Vft|#^`Qw%xwl^H~M4P-yugk)@iEjaY z!duYMYU{q$qHta#C}aiiHOJ>^{c>LYp`*h}zf%bDF7$NP!WRYCn<@4HS<&*l*z~e? zJZ47owCuhfG=s2XSqr~Roaumwy^qxydL3)N`Es5%K@(PA{h8n7X%~3@5@J@#^>Ti9 z!1y*03$8{ee)^77R*n4_vdBf7GtEo$wZ4NxUS$0}bjcA;#p+@l$R@S|IkXfG|AsqK z&3XA+D1RK=jX)gDAA*v=+h1+Xcoi``=3i;)x4`)~^Z9TfwrClX#u`v268cW-y}QkB zmuP`L4=@XitLGov>~PF|3DqPgrbTRGwC*#1S)dKizW;#} z9VlU2AtfwiTY!7Bb&>ho0&URX5nTKW4i7!=DbC0zreik*UU!IhtD?2MP+^wnAbaf4fF9&#KUV|G)_A|IzN&Eer)a3rn07B*RYJ)ro5p)<(Wya=Aaw>hmVz# zGo>P~NLOl> zSSsa?gYxEZI7%Cn@A$1?b@C+fd`%|AW;OBLAexUj;m~BB*(;M(JWYv^%`|5UlIU<| zsY?zj$t6EH@tTcl?Xzs}8#3x%{oyVC(H+GdTU4C>a7%GVOM6DV694E!{^)2KT%+B) z@N+H#bchEtN1eLWR`+cjeUxs`!?sJWl^cVoXZ#Orl+x5;*J6XR@yq0r#-Z&O{s@6P zQj&C>^din2TD4Hy-%aTpo3H3BgkR6_lM%WgUe6QA?T73p0_l*Z4&vAR9*Er@Ym@hEt1x(u3 zW6cG+_0nrrfiyBbFe`J|9cOlbbeVQt|6}8l9oQM=tSzJ+;Pyco3~LSSYWwx(x0h*` zT**hQ>0TpU=Vz7Hx|uX|Xq%O{7OLAUTXG@kjI=b59v_VNBBMcN<*T`;Q0vvd?HaXr zF$bGYDKM~B$hBO63CzuoLhalTqs@%-|6K~8^V$7X0sj3q489nKB$v&1R5#gu<&$di zE}~J(o`K4r@k?!ez)g9KfUm>|Ly8xAu|xV$!6MQte^o71I4oW|@MjX&aEN!)w}e3W z^~^Us@qHVycZk!Q{76G2MVR->bRu0TBHV{0G|>qqgvEi+VQHC5-4a`rhA1qNPw)sn zDir;iTb~Lr^dajxBo3CEildvIkq~&hOtwlhCW<%h%td*uz1H3v)DFa=cbRd*6-Y&) zO)9s&tqR8gGceP<=W;DOCv44T`TH3N9)uuUFPGW7uo;KsZRuq5rOUPaZqvV&l_%rn zn^Vn%ceR1hvzb8|-5;|T^-$MfTJK`aOtZ_9Uu2UJ;NSyy)tN;$r4o8!_@66jTq-U0 zEh`VYWY_(d)|mU1j;cNPtdZm zg0%fHJbk5Z>8>k7TZkF5?&NqB;d1q z)B)@9R6vJPwr{|2yp{l!JAt4iZjUoljKVZ;tcX(v!r9=8+xk^JZSTMU!zGNrv9);P z!9=U3n1NiC(C$Pze1UZ8v|k%`*2@6P%E3BNoj5l~6=~-bb%b@qP}+!IEZO=85{vSe z!gTF40NE`=VFcY`v-)SmW_JD#5{0>BxhNcLR_XB~X5HskcCt#Tcme!T7T4+opYdaf z@hxgBxRfxfm0tHG>$mE{*o)}Gq@WFkT4KfY@;Ko53udwd%!*W2NCy?hDmIAHY^6Z$ z!dsZ^H_k_&RcY)44DSGjjbCL|f0|%Li-0S$t=q!SIy#<(Dz;~-B(JC>*^qc^k zezGK9$2p_pb$qf;H7a`S&p)Z78>y{qrkUWdGQ%~Vi`yvqH^f5ot?iIP>-$Dg0oW)b zMoWTJ;Bczo@QS+?4mT5}oB~YwiKe0uYafi)Yre+xe*C}6#Pqk#eEmwTEb+42P5mnE zf~4xjPV=&>w2L{1fYSdZ&kC`oUifv0Q9%UHB#YNLUJ?sFQG%6FtaKih#(`MyaKNY+ z#YWe0lV{{Dz6lWSp=^+)2pVLo@k(MZc_tB25_{bfkYD39k#uDmlqz%)aKDu5Ll zKSoKz$=DM4Y>h5roYsDsHY=%Sm#gq-OIoCxZ1C^0o;+KY!=m}P>Rs03SPNs7fKxTc z^u=x!(X+?wZrgmGYZ5r_5l)tnxDKxosY7Xj z5phBcI(+&~M}>_LHODq7EV7smY(Oz{l%D(`_2H3N_KUc*1T*9lQgKCp z7$&I~&Sp6S&yq>RMhX;tyg&M!6fH35z<0fLvQywtCZBthnOj-*7sKRZ*?@t+NOnZd zlbTlZnvu$Di(g4i#8te_qg2e-g0f5pcejsFMi`l;tGT1;k=LbLWi2iKR(e1%Gf4Vq zrdXe5`rnYpyF$}$NGoo{j*d{O>apu;r*zpxXIvLN+aQHxmR8GSWz7F5znl@`sjO5p z{VNCtU(##;K^FMVY8ey=SqbNZge$Z8&)aVkx-)cCX{v*rpjwaMus6TfBTR>Vm%OT8 zSdkeLx*FbrYGwewBrjx07!4I8OkIiRPWX_p^vQZ?`iYK${d!$3FACNn9M5gRieZWVMy$z3M);?3kM6XSU#U$Co|$E^)C zZ#RDZX9@4=7sfs$wr$PqJ z!7o9SGECk?>rjfZ^e$G))e=WoEV1c`no;80Tlym=bl^@Dq(TdRr}ZLxb!vP>liLRV zPz1Ugc5%vrwVlQCQq>>@+jBMoNXkS{i+6hpr=%*JLS+W`TNRYXhU_my^rDpA3MVL~ zmBy{6fM)9sL_%m}R0yPqXN;>Pg6;-+^Vh~vO1k5x%F|j^Cuayri=;SL9LAH-&IQ6rqJ=sU^U;BM|no8!p5Tz`=r~VC>dama}?<#$M}u4 zPKVHXPVIppor(mVJEW~kiqY~u1y}9xouKR-$*}za@bq0Q ziUg)&+pF+YRD0BVf_F95SaX_LSX)HY5^$K0@75vmR{~7$opG*G5_X9tZqj8F6z#n==m%%|^+q8#1 zvT~G{u%ZAvF)3wH8~KUAu35oO##$f%g_g1Qc_t^Yt$mF{uU*thAfx};G&%q0S55n0 zTDC%ZcH}-A{OHD;o^d=;b9!v&H8EH!;NBf z=|2pPVoN1Q$rrFH)g935E~g$yvZ$7#)~~KTBco3toL}Kky1MruOrXXM=`~fg$glS} zR6Lzm#R!>hTfyj>=CFCp!HdEP+t)vavI<7GOs2 zH?TQ~X52yIg`ZtMGc8y29|}2G17u2BlW>w2sHu8_0h7*C@IeCVq2+9|w9P1U1>eocrfORE(-Atp4T zpaIXrbhu77>vBp^q`RZm%N2^6Nvt&8W_W2+y)4fpw;78ivhc?0m0IFwt}tuLZG_m^ z?$mSqZc@oG3dyqmGTBDlU(Rf}kP5P9r3n|!e!@7$60olys#H5p6x3o}RC7?lc2JG7 z2SuM&y*_#y24@bbBtbFGF+mMJ`O05%IR-9&LMDL1_Vxz)5cXFE7M^u;Ue!^rX?mWa6d-xi1SkUU0JiJ?U>uf?AS(qBgQpbvue9{=yO z_{Z6Cp%(L@8@1kC$Tn{wo*`wc33)uDy1LpC3zo1gfG}X}z$88XsX0T`B(dNm??QYT zcR;zHus=%>QGS0cc%6zML(D%l7KF+17si4iV}}}0D&Y%p<50QJhy}}ivAbM>82pOc zx>xq{Xt1>+qvlP5sUh_QiB}alj|~~A&fc8#*U@oM3)U1E&*15b(IFU2Z~54N0h9a z-cmLh$(K>D-`M3hiY8HRv2i_WTu5auGEq4d0t3#y*SEP=|#zjL1| zBx9@mNLW|8 z&)7w;-0-!0F!ozoPd4q1;G^=5NOm@TqM@Vakn$R954f@ondp+Fpt%$yiQ<=1k;E=8 zRvrZ`Ig%{D3Jt^!hf0j9d9=|LSsccxJ-68@@AMT)#sFrwJ}1f)-F4S;@yd^|@&=EO z?Or3X0Egyytk|oCkQ+k6$1vmg)XFENNhlYo)K&2|Lmrj9A{0@YI+H5dN%*tu!6!O% z@20SdrzA7C&C9Xc&b(z+d=ilf7yoDK6>%%G;_ucKuy)GZG9dIBo2=A*V!JUBE2-$J zqA``RgyNc_Kw_~`REP-W^UOeoVpUXc!De0pY4R4E=OSHUmbasbXXV( zUWgKYB>tD|f&Y>{YUdXzO|m20`JYgQDf!2!dXyIbtT_6fykM@=!F*&_wY>tA>>K`5cAiuH>&JpqD{jL_iLyoWUmuNyc(eM|=jAz0Lm?B6kS= zBO)_s@$i4$_6URys);m+pzbjIeUwEG&EF=JESD^>NxaIe&*2SO1)P@op{#WPmIA{( zo+Y07)`ZJd-?uRvewr6%F`jpHbUT1_3m{cZ6rc+FSt+Nzifl|*HUER|ii8AW>sg$} z6Ok#jkx}3?XYa)9_7gp8zx;k^eUDa#^gjXb8Nmg71-wz|4Mmh~l8MC}ZlyT3EydF&hNlG9FeGo{zWs|(^tR3Rp?45|X%Pe%4XE13TOTz*s;a{l)USdaW}1s0Q^?Q1B+-xTo?)8bRlviQyS^hRG}b=R}?3tEz%FNilL_JLD~3hdWSKX^bCZd#gS!p#}pw1 zEkOyX(0cbW!4_=Frt3MSZfU-uIN?x>NN*%671eQB^8VQ}Q=*ww@p2?3`ML^{PAgat z$dLxhLcr{%1=hXPL8L{ueq0|t-I(v0Ax#1{(hJV`0%iYz!ww* z09XXCQ$vj$XuW!=no{6@Cw_`f!FF&z{&%xrF>Ebc=q>wXb=Qm_jZ8RkOCzRi%IF>E z2wBSL{Vkbw8?CxhW}P6A6NW-5DqYDHlu2F@6YQ-L;PVaXi(zO7> zqMChzG{m!hhq^18w9h8sA};|MR%B_xdospM9LXi6Je_u`V>GO3sU<^sX7!d5`7TMV z`$z-G?L8&geUtsE!aVdcdhKXL9?ErH!2wU3@E=u#A9ZO3R|lb`qkd700G8<<849lE z&e|eP`H&h5^_+L5b<;V^P84@E1FBpsusWeg8*H*wj)#>G1#GNhnH7R;KpGNENT5r> zjL{Yuo=qh1yRGT(gTW|5&D(EdhuRp29jH+%Q*Nv5X|qgl|F77Wm&s_WInhNCl?h`E z%?h=5Hbf0Hxuw?lXud;SXtxY${J=nbTuJqzbtV0_w%#cMDBG%0*=i%yx%rmUxgD3& zxj~onsOPYqrgJwh$KKzQ?6Tn}nPmsCgyV{`F^I$&&d;xMs68mJ+FcTh#xpxi)`|S;-E|INw&8s$*h|Ye+Wo$G=w)-^jNfC_LFA8vj3$R=EsoxDwnvjV(wu-@0A9yx46rr*>NRT}s7A1C5K-wdCtao5&vFKfK*PHa6>P zt$sD96LjBx>wkWY$W0$#1zSz-WZuphfui$&4X3I~zQTbKB+un(rOKmBCBn23KEFn+*8I*;zM3o`OsLf1NZOiN>sOL{16*ma&TFVj83V3nH}-KiBszZYj% z&9qtg%8vF_bzw?{x|JpS?{`omlz2dtfb5xzMix_xG}{oaeF(*0#VzCC+B#-xL%+HLZn=L^P8TJr5t=Rvj){C_3X_ zsui{Gzvl>U+6RL;$k~6^oyWG);@t3b-UjG3=bPu>rRARYk`!>+Hhgj&<|_qE5bbLd zvHCAX41ls&Zuz{&th-Aam$=?#ZoW$!>-r;wwcps8evQjayIUIr8y?0E5^Y1CPu6k_ zGIJ!#ZCy!nEBg-fmv?I;`U$}hsE9d)+KjjF3+14vxT6@*7jG0?2^};Ja&Qs%CM8C8 z|BF%`LE|g)?Yp&smt9ka^w@v&0i#FV-g#LC?^j`Nw9DJ^E{B9k`oY*#hp|}QT2b>u zM|iIHXq~tnb4Bi=u>;O|)M=i3k9JFR82&jFR_zO5Z*4s+T1CC~GhpB!#q8t&hBf+~ zA3IJ3&b`0LEYHxAD2eYRZuciP;TA(ATcpYV^mrex| zC$_r>IyRG~d-V_bb5n}--?z>>*W7lm<{rA4E0Pd#m!w4@hEs-_gmXTmr zV-|#L_`X2FM|$o5FgO8L>#1UaHKU|)d|tO?hmjN^o zg?xdU&3&XDb@!oeEfKLoma?gG;AtjQ17FxK4K~UWzr24JO{K-8k^$9#;lY23G$4|BY$!)d6#Ewaxbz{XQelqALvtwyAhssd-3uU=;PHN+e|pzz0!{b zq*m!onv^C%(24LKZ@10r)825h{mGkzPupfv?DeXnL$DDW*-PwJDfW|gk|bn_W_{Im zZ$8$V0Vma^(RjHwcJtXk8KJ^!iV194+XHUIeMzWgTCtsL)i~pO;=Y zCRr%=Ho$(?@gK~|bG4r5?8f|@DbDFID>#Hz&uFpdJgomWy)hWfx#)zsXs$M(fTMwq zV>M^&P&riKFdkLDOmV@Itv~o05jCfo5S+&ZH8K_*`=P_AeKj{D#XLAyo00f=hI!>Y ztv<1;hq-s2wm5NDx;gbetuAp!rupT4+FgksbT_ZRUz?g}y3E!0YqJv{cAFPGpiLk6 z)KKv>TB~?2v1me5mi85(nye^0j*MyDWge6ZR(izF*1?Y_M8HBPHj$ZU52B#R=?; zA!<`Wc}PITs`MwWr-g~JnKO245a-zZYUZ7-G6XG=wi?Z2RoakgY)dIG0P4()I-p}b zEi_z`z||?UlL}EG+=@n+lVl4&tL7^$4iOhbRa%a+EwdCAoLsbuNQR!m_SV1~2i&X$ ztIg^KTK`^?{$jJ6zp;^R;g3!SuCC3$F5nnypTA;u4Ij%AwZFlKZ_4$u*kF!=75mUs zNB*lW_M;-{`LC+Wuxso2n*VCUP?ogX`w1iBVDQ|_XKWk2mveqszM%H`@k!NmnyXVs zb@0($S+l`*H`B}bo9)1H_Cv~l3+G&-P5xq)fY{NQSR=)eI>T`@W_x zsy9^AJNjDgDGXmp#-HV+I*0+G1>Wp({xvJ7BfeOcvHhg*cHGW{OJynZ6!45Ua=(* z{QN5x@hywyfsEK=JKAgy*lcPx^CrG(IAsBr8*d6~1dOLw@Pi&zn;i;b!h2}|TZV~* z!X?NKgjp%(c_ZUE+4|8rsSX@>zF)ksIZO5wF%v!iyN-^H|LW#F=X6~&K8udE_mM1{ zO4Rf$OTefT5J_`$?fqUV zooP4xw>XzzSv_9c91W*32q)J=8lDw8jYUZ!W1h|l@mw$g_y3V3@jOLdU(i6VL;PG@ zNV(90mDZMTp`6oN1C5cDfuwIcJrRgE@b9>q9D4pQeyoXa;;rXE_^d#q89xSFjxYAn zqL!X&zWAUvN_Y4Wk`Ev=(UvWPPn!RHP#f3lbEIuK3BbH)7W)-puRa-T7S?E^r>F}J z3OUf-^Q)Y2&aquM#};tAx!X1X zepv1Y&6{hrp3&}ogt-e3q8rO8&w8L#L|s^aX~;kvE((iq<7R6DM@qZmQ@Y{{go>Ie^(184!G zLEeseRf=#%pk|Hw8Zb6SJ`3burhLQNhM_g9_p5e4aJ1%Y3ayUd$5T#*cDn<-S&|Mp zEoofh<_BC~D=Do>VY9hG8$aUPZ5X{|s3U2T;nVG$1No>w63x7U3bX6&MWVbY2U=Zk zo*&cBGfV5WA==!D0#*8KR@ZBnmMRzG0ghRP76!6xVREVTFOa`f7Qo2)H5;zu)e#v| zz2Q$P(6?rT&@xBFWuKj=X;?t@xn0;kf%?G06OUw0%IdBTz%xu815(Z0MOweiU$QJn z&3UBb%=>HCm^UucauR>oV%9CvMxNbz9$h$sJ)yJ)oa;(BXtKGB{7Dli=<7w=py-P~ z8Mf>JKO45|$uGj=E*jW1Y@2xb&tc;L!kJ-n!&dyijG7u?d(aYVR+~#2I1<-w2BWmp z9;Kx}AEkTMDE0rA6Z>7Gw9ERGL9;&UE2DJwNwaTEo02&9D)YXWR?L;gTWqzCARIm< z%g;_VKZ|MSrnVksigcf3_WZRL%Btogx=GiPaS#(xQr71sn$cftBeji0l*BkUVXpeM zHY82%w6~stUHpW%yDyZtFl=a`Wr7=)ykpyhY&0U3W4IX_VEM_*o}?VXzeE)iKZe0c z=VmIz=g9HC=nWcQQI0k9{TN0klFpmA;p928PXC+nD7Gh}x1lQ6oM~vcXZYd6UH&k< zMrN?T`7cBB4HWYih;ByP9H(Q=07}L+S-^NgPC;1j-DXZ+ta%1T*`g-R*e|alO}a2T z#t1 zp+DGWZfw-DFWyI_w6tDy!<o<1Bj8QS0^m;iMYP&n|{EvOsCS^cKC zRpsRio|QFk3gd;lxBa}q(Y??Mr*kyUe13^GvWy1AY%seP#*Jlv=3zC^vapYbjQj!O zn2RvK3$yIsSX%sD{Hu!M&+_6jq$R2!ajZ+5D=da2gGe~)G%JB@{OO)lm+ zt9s2v^uodMxz^vAhnH#>di^~)q*}zYfmZ%ikElU&x@!1us zc?TkAQ|XbzHZdhW+(}Ufas04)U5zv$oF+oXPHbzd*VRfyq<75&!yO~TnZ|@M9nA$- zIOnGVr>iEl_vUAbePXu!Dj$A_uPR{>=rg5&${VB^QMQjF<1Sm_C&||6Wp>&+_%TQ#Y z)M~B%q3_(D-p1k$YE|6#>9I|=T5I^twz{kMS*7kW4?e7AMc*tonl~3W7A7d5>rEVB zd<#SwfccZp;TShGl9uO9h@2JZ*r+#o6ZipT+Ne0}^ipd)Zd~sCEIWPv-0od*Rp07O znbkjzh}_*7bwNar2feCo?MYGp=)L344>V3rKw-H@Z%U-7d{)hI`E&cCc(|g`Ssm!u zU-5^UZeHc2cnYDeXTV=Oq+wRvmRb!dwV(;5;XN_PhJBRk2YSuZpFu| zg`ktF`l~CBZu&T)EyQz1N0bOV;MKePw$lv-`M1sXXSKdbGcr@n)aBX@`iPzIyN{$H zZFOw22JbZQTCNQ}>xC0ZjG1gD)@;eyY%cpKVX(R9jRarxwo@s#-;BEB4682|MCHSQ zfLN)k#Apk|8ij90fN(K&V3K8P3kMkc2?|{!xEu;`j!SS{3D=#hnenP{8iCkfg{|&F z{7{mtJY$dO;#lZS@jb=)oDMm3>Trrw&fLs7{iEofl|}VVs~_Y6?>I4kwJr8say@f8 zRwwgK1nmn(Oi&vN?3cQcwGpx3&DW(2 z&Ih=fWPikZC`GMf=g0(N-$9OtgpOhFCTGdAK9QZuPbql06kM5Xi}`Op#~TtnNnL-C zDj~{W*ym547Xx#V&JXeJ8DZO4ie#HSJ}WaTj`QL1{&Hn8Gqd!hSTE6`$D{%ptn4ZL z@+s)lbH0+8f5}5uv(Jcqx>?fcnU8I;fBzt~i}#n`=2z5Onf_e<3;CbK|5W~GvLKR` zivZpfvPt4wSBSmAT`viM)Fu&P%8EKpb-%>G(7g4E-K16ODk|%D%TZ!E+)483W;H>NsdHztU?MlX!Wd+De{4n$@H$H?8*#iQXu zZy6`|2$5N)vIt&-2PeR}Jmp!DXcjI=8)_bYj^(P@SZ~kGs@3|2rE>t7u}ByR{l$%y zG4;;aFH#T%J#))^czS__5T^XKgrJ!1hrTcO|%U<;Ie{C0;k(_J1JX z{hTcAgW7#ycWBwdZHGNVy&@}o`ITAWl+i~e>@^-2sUK%zY6~(JT3_X5Qyw1M_!Ex#=IGV3;Q^wzwMx_2Sc#3MG`wi}ztz zH+7t#=^a!7+Z#$e)0hG>RlNmUn5y~DM`dpK8t(Mmq7DSyBGV-uQJ$;D`@jIW0N}y1 zXKV499&wI3AWmhPuoQNUzk|&_seC31qwo+mvcdzP)o3tg9Td%W)oM8tJOTrIm8jjt zRVhSD;{KAjHt z+Sk#ZRJbakuwlNZvUaat`yQ<Y;;lh${2$m)B1ThSaxEQ%%q<&e)P0^P2M)!S(; z&1DXj=5%ZdG)~O1Hg4s3{(?S@S0t27V?BcyOw6^)k4Om<(~P2dF)xghgyzS*aD;@s zX|V+Hvcpaa&uM5F@1EytxNDhFQH@h`7=EajH(wEKy*7FT>Rw{}LFklR(y_yO=xWg~ zN+=aeDf`lqr@2;*(x!WEQD-H#lE+$u1DCdSgv3)i2%^v`LiZ10wL;W`#f?p!^QNWf z&L@BKoApLf7PnaGwJ%Uvd|Y!1HtKc1rN@q$`}l646*S%F%KR4P;!+_!~1V3I{_05 zt*s=-^10fVe|J{oJZbUJ*W}ifh&z8lp9rWhQC;5Y!o`^6v1IasPAHjuvAeSvjcrA< z9caAobVPDwq@wmvZP*N}Rn(`WnUS)`+8(VNsIJ{9F~XI^CYGxiD>Ex|c8QwiimEC@ zFBlg!%8kK3*2f8o2}xsdXj~2;nDxSk>|{lUiDzdmR8$TvE-F7q6-eQ@dYTD3`UMXV zz4ADX>u^kSte%Fv_Th`#s3=zk-y{{M&q~fOeLLK3WkO6%rS=p<{i1`u#S!iW`RL|7 zs@6(pB&{=19G@85!7#Ou7v-4V_TcZ|*jbRBN+F=s)LpMR&IY_puWg0V^n|u{-fUdz zM8dit>kVr}a_y&Lf)Z7tW=ow#+f%`>mb$MAr4b4=KE0oy&$yMnlxE1f(cM}GlCl}e z`7_ml0Out?V<_z!KzUo;zt7$@h)yH5w`Pgbl>0;{E?%Ijcxg^?U+$0bW#Mpu#)c|Cm{Nw~^JZ8Yp#<0vHVD~YR%a+{D4lMD{i ztv0HKbj6CMN<;3HGJDFmsS1&I{Fub2KJCd86*R7gI!sK<&(upYW0{?Albw3WWM^!$ zvnwKvh_u+`wDxYQOv#%`!PM3eflL%dQD+yq<8Y63<2zOod(v5DjmH(0-52TGwQQWt zl#KKe!kXY+nb4jkrKN))GgzS{0{YkNW4~vr@w8B5`8-xy2?5IYI@MOoP(KT;n<8!& zx;@QWnU`{l zp{ypO@W!LU(-N7{ab3={B!i&!;Fzj_vU+}6hq-K}HZbw)apuaEnme)IRp#E6+U3{Y z8-s>Unbr2046vP8Z|a}WQZ$1I2fArD(L1f1IJUJm*)dhUTq7?D@fSJJWkag^L^mc) zU57dIRTR8ZYWrMy>P<;qC^w8T8^U!2x5iuV&8wF#g;TBRYk}Mq)<>)ODeMG#cs%Kq ztAzTKG>1Xlc7M-ErogXW)LJScG2FWo7K12cThUCKA64s7b%6uhpZEwylC~w`<-~L6 zQED31}kHL zbZ9bBJFO$AI;D8Hr~2U{=uk{IDpz-Suz*4^&XOq57_*P6qK2TF{)_UnVH`GhSDCdKs@$@EoO;@EP2&5v66f-?;ZiXd^OUFFiQXmhx$ zVdXT8n@0+sk*emu3gx^Dk7rywDDT#391ki+2b!DzybuY!ZY8piKX3hX_40dOd>9np z#^fLfEt@AId;-u{hUVq<%Hj}DjLHa64lb+_LD#{`A8ch)4Cru$WdK&QNsac={bwIw zFAcIOFu6KTWo{j{w*fnH@jrMoeC*AVT0qBqpXSYbTu>fiF7NS?1R~up*%V0y0+k8v zZb>XTg`nIj_RWA_>X(e-d~G3^OIgo$bAG!+*Lmz#f1l`@_PSg zc_}b&kF`6u`5!~rPz}0RGR;$&x*DlTBd6O1!MNBfN~Ak^u}xR++x(Aq7ElnC5-zq= zX9zJ)tK-=JT@Qz;=Hbp%mq?->Kd+`>6mh3v{Xo^9WPC(2J|Y?E=Mc&FA!!=?t=^+W zIh@b+*WNu`?%8fSrPyYC%BzlKB$Dz~Ra&G^ymPZ9?r9ab&HoUa?zHQn__quxd7+)Y zZ)bXmyUUJCZt&M~F=E4AwVfFRDwFJwy*o1y7q!OOk#f`Hh6kupSk?h+st9@I8WrrL z*z#)O!a6#t1OZYW5_aDv2yzvqb-YaB2^?fc*zL_Lx_7nY*ZsIFil;*W+Gi)~5(#hx zkdO%eS$Eilm$9T)LgH2nF>UX$+QAP|)5JL3O<^0m??;6S0cpR8R*phi#V&(M%JO&y z>GayZOjZ#zGWlJZ(3Z{*HOVH9m1tKq%&th|Vm5cw(fxz=Kf$_j;Ydbjg}BBh_7Sov z#^-Hp(-aN^fnq^QAJj^*d|^yGDp=86##78=S)i80m$RF8ic)$MKG52(5uGKitZdAx zOQeeK``Ruhiqheuq7LhBil^kDlpN?P`F!hf_JoCkt0L`{Gt{8!(JNT3TCMju2H*B? z@t_$mJ;^TpL!u~Mab%fx;TKBb!x!#2ixf5xSBw=_^KK6I&X4<9wW$&si`KT^*(E3@ zZa4Sj(7etP^sW+avrG8D3kbEgO|=UUuGLy<7cjusoRLE2g*#+?JNp^s>X^23?bO2A zTDP1@ovKnZNL{HV@kwszqj%jT@mLar0kC4U@M4=7<${Ef^Uq*JBuj|$v~b4SjQCRg z${1`EcBD~m+bdDKwC+-xRVCw$nu5Y$Lz^SF{iKvhzC7q;xX;@3cqzY9rD#$L?zy=k zc$p)7erLDBg9)hxEz+Bi&|*hKwyrJH(=}o~}@V0I?iZmFTI(#$> z-Ph}GQGr8x9p2fLjOmkwxms|q$nDE>WAd;nq3wI5304TTI824&-zFDywzUzCjaEFKg5xs7=3bcktnqR-74T}nY&^BL6m0LLB!dcv^9@FdO zb~8ec>a{oV(JI9Un(S?gkcvMM!mZZL|4hQf>|jaKmni=F&~^6o5gooMiQVN!7_B?7 zpa+Y!^(0<4#gjw6hMOb9_|&KhHGx+1LYpdk$uuDRGI|*zRj8A@OGdmtLjr?RHjj6 zM@-2P2s2)mFAQ3I9%n&IcwoV%1*u;68mFHj zvJMb17!(9l;;7BQ49wsJP(XqvkTw{pVnvw&RKf%&fsB^{tjndfR;;$#YAcq?B3cr* zgiSVO5f$9p8^fBUZ}EuA@yYDdfl)_ zRs*mBrO*-=^#V^m%ZG=z1`n<+!p{n$q)}8EBQ?zn9~gEl+U&gdreHiW+7%xUe_?;n zzOShKc#%D4WIUySWeeETgYF&kQj6RN=j0c;8|7)=oIXLB9SpQ~m=jOfS$2>w_wfa1 z6S=LL))aU9%l8SKGqc*-l;n}MDH$r)M;5IWDBtV1j~fEBA-};B$!}0B2Y>ltzkR>i zeB5q>zL}GhG;kp^$s~HtO3am1y`NNKRWK`qu$LI32 zjVh={^?wiQ5;dq_$f$a%HCLmG&;h|Gk1zN((bp2d{SO0@JS`*gw~fe?-_SCkfHk1O z$L&VEKBG6N*RCRcn@7*imFqAv0)RZiYV=YohV>;BxqLKV`GZmSPZa0=f&%u6ru)t` zHwU8s%z<%jBThTGranJi_ouk`h8+5Ft>~y0{5FxQPsZw9-^zsa%_@?p+<0@I7-d3%aHTFKX5CsaQ`lumREeU11gv?S$V5lHu0 zz`cNV5s=$-8s7Ej9QPT4Q5H)-xlw5&SAYO_+c>z*?y0EoR zw=Qf5K6dlMd1_H3&U+{R_f^$?0;+@BK(+6MMV;}kfNEje!uD&SKK{3r{n47XLTSsQ zcA-8CO1(b@Q%JNQ@4Jnw+Jc?O|Gp%!q5ZN=h{HCQN6?SAG zx0vUUcA3svM@7SUIsLo?NsT>_5_2bpQMOPO80RuO|JyFSkKRH3Lw(_hW)TX^KwV%j zJG_-ounHiQIsdcG_B-a_gz@?otRU{g6BSh9-SP#-X6HGDt(dYFQn+Hrjlx81@U0f~ zIWfkBJvY}h>>WOSEdJD_V2PgFfB@@2e zDq_9~U=0)byOqCk{_c$V<`5?>7z+=`loWfkqjPb`jBR<<>96C&m{M`4io@WUDO$4ZO&j3*s^ zbaBi#W4mu+D>(aR>YkLCZ=B8aA9VVPhhR)bpiMRXEY5>WU)Ap`_rYXuSoBY;S)Zwl)> zlRs=5EZB$@U8`I!6)H|`xBneLg0aftSY;VfrvhJ|Rs_S-hwr`?sA*YLrl^>FwR+Kv z_e$_DzKj2<*12{XLl^{b zP~cRvlFXE%sG;0)v>4SoC*w0zS*Nzj$;G36mhxyn+2pD8Qz+YF2_8N9q+*XLPZwFf zubZmq74s`Zb*&{zcUCE(J1PQJ9T7gk4W=kHIelmg;1UIEb*WL@6qHJhqEynzi+J0c zUNwu8hTj!4)vqc@8O&&FLn@_oa2E-lE9rRcMm-#Wq)zakOqw6 z01t=xq54QEXmoe$o*4>&hlP0=N@90ddi2LaeK>F;t7S7T2W1Y%2jzHcXXO4|{*@)} zlib2h?aE2!B&W()VP&)@ZUGL;Y~dh3KevT_tqonPz#(*r2m!)7YbWV z^z-Aj$0FPC%_^*o$Aw#hQV6p0BGdf-y|c|l@juOG!+Y4(DV%aSdi`(mH}5}VZya_2 ztG4m`*)LWEbRj;WuAGG7&CF)qxS zV+jZD6`ME9Go)eBDwNe4#VkQt9}AZrjWD>ye!X%vhG`-M=8!Reg$@FkXapKj4OW1l zay8l$`Fn-HazY&8A8Mr*oV+qNd8Nen`5fnB|3UUX^=~pzHUC<5FF9Go*j0oea@YsU znam#TifAOgs60D2pdStB2Z}K3Bi7qa|NbU_JVo~w*eWrKC{FSBZm44*&Hns)zkOfA zP9$4D(#%6xoX#C~Lpj-554Cv%<`HqjM6dX&m3*;a5*Pl!FM6b=| zNPwz>P>3ax(G@M& zfS^@3Qlq+Ts^mr@14qQvo-bW20#@g^5_Hpc&Fw_8_*~k>FOD>(*C)EOXqK>vBypfs zve{_bozZhjS)yIT=o0Fbdxv{CG_IAoFDs1FapPQ!ip9C^^nKjzwuHC@asJ-&HBfwv zPn=98_-htNUbrJ4Tz_vSK3t5_JsCOUhEQK$%cDz)+8SgR7d0vbQj7Qi^=)KxHpNaa zL$0&`{xr+4ENy=|7b~#5_YyAErm<-ca3BY%lCRPp?qQsA23sd14_PaPpZNdSmYt3f zveDqd+Z!NCYcN)a<_j!~kgcX>)eykHL$$X>)c+pi;PDxLnreezdSq?2#hZ z{gMpUo^`N%Z}4|0Aqy#v;hbH*x(K5i7iEN)WJ1l+C)JH4uA}kugv-7OEm(=O2(T(u zXhK~A*Sn>w6OS`Lqza_2=^|?9m8%uBhC2oHZT|cQ|8*jk(Bj7#jzo5|!Gbu*PXwpH z1;qD>H}DeoW89vS8}}&a0ajRTfv-sb&`trMNx9Bo`OctS0bfUddC|Tf0$|&+$ug<+ z5dSen&$Eg}_&E~`O7Sv&VHp`g1ck}ABis)cRgSlsmFkxRx=^gvN65)7zCd8PvQ(Vq zF7arJJ`M_MkLJpwtK9a2v(x0v%clhx{b{v{Tf}!x{sbke@4%OGQQsy%H`lW zIVaMK_B!1C3g!WyG$%>p9nN2mqldwbb5e%xNF={3Dg?#ACg%fAu>)G%G#CO=NtM`wV5~goKbiX-c)qAQcLaNreW3{ zy{5@6a2F0%Kz{fyL7RyoW%l$pb$4)X-1QDR<j@CgC~HIifGx5qN={bjD3&h zYlL&RT{T*o)+`Y3TlD+*1$+7?%`8 z&WV0H+owB+5ti>3XOVuA$eL@CENs^kJ?olNMNFp>+U_-gaGc z4x?M#SyC3A75~865|P?TjOY%)k>~W5-pX`Sm}c6#WqzUSBB!^cl8DAfeB_&dM*M^f z&AZ=oYD>Eib|w$v0Ju4NrgUCA&!Ww)B$59d4-F#gzUY~Zx&6HE{h?m;W3aa5_ta@Q zO0m5NL9RWsPm4YzjS?>|G`O|I04dRjw?ol0Zf(gglOW*z8}fxi#GhY#re2Fqwn`F~gfrkmRH!Gp|**mn`UgXw^yb zwCJpD2m`PFnp%9ZuIS-?*hPy(5An)ovb~dL(?_B!f_XE4*UH04`8QVn-6a2R;qMm} z{HsuA%bc6IDJsbwWZiWx8~!;a>y0Gb&t{hNJhsJfr z9?6)LT>q`%JepBp@BFjxjo{IY)yZ`#A-hwNzWr5Us0O+F*c-R*wHvu_XWSy+tKQD& zdDZ6}S0V~Z^T+2WB_5YNv-Tonv!C(2lGOAUu5%A!BX=D%t5+M3TwA=-^`mt*+1F-IO6qAmxZ3)57w?{=BL z2D4f8y}U2X9tOWDD%oPu9{g{rq$XXL$9T%X>m-l13??R26o`?C58AL$ZQUbM4ks?! zvMO>!iIBUXBv?KNMb1ZtqyfYEZv^azVyd!Wq`clA*Cp9}wjM!*Re0DA+IMfR9H30H z%lG^32XybjOuQGg^W<-j@u+Q5tu)uWcP@CZqIoB)5!5zqu865*e|(~ozF? z>S|76BQuj;kQoV&J8Arhl4ye#SqW*>22Z5m8F>29HzHfCz7$l{cojliF2-h8~Bm^R=_x)o1qyG zy_eD1e)r!~j8*StT$1J6rA)Krs)8>wWxzS($a@(he=#~;NKAZ(_|1!M7sUcx=CZ>* z^-YA0uk)PVuOIeA-%mC_DN|f=Sp4u91Uy7XZHOiKE;M%+smQTC&$N@fk@A$)4`aMx z4*kMda6IFhNSFR^VyagDpworifJ*^zWC#z5EsLkcEgN$!oEzv#jgnNP%Ub8~smY2&%T3*AJi->65nBG_N>dzcBhBWMM$rcugS#%`L}RRv=B|=l zQ@D!<&LUvy6CdCs?77{>KR?L0JTh;$HI{T`-6E)QR3VsFn6lIne^kca#B77PfCuVA zMJ%^OP`3Q>rTziBicb6S*JGx;)Hs$*pkp!;ztw5RaTI$Bs=!glumdtLd1_D*yUGwG zrQ|anL%{UMaNkZx1wjR^sV{T1do`b99uZ|(pSrC3J`$HjM-G-&BK6)T^uTiP1>_Oo-%YIV%zgi8W^WI1i2 z2bh92GQrA)Ylk_>vXdiIugqUX{R4Wb`o}xP>p#$;_&$1_3i&p*!=ukg-l?g>Rhg+B zNg!2E3m*8Xe3MljN`ri}*+GQ6o;p1_6U zVV8C2tmLFC}kuW-&Ek*zRxX5VT7SvUpTSrlGqA2?h z!lTb=w$K713JK2gqfH9HHeEtJ#=9S93{C$20VC^Q85fQC=mCnC+x_v(LccyLy&e##Ht~cB8h=n>(N)HZslMFfv`b!mly?Um32)9UUEclzTCkt5Xb<0{XWc zvtBSG?s~sA{x$U>pp9?RGmO>$%DBvZ+5goZvxsyz)R+IKN}|2rdRs^?~$h)SFI=!or>v%MY_Ow63R>HFpA8iFZ$6#&gDSvG(|EbG6@ z^C4e`KDa4q=#G}SxMUs{>b=25U1ska&Kb-8opDkA!ka(|giaj@Ufq85aIZc$C`X!* zRuT%cN`Cd1RT?=W2bNFueyTruVP|!uD27 zZxPy8Nr-2Jp)VOaKi7xPvq(~xFvSFR{QK%hk`<&X+Y>^r&jZU!5>XR%g_;LQOG+V)8@eaRoc9-$8=>#v~d$}eGsRcfDsKQ@9G7^fO zX%3YJ@2s2O5@DD{_3I;ZLY*kHBn6U%-={M9O>|<1I2X?(gFO6R6~Zhvj?hS|K&#m>Q~YRX7YtDmcBgC91Q zH9?VH$Wzvm$GK>RDsAN|kyMzgYd4E&h4}9+Lj?i$x>mE6;X^rgX!@%>FnNFES1dFl z7gcR&X4C{6^48-0ar+|mmYB^dS0D50Y1*S(yzct&U{AA=_en-KB)m@V45L{cN@UsYw+v@BTE9-u>zF&)J-2Ecpb6Z~3qT9(|{| zbe!NEuPK1xY?$mh-H>ieM*O2M5n9E|=}|{*!u<4L0-0*IKX4Xvw?pE&YF`(z1!Y@c z{CF86s-L}_R9lieR5l8~S0pZOtypDht%|+U)mspGuEfQXcR00VCcjCc7HbsQ9XA3g zbR`|)w8qCXTky1}>R(CTg69N&Lz?B2kXKbjJFmWcC3Rq)To<~mN;zP$g>$PmeJ_(5 z?(T_xn-uO+;VoD$#vI}H_{)H)8Zo`s3W3z%3fPL(Prsq8Q>a{{=F4XYi5va{4qXB~JhnN}zG@*d{{-WHbaU0h$zTd{Dz2A}gRAShL_YSH|F()t zK(8yX;Sq77m)Eh$RxXjP!l$w8WX*NGta90jz&@nCYSY53zo8ig< zBX@)xLgCEnV^rjVu&niUA+Jk(wN%L$j<-pulvFETL@m};)w%mfuTAGNkP}m3Y%Tb5 z;pCv+^YC_v<|edmI|<56fiH`6T@FuA)qTXci&XzXO5qn`0uzvSZ4#&3Woex5NnIdze-=|3rjH^y&9E=Rxl4g7LQbyv}btO&Nya!c2T^ANF8l3u# z5LN0!?2&ZvR6UAywoSjWF!sm^9$LPUEB450_5O%dqK|dOM!NLqR+3_3&rM2hY-BE8 zry5m~e1Pkb=TDA}G#>mSS zNuOR)$Pn`GpqXDJ2%T1am;;||UH%PP4y!&QNW~C3fIkFOonC}iVm2tnlv$V^JYIUc zop%dsR9)lkcM7o*jK1eng5u*&3v@j1P3ROCbr6mXmi9p%*OwM~2M}(3Zf9*Sxnt8MT_6^X;I9*ANO29RJ-5L)-t3s7EgoWS9>- z&6hWP-&|$*zs|TU@)QhaK-&vL$Hh08(~vSkQ{OC(w_(*zyMQf(Z}RKEZ>eP01}tA} zW*Nol_O$*l^i*+wWMJHLjnqJG@+Y|Wpf~9-X3A78G=Vl9;YrDU^DF&3r*N3piQ@_u z{|jyLQ;&a>k)8cr2L&UO#1-XaSu=)g4EP3=_*AWN%QqR_2mXc}%;OMgPSwl25JsMs zrAaj!8N}afjVHeW)a6iZ!|LULmIbBXS-vH02s$-X>aDI2`!ICeV4iqXXq+zZ%8w@T zX^WN!?Ehwp>L22IdR;%aGhQZ_3oPkHO9ajzdRG=;?KU~@1zHkUgTK%Yq=b0DkbOum z=a~F^;0O?L!+QReqsQ@~a366)+v>f^xaCwvN%Bd%vHn!XCHBAa@WH8!0nQdfnyFeg-dJ@y4tz;;cv~Ud5Is-~mj=#^ z$G*dTbYYIDQ^m7;6xp|mgk#EO0=P#!`R|~yrXl@^Zq1WW1fWagWJc zSb*;TmFtBr)^`yXdt77moU5|kdRIgipq=|DQ5(kB$8S!uvx?*M%**G?sXPY7iZL$v z(jPetbQobM*zPr-<}GP@j=y|7<^%Mg zqG1d=pHj{C6hgpl`C&KPwR%SS>;1h`@MU6in8d;#BcJy(6=XwJo(dH`j&*xlRwwR z`*koUuP(y=pv5HNMw|Xtfbd54eP(nZJ1c)QdP00%+adcIZlv;k@S2lDX}Vcc7kP^? z4DcLB2p^JTj9CygWVYZWWwKO5SQGUS2g7ec({))NR3a0B9!9g2V095s^U-fKWFs)KBHfRZNdT<2FqoGH2KTl_PF0$ zkmiZcO-l3vK|vg#wyW}Fwluejxi`Ji^l-b!eM*aumD`DRCMMHm`{Eo`tUhW(L{_R; zaoXp!r3fu~oKh%2Ej!FF2bC*WetvAc2k6{EGcq422$uVZ=?6PBX!o%r7|9v)MDB(3 z*;e{ta~FwdW6Y0!>k4(kDSoKKqHjgu18IxU*^ahiFy7@5+Cc$*GxjAY+;;Rw>r#kY z9R3P(C~~Y$5w1>*(1#M^xA$>rfca5rS8BK z@g^{lClE6P4WjX<^zFb0?&CcrhI6I8i}BWZ{K596S8w-^w|NZgH27 zNbqakeTweJFPY#>+zxW@JS=Xx;BZbx3gOk!Z*-2D0ciN6UnFr@a)~=%)9Y9WE_hy4 zFf~&jm5t&WxUpjncwOrGHEDcyR++}_%^4R>&wQSsxmw;g;>hb1x{u@dHgS*&vsN6H z?a2ERL-@7aOqLHPpedIuu5tv85S)QGg6g4V2Rjlqq!N^&dQ z^}5Gyb^Ic!@Uee7Mn-mnod#ommp4|JGkKz16ADXR36?6%WH{9MVE11AtTu4=dd@ts zsX}z22KsCL`Xep)>WcZGucWP>|J6fqXW-{m-Q&8yAqUTb{2;SCZJ6h4)v~L?vCOIySY$ihK5pD2SbFn3! zax9S{U&vO9hS}h+wCLZZ6kOsS9ptxkClw6zX@f=gtwRMBfo{x_$hnVfmAcWIBvZXS zisN&B7UY(+z(OOc7}}H$A8YV6x#NYeTk`E!5gsLfNfZCXTRQlIyrbMy!a2=?@=UcP zOPo(>Op^D&^9!eee!P!yGFUZTdJ};)o%Iv-W;WAJI4eIwfDt^ZE#=o=7lcWWUBQz8 z+@Su~l_0FPp!;*RsFNf%!Qp^bv?ox0((i8cYej;Y5=%q5hj9k~0Wg&6E;SQ~V_ONrkM=KXO;m0`n=%*r{(ykUxy$QG`;#1D$D1M7<1VJ`?(gKo|&QCe_=Yi<=NzhMUafi;iv*uitKQ55<0?@>)*{p1K|pX&Tl`lmwR(*#CbQuE zhXC5Nt>`34up}!?C#Oznqc-^4x$QQw0h@8ag-=}(IW#a8g__Y&wQ+_J{GmHqJcxz{ zRc*YC3T@$j@JV}D#5VpK`WV<$#iphXjJz*$lB`D_B{@;3q`#7b!|>RMsFVyJL|v&R z_jhPZ(=}+ol6`H3+P8c>&PPPdQW~XfvglGLzm3)uiPGjYI^Poesb%6K>{i*V!~OVO zrKCE^{hZ$ZSW;p>ONo!zYlbSRK&iGVDz&@Mgl}r0)kJ|tG(|TnP0iG8s(;irp=Cj- zt&!y$gdo{@pYkIMKIcqyYiTUteybQB{agN6R-#>72c$Q$<5+f}c3M3vp!N||qteKi zbv>`vm6mrZ$(#B7IaEur|qdKEc2C9K0FJV40WZPvNu<%jUOP`)ZbZXpga11Z)Zq?mPl%m#w_ z-8g~Y7BbCK0-0v4Zs+LJ{RHhId-cAMhQ#d)ge$d^AuHFO4eIY3P3;`L9NW^=o!0(^ zG$SkB(K}M`-C4`GnO8T>k}s5^WNI;%o&I>yCSje(NI}zqEZ=cx4%7c9@-YA7Qn0r=mn~IjtAd!L_JZ?61fp1w&6?K_8pUvsueGvz_=yr z8n&ys5nqk^q38$6vB~Q~oQKX$#VoNuzNAck^u|PI(kfpfLG;x9@#T^(-BB%rdTX!# zD`!p)nW)ow7kyC3g-HW1m`TTUJEn zOJqn6^9sIs^=Cv~PXM+~TE*wMt&mqMDqO8k2iq-0V@9j40GA&T&C4Zo^({Qpcyxrk z4fZ{uE%sX}OyS_@5J_EpRZE`XRvtrJoSR~sB*lDBk!g_1)QL=bw3Z%3PZY*{yF_T! z9;87e`lFU(yHvT(7Q(CkMv*6pKcr>j&o?JDe{_=)L?XxdzVCS>slB6D#J8N)%bw#{ zZ?h%iadNrd$b0uW?e%(mVP>}`be-eS>!Xd%*7u8AGPF|(g{QWs;2@~Jg9{*SO>u@Z zTLKal(uE9FUnU>btlUgS*mKK0li}UQC*N&8egYdU-*VV@OG&SVq;;`kYQA4UgO4p% z>wAbV4`E263Ox3<^3HHK+cx}At#8S8UyK{@l=!g-*Ba@W4)?gdOxjc8frK(Le*lzI zV5elWSC3XRc|2m!kmZw%zNdI9g0&|xrJY5>j#S^ckFtu6nTyUD4`({EBjN@0l2NEf zt}R;Pxn^&uT~rt8e!ACUi)%HTnedj2QmcN27jNyx+qgE>HT@*-;wv-@Hn0c-s^(7t zES8Xp50(e{k@3seWe!@$KeIRP`57G}JsDxD3$^O~V$t@9NC8lYs@@`Rx(uj5&mm2# zd6|@|jeU6LjGUxb%5J<2;46VVE~OJkL~>hnWn zud1xIg*(!A#1&2-S_h365Mr;Yaw&mxgo(MKJGl~R+S$*h&R2cwOA;1IYP=EK@ zeqoGvI{J2h5*>%vl}52vJ%-FEvXtG2sz$%-&lyXdj!C_GGLOl_Q0Q?k5&peU<3d$P zrQ6=J8|R<FO9!_)pvSUCwSm)H?wa5;1;^oPfx;&8 zv{xSMAhc!QLm`7|P*8c)o|HR@+{@%fn44;~kmtp6u$v$L$G9%rF(dh|TH~2)$FOcAYFW=smX3Ny z(UR}5mcZEN(*@^@li7|j-NtMq)`_n*heSV}EZ@uceq$HMWyvd+7*$;y6C#$%xJU^R z3-&B~l10YzNBquO@q^voxM5oR?nYTx z$0d>Ir?Z7=R3-{H1{KIi<*>4Op4VFV?qu=!1gk~+7j{H#lQunjW#przsjKF;~BFT zW&QGf)@Ul7!nZ2kq6RCv z#%OO>4rZ{7)EIuTBey`*x%a~!hfQzOpBlN;;&@7?>fr2`oofrm#(HFK{8xW&Unq-817r4H6Z z>QGIpr9~V?6HH|aFpp6bQ?Nu_yt5Q)=jE{xd6xahO{+3)^R#zy1WOcaN_GpYrRkrT-w9=bEJ=ooZOY@+8s4_OzWId5*wfu{Yx0}hjZ1qt<|L2bV>~6l zpKLR-dpbhNGjj>1?zPQ0(bF*{`ITKpK`-(@f5LcNesB1<@l`L!^yJ^}HzxIV zl#D4kBDcR_D;O7u@}W!=(=$Qjn_DVYe9E!>^WUf04)GU!D$Vvc{@QULm+|*Hf8FTU zd@k(My&Z=y8yBII!?r>UGs@SWrzR+Cf2?Q)>T*MWEtpo;^Pnun0#)v+S0UdXn*B;@X=UVG<^)|aPtB)h6;7xNtT;2Vxu`ug^ z3oBd(kSJ;i|2-7uGUN3=j=mANu|Elg>DB)z6eP7=h=ut)fOXr8V2HIm6#WC(;L^;R zyqX6{g{-2bG^5&=)LPTuPu=Ij{V0Z@a;pBdd2?%R2ft z360qt&J@c@;05_cI!E~uAuk0pD%KB~AM`%gjPCFR6xuiJ>JA;;KG`?H_6w8KGCcjAM zhW^|Ac9iwPR|psB4RgrhbE5Lb)1S~vP#PrWwOBhxmn*;6ViYzZF4bO8AwQ5WF#$v2x2L4XTZ`#5)mPwqzV)KJ% zjRm=m-1dksYF5!BpT5m_fy#QFV8=>4#!rbcC!n$ldVJ;F8+hz6wcc+0E7#FG`Sd$R zyZ-$Csn*Er@3^$%HlY%%n2aV7)yw)ja$HN9L^fxPAJfeHY4pWYj~FZaI|`kTzNEf5 zEQI9dxMB8pTzAntBAi1cY_+yskqWvo=V_baiDvXLiU&XnJhL>-STMkGS!4@FB7oQ$ zv2y%@;6A9oGa0KO#La>DovpGMk2Y`)>Kv&*yRUTh_*8m(dj ztmYRfpSDcwF)v^x0lll37Twu6NFOu2z?+q>EtRl{_?XPfgCgb8<354{pwpX$;qMkM zh^!u(Gc!v{P-7LlX{p-4S(#ZJ?O9H)!K@zS^xwH}P(V+M=s_oTH6_jgr|JtWyTSIS z>Z>pb)E=vEuE%#GdSYYPM?vQiv8*B&mV@NrWNog)Gjck5Vx5`%FC~t(!wr9X?J11W zzC`GYiBGdPbrp8%xq3=g!I(i|jCCS|)U!)HyYy1|kgHyD^)cz(!d@a3EN#amB~sNi zd0tCrlZ2;8;MsLo!^liXCOmFz@)c>2<$Dn;vdm~@ zovrf^KImiefIi=A#;pS#!;osBN9AO_u{hJJPs_S82R?y<4|yrldkx!xXuV$6%2$xx zxhS65Ih5I4PpF0kO-*%V@#y!Yz)f&jk?FnKrgc@M`qw|BU;e832mNyY=}&x|7WHRQ zKiKTAH-F~0Z}!-?YqbKN5pg!K5MKs&9vOsp0ew`;^RDo(hHZboEVhE zBny(lONr!tYGGO+e&e8o!*lxWVEl$b$jbvbKG1idUOmWscn-KW_XUKUUCSB;w9V;p zdJKnCAwqJq9|VLxW`TQ*ixd2ew-0jqAq`^|&=uRMF*zyl^#rlfQy0{-vyi!#8TFSs zx?Z_n#GdRTL=(;xqL9J0B<^>d>lEQh2Nju3N?UxKtmTF?pQSI;w%4)Wr>6GZ*h2Zw zGVfdl88f9$33WGgrET^_?gVoZ$%^)Rfg{MXegYrN*&m;8Rw660fckKW+)1ZUzP@+Z zse*aw3o9&D3jsHoz#h4$iGyWx*}{eX@=-2y&chKHogKc$>r%oYUfk`= zFvjJFbuaDU#eOr_j``&=L4bmq@2lqR?s@48{%FCzd1(cQ7Nct&Zhsd=JGmTYc=Y(E{jO6gD`nC|Y*Ow_b_ZU*+IEjOo}1)#|4YXu%J_HK zSrg<~5KD`C?8FZDJ7?TGh&yi4J$CdN;wSqtACplfD2lxz&z{(mpYp?!T=^0qkvy?i zOkP<=)*fxZlQe0?fqASD!dS^)4*}f64v5}CA^H+{nG&z*6TEVjSt`n2hT<3KKMfoR zl9D=qLqw#<5a+g*qz-?gwTcyi@~!?mPcrLQi!FZ|o5S&AaD$ ze|fOF3{Mg<@1teFLLfkV64up^avUp_8>#g)Z?#I3y*6D6)e2oQ4jIUFNcXI9*{rhH zeL`D0*diTTmJTOcFOskHH3_7q72idB&Z1|PRI*syZxxq<6gqDMD=gm0DM)q2pF?c? zF82f@#f+C{&Pws$&liaBVpGXLig8Q9aQSPb@$torJ`kiST!xm+{9A{DycXZahvJW^ zdrYA}KE050WXuRo{t*NgojV!@{DmIRsXAxa4KMa;e|(*+E@J=fX-VcL^q>L9(50sf zt$m%UN77^CU0&Ul=<#wAaQ8IT-aaYuOiMXb)g|ip5Wy|mdq>R39gY`u{dO0*N~N2n zjE+I`R3vj@X9Y^qSSS+q6Y*3t>gfa|u5e4oqjlx5|Kx3@F6z4 z_Fx?&<#4THPQu;9N#si;c=d3d*Zw6Hb=6Dj>~ANsc>IJ%KCI?7c^Ix$A=L8T_HZ$< z+gn#So>^;tPN>b%@yuZ!_fai=Gqri5=OKO%(}FL4BUF7sA-9qR5#_ru6$vneLEaSv z7*lGx+Tb(uZVZ&CtN@`b(gDBe`{eE#se6-+=An*@rjCRbPR{n*fx{Bu-s#=OY{*En zLt5Z;ILeo*^( zf4TSJTxt*K7g=)yTIbD@sp&Q(>wlaULD{kiwc~NWtu4KZUB&WLh9AGe(Y>2Y_&9%g z%0vIX(#Zd#QgIi2bb$^u$<~lv!8WrFZ(^N~nZ#ZIOFj%Hb3-c^t4PP!YrS0dUyY(; z>CRCN-gE>@NKPiNijQn|H&)6C1pt0s79qU&K_Xn z)cv4ct62}?UT;P=IHfe~b8lWCM@$hX&~f-x9y>gtVjoGxJ5^tP*gE;fDAsNo;3-GU z^drL9^A`B(76$+C9+mvKM|G_|nsi|*TDx?iM@L$FyOcp`JX05R8Q9~KaJI#=*l=dT63#8 zrk=Qw-&9!V(^6kKCTN?SezG3wq;QT0KuRK<>ZP!llz3rE z8O>TP3L4e42U3)lE^li|N^Ik8dWpJjowt{XCcGS+qPsC)^}a-EL?$x*IPf>UgxvEA zmCQm)N)Jju;N!nVQq9O&hMKD!S9ISsHN^&H)?BAe>M-SH>Fji}PV1n*Z8!E`<>+Z| z;Ngp_93#8mCBqAE{gRI1yg~#l+=2joN%%G6#;YMsNpLQIRLunl=_GTU7#LU+Ry@9# zkI@mTqY{BEOFbh1+$RAhC#{fe`j1xOSRvU&G&a3Wn_lUq@7^s`Mm-;u9g$a`njX;4 z1oizs_+-nTm8(_QbcIU5IMu24p00L!(7we};DpR;uJ^fjEoc(fRv|2{A#nWk!j$JB z9R20(5(qHw>j<%EZ|7er2ZR(mRhUwz)r?XdcLruN+`uewoz4%WDWgpYfq`CZrnG^X z?Q$7xi9g$Ty1>yhatrs8s9=}eGJ=suQvCU%^Y0v!dx5r*_whZnDgW`GZu$|0vrlh_ z>y3R2xh76%Q~Lk>D5#tY0?TAhaK=X_dGn{c=*eLV_uB1oZ&{E|E2&HV$^wEtO~{VO z#Q&m98~nbfVPp${7Vn$)GfHuGfH84r(YYh?@2EC-%bfls9Ynow?o~X9Z_=!r%H-o% z0BQOjc^^9?(T!i{NK)YON=g~uw#n1T8JxS!gRoMWlDy13^kCcO*jhcmz7>B!Q_z=Q z^yxmJ1hb?K_oW$!u5q{^?p`v!y~fes{@WMrMjyAs1!?L0t58R9=HF*_p>Rdk^}fv6 zD_ATx?!xP>?x(ncH&F=vr1Q7~xNTvZ8NQjhVh^djEj`N>LG z)A^L3$siVAG%R`6sB=5qD4WzsTY&59(ib!7&GQgr&e7LWym+rT$dhj>k7t9EH<8R& z1hj=Gg-uJfSO`H$##Q012hR(4IM3XLb0$TUnK#adWD^z9EY-FbktWZoUkP*vBkx7O zN;02p%iizD+1v6`E}BS^5JRI~5Z|FbxVnZ4-+@VnezUWM{vKVB(kT=Y+Iz=>|4_8J z|C@hd)@V=7b3orBN>#EjlBVW3TgF<*jLg9uSl$CCSm~0j#uW|ida*otvLv`Q1I|Ab z&M=O5E`T;<`;Q^o8&B!Bg1*g1C#MeC#e!tWc?kE$K_gFlvr=p}m-zI|(yDLZBKF$1 zXtg7G5Ftk#3#n%N!Nlg>yRmy`tEO{AVwYH#a6Vrp?iN@x+zALN;nl~cCo3@{O>p%L4WPN)6gi3NO>It!*df8^x^fMJjCg7!@|WL0db9u;C5d zGfh=L>mR;etPJ{>qm(hiM%26f28nDp)8-d36@p|B7L?M5!vQyB^vF6h@zGhiJIN8} ze;7CM3t`>uQpTWOVcA-G@~=uUbDU3{R#+)!5+$ujv)ZelIQ7l?PVLo`?Re(z{d8^A zzL*L_8)1a=!U$RyI|m5&RR#6+>VLvf$_XOU$u=O3=K9Lw}r*ih%OU8whM?74PK?oTf*ik8R>^26n1K>w>|1t z3V}{rj^eTcV3|gT~h-$ zc#(dU%xoEk7-BCmbh?OJ_DU1dWuD;}STm--WezVirrzY}@iQU861{PD8^ZVlKTe0x z^|=>-tf^a=A&SQOX-q7XNahe{0Mzy?*CUcy`j;86=V@Fb?_y-N^|5RFH zuby_s)RWogc5!75qJgn8hR_*vuENNV8G^k5ODgq)d#EW@!k`xTv%}p4L+V1d^f?*Y z+TxI-IGjk~A?$eDa>BO9yphWm=T?4wsRhQvcH7O%7aOUQ9hVGTF$MF_8vfSs_c4DL zZBDa|;_q($e$U@#{yyW+D4PtgIsYEZXI`Jaf%rr-5WnH1S@otYJ%TgKu3DBi&wRpW zY?LqvsSy?=D~3LCIi0``tSOu?J50<5y07#BSU;#nC@~ZiVPp4sT~HoZ|3BUSVZ~ zQhb?Taf@@3%1{-!_ipy6a9OH&=V4OrZ1en1w$4VSl)!1Vk5kRr;f+7Q-ou3oC!Fs& zV5;&3BJPNp8A?!p;lF_JGRymQ$zHJ@t&>E_$Cqh4zq;D14SFApbm4t4(){l8b8hvy zzplJF_+zJEAJ3r6HFaVzrFq}Oa6ZX6In{Ada_|l#;}%fgKUR3OU!4+@>hP)-J;@E!KsdmlZ{^*w@-ESO1?dAESc)?T>Nj`4U5qGC&l9B#)4wUfaGsx zO5d+T4xl9Rl@QNG5c65DMAZy21esIOdk7yif8H#9RnSc;YT&R21uy*8sJz8-Y4VKO z#-DGY(cv?V9k)0xANc0^){N_{jBC!w03^U<(K^%;=nRLUS-R42-HQCB5s}EPj+|5! zr%>RXeygLK{i{0>jNIxNV64;}9V2fESm;;2awoe-%$@fNI(_;zOJ!HgoxA^CNeVZK z5-r_(iC#N9IG(~(L{xW+)!D)Eqz)65c#(F=xUfzS>L<+4Dx`2$c%3S#6^CEqt#Tu} z8WgQu&9~>j-p|IT>w~D&I2l)*FF5CT{tJ?;VpGkBY2|R z+2OnS=Zhq+m(-s>X*cpp9l4pGG+6L+x0x9;ic1{>oHOoMli`!>S8i#r8_P-^*Ck(c zzpqnKWJzY$;*1k;C`uZn~yQVw( z87tiBDQVcszjb?>@t5h2A(Q&zZ%odv!V71Y-@K0KIS>FBd~}H*+9kJo4iD*qr%v+6 zXXT10Z6>gSj`%INi;nnF{Y$T<8{T7l$a2&r-<4gfa@4g_AWQGrmE2;5Q^qUq^Mcsx z6idG7$I0TgOW;pTX@t}f+nOQ#8k2wS@I>ya4);d!)^YE}!T37KM${BJmRQWvjUx5K z#f#=tPc0b;SSDcnjKq2^f-9UYlG#S{=!;?!aKs<0QS4uGblLeEIZH+O{@5zEty(xy zGC_9@5$w-JQ!$da)rUE5XOTG+ZdE2!y9M*!oyd^$W-CW2bf)F*iRaHKU2LKr8q!F8 zM)_X#XwwIvI!>PlkV8zHiiIx{ULjAuN2QuC7-7db7#FtaZeEDN8yU$bZ4MgB)+f-T z!lZDj{BUybRTUYA2iUrH3p}sW zh>g*KM<7r5xT%3xL;(K+2iEry%tVSM7gTZmdB1s7-I%OO0pfscenGs`vLIK7GsEN99)L zW^bm0m>p0Ksi21RHvs#RJ?8aDAP~7W{h6<(*B>2cGqH@*idL_F_jBN{#MtCbBSX*x^#f3uG)rmz2w3Hq+I8 zPP+DLQzv<2mAB&#t?xE(tv7;9iFNWINg1HW1>QvA2bG#hxgK-!Z(u1?Kx*$1egC*L zknMMGJOTWx@HXKzF|lZJS|BGfRiC3Z?@+bT!#CU)S;5Y|j*~LLP!CM$ zR3z|lC$bY*fY4#7@+9GHy_PMhw_u}E%lAb$3Y^)*z0gM?ZP*Ua+DMZ5g^jy+cbbr5 zR<_<&wxn=ZsVqyfC7HV<*PqCRCpDB5E^j*x)Dc4rbjB!uC(L{PiekT7erE!YR?3=H z4Jb5?fMFq=dz=dQV9RnLj7o~gbdN&U!K%Ahx=IFn2yvgJe)kGO37+?R=;T-g! z1<5{}MA-FW263R(48k#N2O&xytH%^VRdDV_W5^wjK3CM<%l2$JpP)_o_O?&oZoZ5o zZM7vrnbskeYX07Sz8Uy4B6m1?w0~lwU`om{qA_TeBj@txzxb{>F;Brpc#3tn%i44n zw;c6NJ#o$9>xU2R9m%YxzQ;IuhokFARh*G=@3`bD-reHtd#Cx(XVli4ZO#U!OTySI z5pK41rTN<~55s?_W6-510R<@EEmteGr`PytIzp1nq8Dz5gu3#CJdDF<{Qgb|!Mk5D zUcb}PZM+?K>OUAe*4Q%i%kW?Rlc9G@RzuIwqJ>N_-NLwCb*sgRB+)3D45QyHN1x(; zguSr(*Fy1yEH(67*P}&t6=*kgkG5&ma`1BBy?JXI2VcOt=d5$^C#T@EG^th7^;wQ5 zuNT7?THeQ890m*9mx!n-*J{2LS(ds}|F>zcy35h6(?j&6W$hSB>ND%@#*243x~DZI z2ui%f*mIX7H*!X`Gx(6Uc$xKdKwDhRQ(L*>vz`rUBybO*(gx&?`xzE9BW zffL!cW&fo>Oa9pN#*4pl6xyE~`JM6kuN=YTnGYD(-R0%Vv+o6djF{`)9& zDGBp!KfNa&rd3>AM|8SBouZ8A~I~I6<_@@|v>t z!~5C=G`vtqjY5$HOaK$Vyg1G1GutsQ>1*RRvmLn|r;n7C(DPgjb=Wt?uGx-|ec(fO zW8^&!J#yv3n_=vuTw}q8`LiwOnwwiLN()fba;poI`?BUG3s4GyD}VW77j=p@)_mmB zRepW3v~k+oh_ou1<7jweXn55>N0CP4#Jn2{Sr%y8*V^Sh$Ns}^lV~QQ69N>e%b5#V7#7-t(i6|=(KMDWA1~Wq%Q#_? ztfoEjC^9>!U-$H6OKdSgs$6)6`xv}Bpg*M)l+Z(RjuuZ=)1y*js63!AG0b}%18!U{ z7MxOKiKV@SqCY3c@|oZ*&7Z{)Z-C6%tdtioe(Xu=>#UV=uWz#sxhX| zadh<^5gqpm31H#THjVyHMX}%-Z>#`^L?^S+{E*<)45h=dB^VM3Z2I*l#F9zsSSMJM zx#$^V;~dAh$ioCtt?)z_3iOMzw^Hl|>~@^RLo7lGTs$)a0yZ)o`ZQx&=3X*W#;_FIHcElS`5TQ2b1;}aF2;Jr>?c_fWH-CVZISQT<~i5OGc z%CxABFTj;NVk*|QBN#EfnwX~(xMsrP)z;nEm4BWbrhU*+yyH(z*VY9(Y3pvu#Rb^Un^|GsRp@94IZ$aMxTpFS8`}|?#8}iXJ@%bksPakk zZJ}Ao1shy)iCiYV!i$%1X2eNNXvwXsi;Yxl*pZ#|ktwm{hLLPPn{A8n`>&oasd4>W#~<_m{F%_< z6QS5oipmo@ob7{{1&|4iW4n3FwX!X5NH?$e{H*cb!t{O-_AhKhaWBG*S4206>-2J; zveK?-SY&yd$InQ^A{@;tKl9k=U~xBtH*tAixahpt-z@Ap>^~K;7o;#^W#v)5NocKB zzwKAFxSM~40SjB*PjO5ShhrsxfcSE)j| zZoy8ajF^AYPO$|-UVV$@9i%guDU6f&a5t6jrRa`%B{Fzo@+jX&xS8su+)N!RlKq85 zLdc_l{brXr0?&&$s>(kuL9hSjnbOjo0J1)R`5sWtq~^G<`I;_Q6mTASO?{j4LM`l@ zV^xS4j(PNLA_$A6lLm-?OYn+F`-N5v&@ zH4(|X`Qvvs`|T#-BJ2&g>k8OA1>HO6r3T!IIRx=mPoK=`sT_={7~aRPh6f467ut-| z4>)?J5M01vp4k0)zS#Y_p4c5OB;JD< zpb9@;m(#t5E+O_&`oYq+t|(=HwP~Ay#q~#TQFyoM7NC5A$}=ti*DFEorfIPP7^rV?1TB z>~D}5nF^gF%@a$j@H8)$sghrrL*Zh2rro-wa55ar=%*u?+Xv-)Q2zjjWEIGms>``D zBdv3;<`+SwOl_HRJ?3Wuao#s;a}U8?@`B}|%}!KkQ;=k-3HCDS1byKsXz=uqiH+Tt z?Ty`+=rEFkzenLEzOlG ziN4^^KgbgK7j2dq4X}6Aul>z{eTSKIC91vJrs~{?g10ljsJ!IDi3C6s`h)m%Zw{*2 zF~6OC7hx&i9MoJ#Cl>r4(#`}vs_J_DGntuWm`Rwh1OfyYB}fp|NI-}KB?A+f=mdhG zVqHj$B33I1Gc0A9#7UIlF-qN@-Q23Jwzb;U1*p}qNCF51sDRa0T&gbyHEs|Po&WdT zHxq)j{r&#`KObJ^y}K{xo_n@??z zN>{)erKh9J$y(^mg2@ScAI{GJi9137AIIQo_D%)_t$^T}3WzxE_L^3n&w38pDvL)n zafyk7Kuq~cjeOcRd}V%gZc{k`D1OWfD?!7Ov0R|<6)~ekzj=;Q<1B&Y7GbyfG@OeLU8 zE(8*B2NGP|{$M)1$5^J<*Se;c{`9C^p3*Gp&M-$e7C z+gOklHkaPL4z<$4QTn-cu71`@da#bu;^&Xj=hwN;(C@5sO^l9*YFX(GjA$&!WvbR_ z>;dU+os#)}B@h8wyAes;QHoU_viutfROj44SvN80F`8k_cU{qCxleKT-%X;>D+v z391V7J{r}9)(?syq*Q0rsYRuCsjAg4u0?@1Nz+f><|?!v(a(svE{s-(YH;SP;hgL5 z;EHnJw#XFBM#6p>cIL-xG_Fzeg@L|!1K=q8$ausak7VOjC6}GHT*T;sLUxuO-=V<+p@dRMRLWN%hf)3Y+-YbwF}^Z8eknba9;f;lrEIV2 zsNa|LB%YN94@cBY<_UjV!h{YFvn*4R1rP>l5>8a;P16HlI7RzCz{T|O96GVP(ezO|2`ZX;{G<&wq98FEs zCX)}5s=McozN891psl?v*OEo-j^x|rnt>Ph_C9{oqbxOeEMCMemr{Ohw6A)TeOr6Q zU)O9Us#VUOm1|fdsa)?PG~gcFFlGsL9o<#d128UTR(V6RL{cNKwTyfyl95XrpMzpr zSHsVyzGGkVy_9dv{2723xqu^F(o`&Ao8r!ZHr+|-l;Zbo3J>>fUNw(mxV1GvfteH-&~^|LamKTPiRpdX zasUANb!gmV-b`|Lyss4B`V=;t2`M zW3}tjF*n~q`uW6zYH6!>kb$DV+otxh7*!HCQ^moAs!5q3L1p^SSGyM0JlDW`bGOb3 zdX5RB{iRdw5to)lIWpReDU{8fkC04+RJ)DokbJFo$>;ps6vUdH7EPST*Br@GdE3Uu zv)V4uU%K6OZZu0;Lt&{l45glc#<*hJ0{WTGxEwI5xHX{U4WuXrFu@@`x%SLOEyCl> zg4^IHr)(iK9*B9IoShgwcip%-eYjtPn5hMF|4`9pHeGI@MFmoB`#=?6E{4w0VN${2 znAEzWaJ<&W`p2WGun*T^+NI2$cN=B50lA7(Xb;tl<$T}@dva4-0dtGOT`}E))`G$* zL=aE=6WN^NJNHwJmHUD>zJcEFSOS!c$g&x6kKgynipK(23`=kHVc zwLPX5Fdh&HAB7!isQgKsXPHR@zGoE<@T~oUjj{C~S>H9xNA(pNqq^pc?-<7CP`7su zqm1D~is(9qPb@IUaC`tVcl5uHpzmu>{rAX&&^HjD$iS&_G%6V#8TC`67sWW|<}O|_ z)JQ5AdlXdkKaOOf8p(sd`=3Yhh>RqtM`M*wx3dgTyWbLPI$=`Q)tOy-Cw&^uGSY=z~+K&UBi$u8wB`2ZUijIFxy z6R-Z-C&s60EIPD$HM_~iesS~7SD%`@J7n(u?qKGvce?uI^{i)IU2c!dlG3K-<8z_@ zniKlLglllO2{(2_mtg8;oA$2qw9OI(!8scg~D2I{eWMFr1WxG zt$o2*pf6UdLNfOa(|>rUYh?6OP%}u=(`xV%;KZLcpR*w!d+MLE62V9s6bu$L0={;z z9>=jj`M!@qr011pfk?Ad;@^=Os%dL6)3Sngn5_X(H?_}(g$V6l= z>=|-lo_KkFkETLu!-WTJ(~5=bt6(#(X%y$v_mMd;d~yEVrYTU}p!8NlHq8+q(?|u9 z2aHLlTDce?SXlCg-03$xny5@x%BJ46iIWoc^UXGfeA|~eDt&(!_Pbf$4#9qN>z~=? z!O~{MegjVREOLv5tR>&o1K&SX2S&V7Q3KmB4aOCwAz1TTG}VLGhQK%6(%AvEZ49Rm z+F;)``JRL*9YhSc+gLkPE%*_fVQx;L(kI)2v~S=#Q~5qJU1vAvgU;E#Rc80*)a(Y$+5JzG+c|LF&VlPw$>oXW zz!_&UaA(RIWW)b|ob$&i-b%E!H>K$VDekhB`g!-buE=g%P66!mvO(+PS30~=IXNWU zM2Njh$Xw9_J*<9BdR+wjEqo)ne}*3<_ggYP&$JBV`R!+L5j;{rTpH@lg_+~FnJz3o@qJGlg=P2 z1G)WJMAzf|II$ANen6{$M>m8W5`ODb<3fStnrre)8nM$ap32>;y~iIKt-7G% zKiMdTk{3tLuZUswZsR?uU@VcdSOukOt@5k=Ix)Z443O~78oFCb~11MbiMoiuKbJ(TJ)m(T^D5BnX6ad?;0C@d? zQt$J4FHOB;WZ{^QdPm*n@T>Rw!dhzDHuZcfCd!#_RwwgzOw$W=mv>0MieEC00ZiuI zGmVBN@(Lsjp-FsdSu!s=O`k);j2}(W>vY!y?=>eolEDdbTbbvMyBQ9oe)X2?oLR_q z*493gnf1ayb=SQa?y7EPNI|zOedW(wGozXIEX!6~mZc}Z7w`+)Dd53U==L?>X zd3Nv|;A!D`lc$(8C-}AS`zp^qoKQJjn9|6*ls0 z;~CF0i6_W2jb|3m_j#)A(JaecUT)@D$Wza=j%N+eQl3>jk5Slfd7j~Up65lL%{RbRyE;^}0U&A^cM> zx|htoC3Bq2D&He2-=nAJlO&Qa_WE)5l|3Te-zZ`J^^#m-hD%93rKE}JlCD%G%|5*( zNh0Y>r6m0wdJui<93 z`uJbD2KU_?vspIQOC4zTq!5qZXpH=uzVKJBv6DaFFTIp@-fp%tGhNLUucc$|Fk=u` znBAX9jOXR@x1{2{2W|S1U%AG3mQzqVFy}IxUi_GAjB~6R__jXiao4ckYbYmO|H*wS z`P=%(zj6)J_dMpx&e*h1|Hosl(u~{p>G_ZId+|Pf=Hsr38LoZ$y^p&l*mv$dp41enURW|osOK}C2|dsQR%5K9eYWa*wv}5 zgVK>>PDM(lvrc{DDDgIiZ)wjg%Y8h1c>ct5gr^(fXYowtspeV9lU~iT3+VPITs`vo z-m2DdgbQo8j#De%xOb6$_7kotQC!P&fbh?8zi%9xSwsTa+C%sAgu|AKm%?x{Zl zix=yt_B5PFJ!LOgE06$7DY3zPZ$JYN;{V`#ApT8;XCpphFspf9)}66qkL(pHzNs_b zYsN<?xCuFMov7CUM6G%V!RuU)24^AAo&W#2;5LEw5iV`;_S%Mwdw;lW5U`*$8s zmK^oR7gx3Vh|rqO5jMtCA7OrCMn?FYm|+bU#X4M`h5^KH^bniOyOOq4cs9Q0_P;1) zR(K|DZT&_KyItkpgyf}cRI>HOZ<76!xGNBi+fL)xyN{#nip)-VI_#_0|JHT3b-e!c zZ(RlF5B?B!96}3E!(Eh^+GZzBFh{%W!luZ1jCND!PV3#RpCns!^J+%!5ppE+k{Hy; z)R5TIFqqb;4CyWQ^N?H2Pv*~`DR%`T^y);8dfCiF-(;ZarUlc!2eHNj(IJL3*Y zEbm&RMEKWBHtFqfY1yw-8FNpS;c2*?T2#w=rOGMWrN8+*SHT7E+(8>IG2777(;yD= zH$0~D=bp-+YD14y-j83^&;7ltVAeYFZV-S-=Iz3ArgIoR0;E-Cd8rJ)dG+*RkZ}L{ zG$>U_6L8l=F>`(TgTHt6>G5;Eq&p98C+bc<^d8T+dVT+B0HcH=k=a6fdChBL=EfuQ zl6j5eMA>&Kl;KX}WHXsUWHLq}{PAnka!Zb4OB^p>UzZdNP#M3)scpktBiR@)pXX~1 zo5qn>h|bwlJ(Ainawrt-tGzPXy#h)3Gl{<)g15`_NZh2ZBz<>6%BpLo;C=LNKt z>;3U5n0CFqwPMo|y!AKAYrK4GUGiZ{h~(h(90S;0$-I1W$Tc-IZ(xi5@>58_{smyR z3dARFOMab9PI#0Yo;$810H&$v{SJ2H`iyx6Sr(KzL4K4nr{ri|@>e8DwclSl1=tln zva<9RCkL0~i$z(O^T;yUN_OI2l|`0o{8*}Tk;-UCG*WVuZr4SVb^^j~^n`WEOkN|I z=DJGUb)4q-UnaaJ}H#Gv&B~qKxn`UX3&f|RKKmXv$s@QHm+@OT{2s~5qp;7mG&Eb)YGmr&$yMDo2g3$@!}U7RitaAD|jP zih}6La!7^Q!A-5sWM1wC`X^7j#uWW$kc?s!kp{^D+w{;guAzfR^v|;F=b1eq%M#@| zn|XbT-y{99EMp3?^n0FhJ*k)d(Um`_whG>uij|A=G2CuyGX zAPACk!CCf9i*ZSJ&Rs*#R|&sSEv8$XA|Dz&fy9i^GDHodQ}5%DkSfzIB`3+*ZlgA> zMQnbGlr@UcnD(eyqtVuNg9!V{clIv;`HbK6$bq=WkXy zC)nA!{`m7lv9= zXZ`Enr8~xLnSi6#ohyT?=X&NlW_H;0Tc34>&-gu1M&LZ+gcn?(xYGsTpIS-w;4zz? z`JC$lTZEU1&$%kPZ8BXXzxt}a_Bq%28Por$zx2`Fjq(o}exgr>jTnk3a7ko_)*k6Uhy=(#-m&^}j#wx@ct8mohK6i})`X zfA9&3a{Q3YiJS*lu#sZZQY%r3yklS3^r{zJH`;#A%Zo3#2G|n3{QU*j{LA01?gFfH zrGeUdDXGm?p(R756Fv3wfoU;0!SoDexv_bkq*<^uSW||?Y2>z`@5^vlxVAE}mGY*H z#q>wkbGUiZA70qC-ZjKJQpwqjv2)0(SpUCrvXX;us-g^_JGQLIqDaG{)}H!+jjmzm z{q`(s9dQ`xLGDS1DU@qC)E}(N-C){r&w2hLPwZaQj=YWZ#MbDGH@XTh(y!rM^HH;k z0aOvvo-q3o(mt-xrj}J`E9I(t7(rSwJgCif25T6f(ObC2Q!dJM$M7_djkG66KeExa zy2m1?;FL;lMdE6&>Y`rz7uSz6zRc1;`3r=}cD?_LuHnNUg7~Z8+RTcYsk!QYl*G$gkepqbl@+)nP#=>J6 z`mPsU19HBMJg2VzRDNUhFJ5$wwC(&l6^`8PE%2!mf zrFE}<=w;U#*5~yTFT2jN-ld<>=(^ZirvIqXHSp@PAU=4i$^zQOUd)pM+T_A=+pdt- zw;XG|nMMBOCDqhgxd>&~Hoxxz&)Robud?dkylGmwZEkKbw#iv;yM>XIP%$g`gGz&^ zix=K+bj7UJ!WVAZ?0U(X@oqnT#8&(#6@HeQdO1QS65`{=+q0PBkIX5)9{1u1kjyC# zYTS&JJC$ogm2-?MrWUEY0ocNr@YzI7AB_p<^pUJA$mQCJ=z<-G$I1c%wE4){&j;e7 z#!g0hWMAdQuCPi%f|^a;_AIAH^zB<+W1=^B!CRC&ztB_kCI!qX;v;Xq6e%(XdWE7} zPBhmt#9Vesk|o@6iDN@?l+E>KMdDnMDrfHs#^>2NUc^r}vAD^)iqzM%C|8O-syGoj z8*eQ0@(F*JU!07V6Y=U*48HJ_S6sJQYyJk#6yG)LsJTMBlKX&f z8kcfPvn9=%$?vy?EpN_9FVJflW`r%N1^R|@iTds^c3dIh?Z#&PrY2Wqzw2`3^WP*a z=RBnEZDI?(?Bmq@m801|ZuF&i@e!&}z|Ur$(DRyIqpc6>7d5;77~M@h-^FcMY`uS$|_Yo+^&vJ(w+WJ=xUV%~x+p4*k_2n>oPBaxO7& zIb0|ZYmCL(hMxXD$!Ba!QP6iNVhEz8mrY7cm>#h>7gD{>{cTys1Na_jD~O$NuI$U@ z3)Ihvri5dJ6qv|vHjc6zbkxhjSUg z53v#!ynlqK`#-i>Ao|Lj`rt%nUKEtt4G%Nni$!wkFm6S15Nu*Q8)yM=yxW+|jTu4gm}D(0pCo9$n+?kc8RSTfVyDEFd51o5n$wYR44@6# z30V(O?RDc!*{`&Vi_8|ZKPfGkT%?+iaGc>)091yPQ>-dx~j!Rr+I_2<| ztvN3KW7wyRHd3tP(A*x$#l`JG+;1#WZHD4(HV*OHG}${*nwFp!iM-npNf24ay^OGnYDgQt*I`WQtK{_qnGK% zO;^d5=eKe7_2k@Oa!*jp?vRm$xM7;ga$$b@>m%NA^*`f_ezbtY9td?V&NUW;+0B|3 zs3NW^9EWfHoL&MEbe%qG03G88f_h*eIXwZfs|zxy#(k0l@IWZOpM=*+LdfriH-N9w zBcx4CpG|s(2bd68kSS`NLoNYN6s}y`9+U%5S>zVKA1MeHD2b-PgbCOn({1bm!sU1v z+o`IgF+8rR%qdt~4R?Gd5bpSW8@0w~=ErAxL6&8!mltxg=;|3D)4V5%GTwt8Z)2S4 z+;>1t?Swbvj%0>4(yNsIUQXfL9L>r;T4F9p z>1leN!kn3;&a@=TvY8__+J*2Q0 z_$oSg9>GO)n#S+iD77hBo1kYojGrEgSjSMS9710Zc6pu;72dk(u+zOsR%W%Fpjiso zaY;NE+2~2bl{fe#hKYXVVm*{_3~B7(dWDOz=!LAhxAE}U9DQu7Yf#k`%UWykxEwr` z{i2z`6e>BRLjf^l3JX0=ZwLZ>T_BZ(n$vd7VfiN8Sv%foiB>WO#xxoq)UMQvKSU|& z>&@cP)L94cVs22&P$YaZ?@S^#3h+smk6>HUYq9IbBIi!87}wSZ)`Th#mTVW4h;2tN zDRh9K?tcZf>BR!E2*vts%%?o#VJS@J;*Cg~{$;Bxx8PLVkGsSLo2G(}^x|i;`$p5c zNi2`W&}zF?`|RlEGQ6&8J8?(9!>{d)?a092q7z>ld%1Apr!RFRWAFT>G_UNi!xF}6 za_o5Ta3wC6{iXNTJ#$8mg`K%(Z-uslA>La%%xy8Ib0J7-eGlajxIJ6|BH@rmVp4`N zJ$jQ&ErL#1xaF`ig4o_N)tjfSK0&t0p?SGbr7$WRANEjYa_H9{p;D7W|8?50Am!ME z_P4-B;bF-%2+ka3dO-OEAvEZwYZ0>3dXN4 z4#p!`t*k^M@S`A`>)+pU=xeQRZ&W9PuPL$AinGg(V^<@T-J?}jLp}`HCy>m9SYq!u zMfl;B_vGee-kTyOt7#V;@Ed~Ei5}dj%@D_U!2#QYLw0!T#Wz53BNle@&l9XWZeiw@ zoE=Q~#YA8U^DR1ZqPeF1j z(VeC?jQLV8b|yYSp{hMWOQ=6#)mZmS=W;*inS2q(cHZ3+(97aX$JQ!jY6!q=kD zx4HWdUF9T|41~xZ#THw*ucj{23Rgx@j zf{NtZ+m=J8ih^1+)jehunyv9Y107 zWKes_`mL}0fe`Gn9>QGC^UM+TRY*%=PXRflN(~ktxJB0FC*2IB9K-gNc8}* zM!y@SXUKLEIscUJZt6RHE>)C>kg^+hrUhX~5M4SRCqXdo_ya%kDZhNaz|S^E9e=H= z1)%W_4oj5g_M|>V_uxHu)B4Kqqev`uT(JSSR!9MJ*75?DsE{Aqj=IvSa#qEh^=@{c zxuyR6$gI$a%^d3Q%_+fr41qb?kF)IT+E5~UM=;*Iu)?=D%#pb4kZ;pM7sui_UFvIG z=p=Pf+gm03qOw)1fr|aO(6UnATnud{zj7m6Y-|1&bEjGJx-k=|F4@NvNp$GiulkLmKx{IAd>j_>Wrb z;XFSqPGwEde(VsYvlluLo?+frg9i zVXm9pqnzEMW8P(~?@LziOF0FyvQz)M9Dw!Z+<1sp%yHjMxpR+gLW5@A65O;sw-slw zve}tZ6euHySW3PQ7khNGHS98}iN!+2gBwj)Q0%0L7xP7O?iKbo7vG=TJ&)FXdQ15F zu{YO!cH=GASGf0ThH7=)=Too0CF0(n2qry`YR4nj3~istcGlz=NsBDCjD3@1_#ub> zdA56O^r27G%vl3*$GyC^;Tg)I@xr{8R3h)$LZegwP@O@0w)KxylRO65X971+Zj8Y zS@(95Z9JGW++wlDb6P)QIFGdihtTu9(WI?CZe8pS#@>0E@4{4}d5a)L83<}S+-p%c ze#SV7qA6Du7WEW@<7Rlsl#nHN&K7-aw)=-s1)rub_1x>M7Q@G)MNIL`^}Ih_gHPr| zM(&$ODT%H+Wm+L%NE6zwp+zM8Mml6;uSm1LR=#Ps62hnBDmgqQk5~qB3k>D4^(A}#gK{M7z zO^&(b7PxP7VgjVH8E4K?cvUgUPSmha}Fl*3PtqlOsi!b zzboW7Jtq?xD4CJgA1jKgq_NZyI?778uW?J0<4=fH<=>W9we7ox3){ze*#`(P1s`5G zmU+h42M`L1L>B@s!)7^(0>-*t+)r5MdddTEp>P(i8_%y0C{t^QK5c-gu<$EDmw#zcJ3`}Fc8;6(vWEXM z>e08(`Kf5leOn?+P$%c&JzE%6w%p}Z6V%FcgYoiqWP5yRjluKfeTMm-sLYR=0dY_o z?h44?&J~N^UNmaYyoj-fxhOI*!OKq@zNu|8O;~X>%Z$agID@{o7Pg*}{;APR3xEfH)lKF7 zqMO5WTIRJG`m4R&gYuI@-}yQNjmmrK@B8Yn!C$>P&wX9AUB)%GHK?F1`A&LEMppJ) z4CsPd)$F!z!P5TXG5ZpyP>-K+KL{Bh&+t@p^wm&}D`eXqgS%hRH&inTM=F;{m_4AV>BKVLpoVz$^}30dOrCr=9PL>*v2r>uuDXdei+*%Cd?xJU`P3X+ zT5MV6G|u8R$$<@#d@5Xqc-rV8EsHOuq${0BsZs*?hU)`SJy6c(&rPjFFaL*`A9b=3Y{+^`|(ywvQF+bv>`0tHpywxe-O^;J%WKwkx;U!Qur24iEv?1{qzM1Vjn&pr8^k=U%`-hIWB$d?LE4Lio=~{ZKsU z4aLjYl&f;}r}N#8GDfSKQE4hWq?#8G8pO976Ih+no+=IDyvWCACo@F4##*887B*aR zZmp&(59hmkNB=`9ts+e6T8jNYl%jx0x}%&6c%x_J5CbWol-}sQ`X+n#J{PRP7xoP6>i$BWCC+JjvLji^ zp?ReuKf1*p9>UoiSL|(1(DPFL@Z#xi%bK;r%ci^amHpf!qU=Q#iA(GO{81J~s*i5T z2wzzqpPXA>nh~z3sL2S~#Gg;Mf6r|Rjc6{{W}Niz|4=-vo#WRk?Ecd8!`&-T?E8~k zVzPN*TU#H0{NmiUT(z<68s3)W*E0N+esqg9e5Ptt^xLgM649bfI=SB<9UGxsD?S42 zp_|1;9NLO7^fSl7y{C96#Q1xKgTI-%M9IV3wW4l8Hi8dj1&6P`x+bI0sxX8gty2>K zcwJH$tYC}QP8iFWa&<-z{Y$$sxU;l8vowtCV%wA4bEyUG%2bL*?KU15E19~^$eb#rRR*E;HcZ^!*zf!vtnRsQq zPuq23K9by7L4VO(02PVx>wGtlwXeFEzs_iRg_aGo58yI=$-L{>tU@)RvANv7Y2!cz z-hjt)VHgfTSl$5B-CU{{&#v%o4);uM_80qF7Pk5M14u<4XzN{}l>@$#C=_Rqv#k|z z4%%E*h~e!v8Te}b2Q@T(!a(;hz4uc&1EU-!tYxs22c_fUU`V5(pW-Jape@QaZtX7i z#``$PC+6E9s8L<)6eLu0CHD+B2JmX3?G7ah1_cro$%_-c<5SB{;P3kza`;khV8Y?&h0_l{?;qlmyJarSs{Bg zEHp4DiqB)eUyzTle7SjAIqIuc+zrYnJj6A#_T{s1UuV@-{Zq-ma))+$sm$;1VgiV>Rv+U%3)ZJhr7ZGrfe`JU%t z*F7XOamJ~H(Uyu4d({#}%jS$vE-Y^&Y; zEG+jO^fZhYs^%3s9Tr>1S%qcr$;eB08rMOE$<%}p(pJm7V7+qfP1w?4d={U=3~dX> z2Z>P&vos|)zKXqjQJEOGFi++*F&$->iY)qVh|$9e8XYsYIZPum{Gw}@La8}E{oIBt zZ9p0!3Cg(pSLB=@U0q9RPY*x!V%($s;M`i`Tr%T;>hq{}x)Ky7tf4^uHj-M@8g`YYe=SS4z(|L2a)K1aHFdaqP# zwetDWyHmXi=2vQExbL~hS!tUD@l=ktr}7WJtGB^;wDJWtTB@@YcQDm?)$4SpGrm04 z>3_C$?ewWlRK(>7A^ixR#(ek)9MF%QOkgPPccO_g!B@7t^UW>qe6~C`tww)TD>Jtj zZgL0O|8qi>PNf0J|9iU1M3sF%n0vC51*m}B(&~j*B9{vc#zIPN39;s+Em8Jg)fjUb zRj`QEZpVsCr6uKQt*#i6T5_FfQ)}+uyVp`Vg8v9=CY`KI7tE5&sEBR0O8||D(!fG# z7_CaT>GUS;H>4tx{V$rNnqDC3%@Y4>lVpfy;`l?2kZP0fEoqgs$kVV-c3QRLgQVGs znB7ilQ%To)7#bXA&^LSbBDYa1uUc?6$N$hq;TUzk1jJ|0J|%NIjcPw`OjDVcMrTLH z7?V}*Dpbq+!oz|ZrXao(qD9*;G-{u=kBl=rOOxF_CUzyplnVsCE6UrZ@v!(x&HzP}rlt_FCXfXjwUY!vwtH5Ht=nDzrAFcd?Wjl{^dhQd&T> zPbONV;Xf;66O{b`ypO|xo4nwB@aemA7(mDCNJrNxQcw6O5Qnlch8JA`b8jpet@da3 z1ohAJ{AP3*0j;G1g`j`aJF?*g+%2BVd%Xd@0&2#Q^8DQWhv#x1)n@(2!`%I&o`Wqz zS|Z*GjHx6Np~d{>xt{PAo>x7W@p^DC5Ovt|;=T%7OJH2j5ISJRK$;+OhZ>V+$aq+@ z%u;``=b^?FxF`^sKc-U`)YJGaiO~gR8IKU!c0`mC1u0=z{q~5x;k>2B} zoI%ktCaY2)rWv3KX&)Nxq^Q(xa8_z#E3`S|Do1>Av>aE*8ZIvz{>5O6P@27m6S1wE z`Q-98+fgm>xjlqh@wPumNZ@m)e8e8%Bevpmb+*oY&9;UI5RC|sU9-Z*El1JUk}c5Q zs~bqLDqOeHB8*$42!--^jBi8`mdGg)Gn@l2WQcsNd&)4Eqc#NuYoX6`{Yn5{VSBYg zd(B9Wmd$l)8SWjlS)XGXy(@rj74MR%ZFDLi4NN8T9{iXIwvIuPlx*_(JhxrI+_$c$ z6`Xy0o*%6jj`U)t+IWe#V#F63{)xA1ft_YYZ<8c}ozl@o%eZye?vK6W4F>=M=5t)R zwyDzA$UWCv>_K1qLa)4mGTImQAy4k4(!iEne6t63W>1>Ndv+KOXcIok7B&Zb?#Nh4 zLszrO5E%rw6dBsqH!;;p_x$mxL8$ee*?+WF+P3%uv%4;G=~Z^yyu&%;?&NnjPqg>Tz^Gd6v--yHn#qREXlkPA7!Bb`SL~7Qyjz} z!&fl2BgyF&Sc@A(=;Odpq3vodXCFzJP!bSWxv`eqiHqut-<^xmPtJ2hri2e?VnUY8 z`vU1F=}@TcX_~T>U4U)i8*UrP(MVacFWEb9KPiOY`f3HUgy`URM>6zHZ@YTy>qccd zqN(Oimr5fz>TVmE%v(ebEoTBj($tmm1!LEd%)6FX5yeo6C(t1Vo*=;#hBpy85c;Gv zB5xu|%XbXodn!wM>ef8|J(-5TroCgKjUZEM^+L78SkbK?-9NEuA4 z@f7N?pymwfm!IR#%dV)YDj+wEUd9%^_8fPgj9c3E2hMR9-b6XABDa)ZOhhcH{Rb$y zC{%L=6x2n|ixUO?WaopIn$cVM`4Px$YqIy_BUV(gS+I@1eG5M#qG#fwWJSWhofVL8 zr&;V<;L5fyjk}rKS9R2IeWI~txvW_O2?Rckq~e;2+)!f7V>(Jp>GT=Ucm6&j3_tGR6sa<=dQj<5)Z@YK80N#qD`Fy6gwB1Kxm7gcDNl7MD@ zB7i4lyw6Kzjhq17ZG84zhMceN?esJ}F7c(`^VI)BUbOClgIi-rYnYy=>AuTkPZ~_$MphPXZjg{2eRw{V} z&m0Y3+gb8k_^0eza(Jpgx+b&Ge)Q0Q?Z;kEZqkm60SSJ{xiwwpv`VHEnr8*7hM39F z`>)<&Y#)J&Wvl#oS^jL4KhN=Jo$<8%Wi5A#j{f7kt7&(ZB%|iMme8`(=Y1gq&AfB> zu)swx6@S{iV@t`rXGgk~F1LFUa;r8kE4pcuvr`j4+1_>Lx9{$p`ELxFc_#jBQG2N& zJwr{an)&LZlkNZiQ~%YU|NGQ8ar9GWK6={JPlCkjIzj*Q)YnQmol}21wSM>18=s$E zGE=W+KKg$*_4`;W#xD8OEPuAhpO^Tv&R8#h1&@Dg?k@weLv?-{(msXLEX`lZws)c} ztDIS4-MaFOcCEm^2gEfou0pV`O*{b~o#ioI!c>}N5 z@l8W7j8SMh+oEq}`}{NMb^!H^A6+*=*Ot79V=gew=Ic)9i}2(tk?{u|_?F{M=+y;eCu3yCx5-xoGZ zTJ}EWb-m_e@XAeR={9pI%J36-U-#ZpHMQ^HSWtYyByFyb_g&59243{sMNprmS zN6?ozSSyFIeXdr9QJnJs@&Vo|H3M;2E$0v9JPGS>DTgAFHM7ea^+QA=+5t`GSvwQH z*Ea=Z$z|jgQwO&VXHnH$2G>F{v1q>C)3A*z zf}>(fy%yZ;3sZHMd}~X+#_j55I&Ag4BIBt~2o?Ltw@72w6&WNoMDn|ozQm25NQ$oC zKr)!yYO7IZmX964L}Rona`rf5gnE$$3{O3dW>}0edIrabsmD&EH*BuhF^IS4){*>? z1EuP!C`o?13izmJflq?`o*;1)t zaS45c<5*)D{`R;Sw*^^h`MSBDMTeYoJ*ygh<%TD=ip&A+`UgT<<+=*Z8my_plw~Vu zy|#iwEun;c4Ob4?+3!P^Tm*dUB_r;*pAZMzcfnp*<^~DD0>+D1anD_Y6#(p2b#RM^ zv!qet(O_S?nnU_t8aFQ(uY6djlrLnekh4?#ZIsxq1#ZJ#1A{RY?f>j-KeI? z0kyI^89Fs;#vC9<%a;3UuWQ)8s!WcbE(q52GhQMbQ3MDU1-tDKIMmRx#gZj58d39g zDxDbWZL(9|b+U{XG&DwEA#NV#c>ML1KODX~s9n0cRZPv+D5qmGj@qTQmD($E?IHBV zo;A!oq8I3m0J=%?1`!hD_^vlRx82DC zmLtSkCay%2gD0E;7<+E}R0gKz8ZYz}q5xTiwk?r?N2e6pqn`TLB+|UXq~Tp<57V%j zAc^%fbeGXLbGnTOC1;|y4f+VH@;%08uL8SWM#-mvBGHS(gjG6c%iKJBE`)(ktZGyn#;<2@Vm7-XIvfRy~QNW0b zmx37%^8Zb|9~8+75g0Xe2W6ZPt|zvX6KK~W6?ckMyyP{4>b446Ii;Yv=E|$L{0V)} z9^;q)kS0ug$zR8E6&@zf??aLp9LMsJ@CMr8BxH~;(RzhOyI|2p z61B1eEILi18pK`QG|f zbE}0JzPeV<8DHngot&>QBpB`i-!{)(!t)8X6wCfGyjS82hYBA^wHKxPj)E(^bBUO zm|GZ3_go<+c!1w-qcCRk+Qh89Pzij}OTtau@DXXx%|=XWyq#+XKe3 zzYA)+0o%P-jXEh-P}@>o6l$BU!XGIhR&fR)Mi-sKtis%`gmvAKMw(w&%EDork0Mn@ zo-76{p8AiO5#wx%3qVa{X$e$6#$j+-VJ{Xckwa{0t|fe>kx3f#GumvVUyBdIqxueo z%j>?UY^EmEeNP!t0YLTYKwAjmF3SP@56P!CfP(>OYBm6fl&B0-h;9Mo4f9o1(2XR6 zRDhX}MTN)_4%^Iv0s*!F>YHrkLaLY-fEXD}mnXMgxk+Y)0^O&Us7c+kOesZ(t&orm zDRM`PV*2)P_S!tRm zl9Jhk*Mw}JRo1Lha-pHdCidG3TT^&|85B*j&;P*;6O3KU07tGyWK$NoyvqOzkCLlK z2ZH3@LfL-6ptI#ql~t{$V8U#rj8mDpoWLQ)G!8aKwrd5Dv)P)GTYTn)ke=H<|K?19 z2nI%>zPhcAr0!I*L+Kk=^v4oyPqDLq6w3a^$J4vvxHR~19E1up}fh!=G-cGcF4d$)LG^>W$#9joP;sMB|HcHd7E1*Lv>%y)MFf_-5%tGDvda0&%0{Cv zA;~R%-#-?%!_yvyR4g>Ee20m&Z3*{Jg}96gGo%x!W*#knvn;}i%r4_7;|In2Z=h7Z zP6j9iMv3x6!6ufJf+ZR5)JVT3B$bQ-<8ghRSf?pPbP5}b4q9R3HERX=TGG}f->HK> zJz+~aEehnc4th4SUQt4KO&JoUIRBMiTxqQF;xkDp#QmBJ8?{1KdUbMB1qys9*J@wo zde3c_fa#$y#|av)-N6-rx0X74JB*oqO_R$3(O}IL2zizL)@J}SSC7`e%LE#S4oi2N zL$;ls`h7CJHP_gc6!c{xIz?for1ww6AI+={yF{GpY50{&ev6%3M%>0amAs%xgr;v9 z_w&V_h%h?MLEr1)U@)34_C}R%q!O-vf?(8c+(Zb@#B)QoM)u5HtRAp(nB;lBw`If* z&O#*{(LsHLlt6SPrO#ye>odcSqnXZdAv>E@UajGNyxQf}9`5e1&*F>}X)=jDV^&{=BMLJnSacm-+lbVz zRxG*)``4evYiwzmC31mD6o=0(?HkEOw&00ygf&_%l8ZK5pfoF-r`d*Vns6rH3tdMi z7vfHBC3A6fs(r4f{w_+5Ew@`d^*2Tds1A-6~9hiV=f%D ztOsS3P=!$fqT!qJ5dAGGPFbR1Io0E&Nuz)0zWvPe;&v?M$vP-+7}mYV>wTmeY9d!W=E?shcG z>uG4GK?wZ;ilMxfE^&J5|G`TTrV#PynCq4c_i^dz%;9O8xHNMpEX89|#Is6j3Q230 z>_xssBdIaMW?K$CVM4yg7z=;{Jqo1mHETvmRdczMG${TygY%~ z1HRp!#P`Vxw@jfN1vdWd1_Fhulul2@=~xN`vF1=c`rq{=fRnL=RjEhtFw^!JB~!lm zJ}ce_tZt$=(nv97VDTO_o~QIu>Y*)!ULt4TEl5cy--!6AowLSfDsmvjC;e zQ2_C$5U3TlZ6+WdQbq1E;Sd{CQwAM{$VdaCP(&sm!hk`PpsC)S2E-OKcM1@<0*I2D z%qAf21Q4YH6A*=~J{;DzY(!K`zm<6qt+8NZE<~M`=XxdYrUz<^b--mS6r{>ddDuPrXdxsrr8KU+dFfn1&Amljl248d5f~E zAwj2m7kh^j7~)Nd()C@_-Tg{%J}Oc)ZvgLU3Z(deE_<=?Fr#JM3l%HE?bO}UcmOf# z-qib5xo4dF4aB1{oOm%tGra1Bb1Hr1MH5$|mteBIwy;);nR`Hgpvqk^;k`E`66Z1T zwW@sl6|jnwq6B1Y^vGp`Ft-=dP^oy@mWphUBo^bzH}p@d+=DW%Zq|FuaQCxqZqCrp znc*Ijao{!mx*6_agD!0rdOhqCq26v|e-rlBCs=KYv;Fk%`ja!AzbYg}^hIDtUwmn& z-D~`KcD9gqSUM35l}2ZW`!&@o4Uy``MoF$l04t5tx?g3S-TnTV?xOS5#ydh7cJy?( zzkOCQRc%W;hhipWG?kUnG>b9yb^Y?0?m<((dPT~m%uu4j8<2}*XV|rF$-J6v8En_g zugJF0Q=o?uKatf^_B_#bFOUj^4MZGk)af-d+(pHfZC!_Q6-675izGpW1i#=#2?_4u zB@jp0xaN@FdzRbV`{8b;9*+BX5(5t|>`1ci^~zc9zGtt2-Keq#R?h$ruzKVW^srOw z=QL5vx>@eCNB@V&PKl&HURGFvWucZ4Lb1bFk$;WeJ_{ktpBa;i8f!&j21}~SSrIQQ zmgNWo?BRN4sy5`vN49wGF%Ze?Le#XKB3KAr#!t7=);nYOE zt6U76a+Afiu9ey*qXv>vJA^vJX^bX&eCbk9C%}=iaYBn4=yE=a`-GfbRdj3v<=We( z=^(yUjem&%N_HHj2vFPQs)JO}VH`y2o-8Yl;b_29e_T4_JL$QzotGG#@ts0<_*SLJ zL*tMK&7fe-Rrz+~YN^h)MfH%yewDh|2@Qm*xQvQb zma+d{N@3Sh`kpGqzg`Afwp`<3?syYp+bK z3JNNJn56#LL`%4@k*(S&N`wT`3%@qj)FFJiUz#3W`VC5i4|x|Q!aMw?HhALz?@T5- zAZiw}f-Tn5!@L@?bfz;rNvRT)1yYN-vf0rG-qMlm+{Ymp(~1RkIE3pJTPP=8URxFg zM^y;&Co@Jwx(FSEB9Tgmuyr5~PNQbICRye~%!7$xuTa)+2=pN4*?c6IF(19fx>IGC z^tq7o(vKkRc!pnv8ApeFhdsB6a6RO^u5hX6b_}{HTbdxK)wsnby9Fpz)=QZ-xi>Xd z=}&*(eMS^N;uh@DIMiY$pg}aA2H~?toGUj{2R8|UjgT1{che-To#?AT>a&OvR}559 z)v!I_DaW5ssBjj?n>_XR5tS(8P+S)0i7*#g++TStt=R;dp9bC6jGHo%>0?hppK8f~ zJ1mSw3ui-5gDoOB&H%vib86<=AOLT?o+;_@b8RGF1=7!#ylNzA)I7F@s|3{7QCRxU zI0~#Lj&*LrQ>%C_G=9C;1o;vUv;LfSb(nRn0$!1e{OvhH>bA-ze@Ys7B|IZGW$QW* zre;Pt>xRCiIS3yd1JYy?*`}bs*$a0;Yi`^kdur<2I08Lxe)$fqVt`R4klwJ8Q=NQI zr#nfyHjMUn85?<%V|*MNN+Ub^SSCnPj)X>0v9dLV3Y}f$+Zge%>fqCrwc8&Vi}F$L zm3&lsw&%{ZYLxLGTr)4*cu?psbQ>X?(W!P`Ls&o?kCG(0>hfUCE25(2v^HKPWsTNE zEXF*^rJ;+qwO3ptLYaUB*oaPbG?8sH3Pm3VlBot=clRgvRK#8p>2LItMus9NF#S01xKTI54-!+V1}!GT3Wj53XwMjYnqU*)Z&vnL02rs z3ka~ltFaYDDZFbp9#cWDn0Qw=;}zb;=`5;*2wGAj0OkP=55y?>dnqJ zbo~IH0drF5fCD#*d=vjJJJ>(doL$#FSAXCd_i*b)`sQog#VLAQiTTnDW<|V*KR&5| zEoyTG_OHpq6kVY;hBVaCE!bUGaH>0`y;;GLw95F!-ft@@lp9;WvuxBy<)e;@{7$4$ za&@+x7)dOkZQn2^lgqW5T)!`RG9vbqWzSjtzON&hSOfW=x0cm&rEhutQE^d)(m*M_fVPwvIA9=O%&T$RpHe5n~}l}I&bo*oss zos;I2lY?Rxqn|g&ogWni@#W4+UzO8yM~qntaoB^qOPBn(0{1xRtSUzAuNbj8=xbTY z((fkl>kR?PMU}q&i!YJJ78(6%skE_(`&Ub+Iv4w7&3oJ4@zZ%x7?3YtyUw1O52#bj}`fngH04TNc#EU8)2sxWM+hfq#3 z=TbsBkNTD}iuPWqAGp?i3qD01<$poWpUAr=^SFL>jeCrKe~o+AS)-VqWQ%d7S{PuJ zSt8)?=@&nT79&qWV;q#wTWZ|>ouA2EwipBSQP;UgSYOt!xz2t5xd}CFpnPKfsNT&| zQbpV%K~e;;$UptlN8AH4y_(~ShaLJKZgLNZ`W|KQBvg z7Yt5f;@WoDSk0WQGf!I^xs)Mhc{`0&N!^(5p7{M=eh(MNjK`&#zjthRk{j37Jz)(` zFe2>1q~mz@Jr_$ab{aF0R?4<=&}ikYp>dgm^liP;E`(jiHxs1~HAO0Q#SFb}fqP_z z?K%DF1@0ju1|jqW@>yK4q*=+l1J5!HNT<8w-Ch>&IO#RQyW2V}`qvBG1-8$a|LWV_ zeQjUf;m|L*)m@{1daFA><2PUH?uG7!856(OqYK?dJ(n5Em~r5fKNl!*{OsoreZxZc zL$(6LqF=eleQy4+ldAh1c<5%xZY|w+8v{@3k1TTksppdySwRJybCG=xsx@(qetpSpQvBJN?<-|PN}yLX2Em0owNyRVM>sOTA6K2Oh+ z@n)$xtOH{==31AT-lRwWK<~cTUE-a8D%ol?nG68T(AHuGV8(I%2aDYU`>p~4Lp3_`XW&&hm zT)8a6vW`h^9itZUPGci$&IE&X9s0RT+=B~hPGw&~c7ce#7>|VCH^y9|-?+p*XY#DE zD%fl)8-6wIEt7L#+^vXJ{W>VPb(@UrC#;blOPFKox0+wf%($1j&&>W^G}ZP;qYk}v zsr#B<4gZI+_W+CP`1;3p@9rvc=dyq-AVpC?5kXNz5iFpfi-Ns?J+UXTgIy89g6pa= z>WQ(XX{?FH7{uOC6njamu_bzOHFm+e|IggJpx^iX{{GL)^DKAf%$YNN=FFKhXTTbM zl;H^Z@OauVLG%e5`U&d1)P}hUwuRBtb+Fa?o>RX81q92{;(I7Z_GhkI#ITgN^56emPiloU?#6ZFQ8GSoN3rU|`=QO``VjqczgN97buG|=8mV7`8=RF3e^W6GK+`jKHY`gG_b zTCkT@5rEWvy4YCg=Rj%;B;MCYjum}Pkbh!QIW6O55cD!-Or8Iiewi&c67CJ5d$Yw@ zVa!kpnj;PpdW4f@j<{9$F^rn$ig`lGNGiz{>kI21Q|Mf=zSp2wJ_hFnO$Vv+icRQ1 zW9Eu2g{Ix<_qixs)%lLRSI;m|O^X;KbbO%ZJ@x_JI)k}ykwx^aauiHndA`(a?FYzm zlWr?29%Bvkc%GObYzm=9R&kM+3`ODG)PU(z?V5C>rOz9j z4Ih=y7t;-^*w|wO#t_CdOw&#o#n&DGixvZg&KJ|9C%4Mm+&P36&PUt0eo9B?i$eoj ze+cSVtE?M*kT4XbsL_L>P; zsi510;rM6V+*5LA=-cppiFF}g!LV;io0ZpXrMOR)e77Hq7L7Qo+N&U z9@b0o3>ShtXzzDos8Cv&?tdp{2w9cslkYKD3zy{0`d-{62&-K=f)DjsBYrAWcg;Jn zMx3P;mbq|8n3giuVg8xc#gO;iI#Cpaw-@N=4dObX^94%XD9#sp_9S_uI8SiuO5-+( zcZKA0)ORx$$Qt8l-exgT*RH)G@4{yBy&#O}Mi;h-y@ZqwRDY{jBy1T?@3)HCI`Ky# zFXvaWgH||@ly`BPxLhl+b~I+YI99NCrhD7Pdb;Cw4ORJFJQ}up1{Y1Yi%S}C=18k# zt$YG1GB$2BJVV5)F@H4{Uo}*&v4>cmSWB3?pQ7@_n(i}W_-N!R8a)EI@b^{>4bKx> zczC$*zFUZe=q{ddMBi=kse$(AiD@pqc9b`G`g;x4+97@}^o*y)JH*vO#u19j#~d4b zghu9zpGztIFp`v!)4#QW?&XVS-PSi6YOqrr?IrDT44o2X=sd&F*(aCorky)cvdDM? zo(2+Ive$jU!ntGUNr?uE*(EmCjeM=4^j+dfT{}=p*e&+*c?gDSAJzuD%{5^T=Q*r0 zI)nTN5c7A7K`G~VDk&vI51NziYUz`soI}Zb6lf4<1+2XH^UkwoFlOki!>-7+vK7RZ z0t#W6u8TiM8u)@^4gFK>E;OA&GyW87)(@J3H~x$vH=zX>?gaN!W7>Hb+e|u8-0-O} z^&-Ij^%a!62jP~YrqDi{Si@MI!?<2Hj~6tB9^1qiO1Ok}89kYXUlP5XLnbT4Oc9f5 z{w1t9_DS^1C5(ppZRzAC(WleJNiZO)!*iiX9Xg0-^vQaY4O2(KtGnk8-<}wJyx>XK;JFjY^@Zr+%rOd{rTMdo zBwU5zCL>s2oBLq?XRMZk=?0xi1V6|vL~6!1<8DV`ywzCwl9%dmSuefMcTjwoucMt;#W2$!;9S*;%x*R@ z28I!h)-Ijs%~i39j}sXGW;nraG1e1Pd<-{DR0&Tc8M;oV_SeKPJs6uq^z&n}Pc=6b z6ptK9{HqW%R*Q3VAlKl82^9K7Y~a3Q$H)E0HT>%xG~$Wq=`u%!EB)n*9kl3)*tY(t z@gKT>SGdvq|Fiq|QBc(GKYF~{{S{bQ_wPSm?fw&FYnN&OZRu%RioqUZ7Q!<_VJ7qi*tF=u9?BhNjt>P$s z+)s6v_wk?)@%^0?_lG_nmqC9$6C*2s4&L`eA4exoN~NIZV!MFN*i{ugO_lif5U*=n^?}Pr3KQMyv=GDp;QI`&+wYcBBcBMV8*O|czKpIj7V&SrnsyVGS8+SK6nE%&NA9}qqtrXV zqom%b%n`heF2BUCJY>uVG*i*9+~X=;#a9^sS5(J(=|Gud3rD$=cD3Nu$b-rtID9*; zwrR!~9wDu^fAMGp7k9r}aI2gDX6}B~<50obZqj$${iMhKf;T<)A1bb#zz@>79xY`L z7kynkp|<4U&g+5a-ZWec?ElZ&GMG(yNG49Uz31W{2q16`EklwID+t~g!?vyF?14c6 zngpmBs<->}7&(qZ(*W#Fap|AOleKnrD-|bywTbGD5F5I5Do;iJ?16?xj}Yqwd6&a% z$N7p9Cs+N?luOoVX#WV&J5YU@0~_IlppTP@0=k;u(T((Ggjj?2Oc!H(j@`#Gk9tem z%ug9p(YN?cF>xcgWr-0&wT;v&ON(1ssE6ee&-{E*&b;~>2 zX+>XX_icVBhD$yl5F+o;y?5f*`ud$Tn!N1y;FYx3^G;}4mLT-<$m^hI(c0jP?@R1S zx$SO3E}R&7HPLb?ey$K7ljD79xTt|PAzasni?qqWRto*xsa*vYCf(#g&hatxyk!LC zRAAZK@5relYvE;jS7M)Av1Lq-^J67CcRdGA-->Lbb~QOWu|Q$6YhFDk)>~Ws?CTPH zBDZ~b4wj(e=jxDF6{is@>6|KT1X8WUdR6cCU(iY&ImoG^QPG;yU}v_qYDxnrAAy^M zG@xq`gKSxn6thYhL(T0smTv$Uo?!sL3m*P;n*Id{{K{$G!dbqJG;`sX95;<1Px!%;& zo%Q!xyuiUQW|Z<>-E**}`{m39w9TDuk-nT=p4NtwG^#RNE)~xz2MH(1+k*{oo%jK? z=mcc8bYlnep*0??q2N0!@2UqgYo)W`EgZSNf1DybS&A?|hcZ3c0U^2(we(^?SKHrM zxd?I@(&HkG45(X|9l~UD`5EmSDAw{GU59ho5(<#xt~@nR!PZ{xbW=m`2Z{kMdm#qn z0&8mzSGlU5!Ul=;$<3SXj94?CcjWY$i`wz(bj ziYm$D$I}~cmgv?M?ZI#UeBlr-{Y{;!uwZRx8efG~6)Zi7s<1A?+6;P7g?-*5ts7n& z&c6zBm`!%WgYAf^J8aa19Z~sd$U&mHZPg4U#Eo`DLl=op()j0@!h_*x+*! zCHyTr@^g{;M>7A&Ts)l&q6cr4*v$v-;&H>A{0QKftzQOw%0JeDP*~@;WO0ed>M=uJ zuNCq_YcQ?0>Ka(4w)rTQqUEHD5c~L{){bgwpxWf9J$Xri?1{GF()Zva9Y`?-AW0eJ zNHuri2->p!F*Y6vI00!2;k?zq+g~L#BA7MT6(Wbf1hbjCdDly*aZR?P&e>}v_Jr8? ziIztR#y0;(;?fNc@J#QQ&$?X$OeLu;XE)rY*{ zyZFd+@jFhS>SZSZ8NWKZJmb&v^5%xH%i5~LUwtT@8>&P8dt^D%yX}+}%DOq~IujM_DU182lC; z*eb0C?*FMIvtCegU3N(r8bCGcu@*wDfV?5~kYgdaDz&W75}lizE6WvqS)YCD(#u~t zM9$5ao@`CbA-8(SX^cO0ZNTPhH_)91?6b;a&mg1!EpxgOC38&?{(s6`;A8qFk~PH? z{2-F87PP)(ZO9U}JL!BwwoCgyZ$T7Wq!m8*rohImg>&B% z+1Em_SKhE_=A#uVdFIV*!sBIlP?cD=SG%4r#j=aKJFa%x(v+Q{Db3jDNK$UbLWOZ| zfRV)mIb zm)^sq{jC+WtQA}4S^;O*HVLaUzvYT^18SMT)(LgbQU5k9nA{SXw|M9zP%yxYWD_+^ zWYNN=vosnQC=E-%>GMYKMJ4HEv;lWTkC z)hPT!Q0ql%nSbSFhNkHqepU)m=fMtqdgL}NpKJEF9EkW^k52BfT9drtx7yD2mOPKQ#`3AsDCJ~Sap z8xg;QD>=(IFGETS$h@EcEDjD}(dE3rj!df)F1@0fU0CgajMg6tWu3_HJ2&?ynwgQDRM(8$3r_$p_dnTli(5G^M-0BuwN z9vOH+H@dJ!es@Y#%s8w*O%fy2>vFtf&DUwEepiUGe=ecquFT(efdlgaKX4on3uG?+ zgj&8%o0rp-ZPE&ta;ZUg7Nl!!*HT({HmuUCQ+mFye)bO)b!Rc!f2cwa79b4vppYJ{ zme9d7Ltx2b7Q7V2{w-RPBesv-Nec4{1SQ{s?!K5y;y zr0G3bg!U$F?a5kr+(H4)O>DyvP{$mhr6=iou?E^3)VLR`BZWTDYqD?Zn(B->nQv)i zFBUWSCP=>?G}bFW05RmKYZ~n0T@5QYV}|FlmF(ADzF@Z=aI28E&QDi*q9PDGH zQN5X8T&af+uPx(A2Y0`oD?-$B)l$DPxj0~WPb@pE@-)G7};fz*tj z00wzcA(t;@c<9Kv59@1sUKyl&Tt&R6&x}2>7k4$is!UV+u)2O#nwEFt1~U{@DqB0H z%gSE)bhHmk()nWuu2$Zd?*?X~f9U6SmD$+;DC@IqdEv{SmPT;T&^wW(C}DJ!hLY;}n} z@|<$R<%xBS4)%9qazcA^hFgN8KN#uX2C#b4t*G)OUQedS1DF>Z$dM|=%nSVjNRvJPC((^TEUZ$#>iuIPc?@P_D>YNSJtxw_!OW-Xj1`Ve$XV=rT44t=PuYQR z*FxmLbqMpK8-rQpsxki)aY{L2j*8eoYJ0PMpsjvN9fq))g#A$V$OaKp6 z3?uunX!A0|1rmY@mE*1L1LREz&wlSSEfS!Kj!ai!(7jB*i|;=$sN;l98fP3k3pB ztMI^a8Hp1d6_1!GGr|wt18LNU6xMJEzvj-9OAkYFLg2xO3cs-ta{x%`j6L3QYWPyX zXRJnJA4D1VIUjU!a2b0XgHZ3bG2}0NxZF5cK*XoUuoIR8*#{m!H5)?=Dks&yw;IMP=NkMFvE!%#DZ>9R zDy8@-w-19ygH3^L6`~$oIL}WWg3r0o?k`wK&7pWH5SWHh$~TppECA)cT)-c!Qg;nc zcOmEDtcEkMBg7AncA-YYS@RH?DRE6Vm9Hy=t5;3waP!lPGq{?2vEg9j>+l&8tr*UH zI=vKi*v=RpAt5>RF=iBVnE)MWNu_G&MIOp{Xy^w4yE)cy48iGMaBSg@Q)bcdr$`k? zu+Yq_02I8w`>f#A)$mO2epN4gJif*pEgG}n?4yT(6c}gyfW8eJ({hgUrg!i&6*p=* zGHlGjNg)rFHY?Dp{@eNY*4Ss-f?F4kanWdD!R4#LtAPt@!Lxas8C-SIoQYN~D7Kj{ z@(53C(n);LsGc3+eb)Q<;R9pS7)_RBGt5kqlEa6#Rsi$tq1>@ z3LrfI0)~0obs!x#h8S9k)O$3m<(ve{U`P!0oyj_yg*snU{Hdlr&U9cjtJdxsvSbWF zSD$t!*ly3ntT5)H7w_g>c$RuSEI!Jspt3PUItNVT`zqkYOCNwA36UPDpc5RF{ebF> zVYPHkz=d}k!`iv~A+X?5*Wh&iEyc{?Ouvp{VM*;%;eX1z(wH=sRZtpY;(0iHd-QtK z9gg}GovJj%|0lRnLRSbuP{LPTILa{IZ#r$fjBwN?)f&tEo#!|q&T9;KCu%>IRTTpi zVx88TDpsQLV_9{){tbj;+xdd~z0Vh%9dpi$w{|86mZG&^O*_L|e1YOeak=&I3=afJ z3?P)(1bW41Ab;kt5EW+Nu-zQ?YTEv0IF8Cp_v0UX`V~o|i33<^;@iM3_Fe)!~|hOM8+XiF%cQARM1iQIOeN8KuP1+ zvNkoamK4_jhP(ySQn5E&@ma6-V&NYf4kNAO+@B_3;d_hM#FUgvvA5!6Yycn!y$>f~ zVJg0@r`qG0zw1&?f}0?88zcgO^x1ewN++uCE#8N_q z<5@?Yk3mPi6Ii@Xz9Le;3CyQ))*vL1U`+F$?r@yt$zg6!{jEvq6_JOfu4tmUD)M~2 zHiqyu!@u_++A@Lpo0}mHGIp91kot21i2K+WaumSlKr}SvutZ}jU?)NHI;SSp<3MBD zX#h&_GZ+VvX(FrT@z+2lE2&pGIj{t&hQkA?<3x5@c(R=8Oaf=)1l=hdFBc!dG%Ig> zNS{n%Ue505qa4}23(c6s>ZPqa4iTJkU~RbDSxL$Chw@E54>Z0qIh$$2tMtoTfe31qE}x=&`It{dP1iHqnT#;%4b-_XLz z%uDz|OY0{?5)fu1*C{NaTG?J&QOO#rJd_cD|5Jh@aFAD|rzO|KzQQmqy|^X@W(I-e zVB@GO|6=7kkCpF@e+@vuNkErZDv9Um_2wC52XMf67NrU94)zg%TWZczgKw*Tejv#a z{hPy&xNj72svlUN-j@N#-np(J6hPzbj_Bvy7o^ekh2;!)#T#;IFe1-VV%^2Q>@H`m zOwRCQ)V@*TXaTD6!sG5GW?^s2W$QnFjG&#Oqu)uFlL8gYCuZOViepEysi@R43s4o zyFeHJ5<_(o9KsFp3*E}KdK!I09Kbfc<77vkk@rDo^X3h4p>FvaC8!x~xhbx73VjP% zV*EV~^}Qudb6WQXzFl_}Ob;r(CDw8p#6c4Ps&!iobBf}=1o(R0M&xX~*CQ|eM?;nF z05g^QhQJqnM{M9!gZska8*@jj;Z*txJ{^23?ub>Lu5jP=zm;S>>Czq1%V{$Qtplj! zju`Be&V7^N3;G*{Iq^!Mul~mUwAla`yh4WnBXPcA!L2v`Gdbk7(jj`rU_u3hfK`_r zz&grR7lQLk1`-1itpaNw(uLZs{e8Qh0&zgq8qvCJ`4 ziIRpVra$xod8m$N|07OsdaHy-MdKp}{)ge=3{rXHZv?=Yor=Z>&cg(xQB-i=)dm(r z`nE)%R(GM}LY#sv?QFs2)Zpa+rr#A;v*CDg1uVfCdHO9)UbTDTw_2xy=cw6BH#Brq z7NebJa^KhRRV+s1cH_Q*@WmF3N1U>s!MF4;H12)gxZF1czUceBak(!XzA^WCV!&MS5#27Wou;!s;rrU+Hp zUQyc5+NS?sO8fHuUR*N8b@q2|*HhLM7MvLaJSgKALT7v5G36+`Ok;n-cD<^x?*){P zHTHi2o?S{q@JAZ^P!7laBjwJC;qI^HG{>qmxhAPRyANMWq@g@TXxAgflw)p460mL@ zW)E%+Z2I>g^D&trJ5y8zefa`pDTRJ?uAMTLvNrnP8o@69{-vyX)R3Fl;+A?Eb0l!s z*`+m%IeIu?v?XFEz8d*-7p^a;sugAg$Z@!d6}g{&`9boeFk&7$CmcVuA{OZ743dz$ z!8)&e197;_@f&&2XEc>qQ=J6^YB#Z9p`MlQ5UZ<;1i<5KNQR4{hx|43)qSx_PqV*f zk;2l>wEJt;F=7->N1;8-&xmmGOA$LmZ?PwbLQ?>Cws4f-)J=Uq64%apQqyIunJ{E1 z?OV>gs{du-xxrm5vqh;WR4uN3s4pgFH;dh-r+v$qsfvvES&e!6)NEWk!tuJ}ey6M* zN)MM|4Vhq}3g6%)&-r(1`VEWFS$=iIi!P4`Y4?YCorb9K3g^=AJYLW3YP_pk9r5N+ zS$epE{UP3WgVlK6b7}B$#M|&2tym7xRK3AUX{xNvb(F>u$9S`=w+LkWASGBBmrG77 zSR>ufU+F1+1sj}s{gx^{)nL-t2@VBSaY_zoue2miUpvZ+;odVH3%JtA(2CY6fw;{h zPlSsr&7YJXrSJ&6K?jw?t|~CIMV33MuzW3N0}eY-WjO|5s<{$JoM{IsVh+nFf5%T6lk!$CbDrn=#gdmFs3Ol2|A| zzfC(4>b#(hB9Je(-K8!+u$sEBUI;Yh2lV3%IKKIT-N+2=%X0*oiD|f%57zxbP}4LU z6Zp&KuB~x6IcIE0zB1wuW>WGR z*28E0JtREfF^)U%g4VU2$~6fID}g+L_N-x5jiVFQSeURH$w8TPe+^3&obOS>T9&IF zLZ{ZUc%PFz^8?O+h9};S$yaE6hnpKRquM{=$S(aZefATZWw01x=IHY>N<^zxw_%n( zuiI-;Csa`LOaK1FstNnD$heLLHOX47S9cUV&@opZlXpQq8&jRZmaT`bdG@UqW{ZCh zV45Q@na>wt-uSnezCiTe=_;b>M~-+f`z8>tm?Qlq;G!MQ7v;yHvg*Kf+8p`XoZIaA zDm_=1{u0r+`HT-^)=`(Z=#vIg#fvf5k}K{IR(OgV-%GpYIjv`PwVq2M+{>NpYBTaD z5BW`b%YJzV>URSR%3KV+Ze@C|j3gIga{d#5k5W(yhxzOB^kxw&F^G*bp^Kv4VV`X< z0)m5dixYI8B2ngsqGoJL5M6wHH2eT{kqL)s(4%MsbiY2U%JhObuWHJHv?xgNm> zI!w5{Y6_#2jo8Is-9nQ$vN^7NLV_wiON@f@Ca(mh*Vl;}`Ue zBAKCt{Be>?Td40Q7Tm774KI!0;o_|dCT_4|Am9p~iNozCUqs@NiilYaHk`PUl^G)_ z9T$;Ge#Z4#H8D4!SI<<*KNloyWDqg!xZeqv-$aOQT!j^vn5Fe9rcqm0}X4$%+ zmm1o&ncdd4cma*3pV?Y=7jk=L6_k5NQ|Dh;(`K-0zK;(`$iS;1usDp*PFdIp;&{IS zR)_cl9z%H6^O17xLlDiLx`cX&(wtFFQd*6l`gVhgL) z?Fkkg#ZFlVx#lC}()5f|;`anH7;^UwqVS7BxZhkPuR)P`fFb*|-R6P|c_$DVpUwCH zcZ5n_9^8n`TUoV^Gs{S~m4E+Fs&zi53Z2&fq}olT+FGS*$MFMC95;9Jwz8palHyk~ zC?e5mQ55kj3u$oyhYDQL4OP;fD{H7P?p6)vO@l1APs(i$yO2(D7>}-dF}DJY*#3<8 zehN9frMp=4#hs%f8J7lmVIDQ4eZMkKy$*EwMQa~=_A4{HJ&EMWl&Ah_LrUJp>NMZ3 zfR)r?wi&78-gTio@{}X>j!C&KlCqCF$r7lgSR0OuH|A9sjBNdclwL*B_HC@Ta0=#C zwlR}%rva60V}YKFI8AFNc!-L;(jV~5O^c+6-yln}F4j}e-&iA0zl%T`@EA)t3SOXc zWpf(P+TS4fmM`$U79pTIPLW%`P|9^4>Q-iC#Xu9^3`L&wGp=FC(v>9iP z0f-5^JJLXe$YbG#jRC12_smc{7U@&&N#hAvr1l`Remkq<5dr%+%FNh>PY0ZD9dnK3 z?JUIOIgH~dAxF`KN=Tz?6!bf5p}U-+r@_CoK5W=CUI_{t8bPOjXWssa<&a$w3S(-_ zDFoqUizyb7^m(j-t^yoQ@>rPe&vZQv&13%6^Y9#;vOv@+OhW6Z>w(49oI45iYFY-g zwRvo$t`;2LJ6LDuPe*gzMnln9J*DqpEuCN1{@9ekL3lzehl$Z87zOW6+BypDsbBut`8UEp}q6OW!n;JLm`-bb4~d0+P6 z6QaBUE_&1RYxtnk6@SH}oj74JyasP{=tQpcRQWpAX}o-4C?18(SxmP9$66nGhO-Ih zk8{ffOYk^*u5|3<2*A$=KCTTS$}fUdPg`~|-^A)8_-4yu%2mTG2Ni|^d<445`NHJL zgUPuD&hLR<*>*!t{F~Q};RvrUtA7uWa@~!|;Ltsa-ObtwgNM_c-K>#NcR20e&1(9d zx`T`Js+!Kd+F0;C(N}Gv#c+3#p0s;dP0u|rjRC8ZCOPK==E~aCY!7rCuFlibz&-2) zO~1#yg=^=j^HkPFS29{p>!z|m-I}>r2d6U6%xf@bgbTC$u3Uaa?!?1L7T1?E)`3|R zGWxtUj7Z0#o&nQrix%=F!74T4-ICj4M^QrIHe2SD@{n9<-bn6)tug8N2vn`vDOc(< z8mpO?BY{*U0VS;zZpX!9lm-9uG-w*D-EtMIPGC~-|9w8MoG9X?P;&v`(>HPuY#moI z!&o2g6Jx$Dk_DatSn$d|Du~MrSjb zhj7D2_cB=>{l8c(XvFu-o9a$y6}?Zx7%*q@vrD^;h20UBsBpkZ{V8QSs;{4ohD>L5 z-9ASo^drtzYi1ix&c@iE&N}+l-H(~(A*R7WW^49zgbi*IlI{z+{liNFxo4p@j>FL; zi#63-f*ebXI~ckv@jH(56$oln#d7=zT9bus?}K8xk_C=vGgxES;6UWXAzrvFPmUqm3|33pfEm-#XAae%YT3+B7d=u>&9m8|O1@mn zolnbO^}StP*JOyE>gKTa!i4!WEr->V%-jmF`hZKuZrYl|JcX6fbS#G@3%}eYubFIG z#SWi=>6=!YR?K8|Dov~mwIze>UWv}kWUb=2{=;?ZPz%PH-BEePP$dF6{&)*A{cTN0 zV0v1jHAUdMj1kE&`x3EJ@2Uyl7-NEI#cWm^Iylp2K^H8bCjB~#Ido4L?|+vQ8X7AUo>@TC|F z;M0AnyM@&W%JfnCr!sIpw$76E09rw44a32HdRk*)qn!7hRD07;FR9u*7U61z0z;C; zn9SesIWO0GN&V)r8dZ03X!cR>&yT?YG5S-jD>t|BRyZhf<1O|(pD=Eir;~Y z7T_iZQ20XD(tQvjL%*+`RgVWr^atgPRLWY&0_sI#Lgk{Nj*t?x&CR*T6(!`V00NeP zH_Q3O1uM@dzbII92Ax49-KM^JdbW_&4A^Djv5U+HZW*xMXc8fB0HCd9o=Rq=iJE-L z%=%0ZjQ2h(q4oLgm#m`So-{}K6TM(A=fm*7EC=?bLtnC*&To#Y)f@RZ@7b4Zv{qP{ zNrS&)tpwjowDBwEE5x`{;a4m{*zqU1EN0%?RkV2ty2utc>b#hB)2Hmm{&VAE=)=o@ z&|iz0U&U23AnW|cM%pFNay?@s&m}BE*y&2!jf-z0xvWOA=5mMSptv#dUM9UqTH=B<`<0|0~-9rst-#{Zp_;L72SDO=~4%r(iK`PDJan?n1M1 z)aN7%^bHutxu?RNUV6=bJ`NzQk4jh03r-N7WU-Mu@k9#-0k&q?2ciSPjR#4kRzo=> zdPwPxc2jT$s37F5O_H_wWH`m@1`fgLg6TKVLUlmW<^vRLPA5Zz34P|@cHowaH=X?y zha#V!VwFt5hA7KW3E5T_%;LOwoEdy+5xr9^&hnY{${q{mTR2O1?i0NRvOnHD((l-` z*-aDhLIif<*}=afNQ2GUGeqFGtIOrt*veR>+$Vba_Z0K=+`mK6K=Oy}kkzmWZY(C7 zcL?Njnl;b#s1CjN=1Gr(FC0RDTySY$QxTTXY2I|BG zp4YM2Qn%}K&5T%$-n-0ndz{Hy=Il z8syN=0(uquwm@P#f(51DVLzvC=L}JgK$_F7$LUrF-G0Awfg31yh69wl;3Mzle2J2A zblT!G&1uA0Hp3+uCWdScI2U_T*5G{OBCDy7!>c0nv);v%nxA7;l7j!mgJ#@FHztSw z%>U=GZG=>MlG0^-kkS==tY&BV;2Sk1cXi0}&BaOi zWK$ZAD7s_A)dAk+!zK>xPzR|%SPWZtyvCpsst41&!dcd^mg1!B*Y@=V^YJnLyKUyR| zYl2K+t6C(ld`R8?fX?8bHu(tg9~JQr74c66v9erGMf7$cnt0mRRLqkq=BX_Lxm{wx z=0-A?gM*XCl-*z$pAR8v;R|2c{1XlYKAMyl$7}GC1c2ItUzCze#|QPD^@~8$F0r8C z9(<69oc(h(b3UVj-82$J&DnwY9l{Mj!~Pz6I(muKtTuZ!mM|EKfOx)lP*AM@Pn{v; z9AO^t2F>t8XFajY%%{sN0AbJVl{|6#d;Wk!y55eB1u%xI0a)U=VK*;l(<>~{?dV`-jR-a46+o-Ot-GG4U18&eZh9)Y!n%5o9?Dae@xmC6Rlrz>gLkl- z&JUsiS6O47dq+L3yvo{$3s*q8dlmBCUitLsD#R8CR#2sD%-7geDIb=MV|e!H=njg! z#;SWMGd~WEO!8XXA$PEr`yNx#-z>B$o+DU@djaMFPPlh$#uGEJfo?ufT7frl7d=(} z2iIHjDd8X1$~XwkF}4Q`l0rc-4Pi_FVPl1(|B`qYr=fQ{Ihd;AXiB-uqP(hZ`7iub zr7e{5g!$5McbTd3PCjWVJ>jaYCmNwLn(5kI78s8Jg?qqyFL&Ztv4_(4VpUD#ZeAg8 zKULVC4R+I_f#6IoA#6Abf>{fd`U`RrcaPN&cm9OM8>bww`>fn5GnLK0SXirT)CP=S zM#HY*_`TmUT78YhN!nyygHOx@!XLHM(}QcQrciS;d0fYJX=yVxxz3{4r+5jIZ%Hf4 zmmboj>#S;(P0x7$sP;IkorflXXQN2AZhCLG{h}~f)xcm~qYn(0C2J14&SN|0qrAVy zcHqHw7UaD`#W3=Dy^`D)9hsjGULop#2wSn??H6#5DW5X9gXb97N%E_ z=RH6Qh!H{Le3+$G`;K?k+{Bx?okGl3$@UEfmIV(Dw(2cf`a4 zwQhrkCyKTavnS%sF@rqt2+(p@D`;SPl@;x90l6P#HEIw1USR;a4E)0>ibYx$0nz;{ zb*`)+S45_$&rx)PYTwi3qpa$XAsvubD0T~FcrY4PLC!}9#W^UZH=K;(Tu*Mwc|=&> zYhpKP`zqr_a&yFhM1x0}RvrcWY#ybO8ijMMfAm>e$m+P~*K_0rHybO+wGe@t6|#oD z?YQMTtMmoL1B5}KNM5UI#qsGvBcii%HB0c7Tf9OUE@|U zRu!}A?wlaroJuZj-rBhL$Liet#o1yOTzQca!NUKsD(UJ&P1C zzI#t-&o}ccf?Vm=cUn)1e8^19wG&{9A(C-5srSE-%{5HWQ|7-ckiL1yx(ZLb)8mKC z$7@7)5W^-GV|rdt9OQAFV3QQ8{x7S?oH~{f84;`!32UVgu?T;3Qi!gQ9T#l`Ju?K9lVu6d3gKZDMW;T*X=he)brM~Z%q@VI95*>koi@b3=FijAi?#=w=E zc*ZgnYRh;wn?J9569g?ysoD!%AJ1AuX)oABsr{mIR%OT~y77Vy5o+Ee^Gg<&{5R|& z#vV;?!8P12!JS?DKD`0=6v1O2a0ym`-^K6=|CIT_n+o!FjsmS8E8CA*r>qc(US0{4EP^Kp-7MCW!N#yKZP9Klv|Y!l(1~!!gtiV zlm+_iOH!D*T3lt3Uwh_;?D>rOOA=+5qAXkgrah(Xl;9st)>o{sY8NO)fFaIVk5SfS zchGcvj5#atAIw(c#x(Xd`%(C^5mkA^hE=QZ@+GE@7s-})ynW-d@3w$}ZnK3C>^FQw zefNfa<)3a=GB7NAO3(yN`llGVEnmE}m!Wie%lwtmH~KBBUG?ARFYW0KkLV;@82$nE zIsmo+40DCvj<>9if_(QaYvY5NLZeB)W&FKzOFRmwcrndZmaopGHt$%Zf;jaZi&Y%E z-mzfCapxV2Z|X6Yo4qImx;tcgtuZSX$`f+&R1}1*7}+OLkMYl5+Lih(P&rLKluZ{O z-SMhoFqRX zr~Z&aa0)-I~)Kn||TK~u)F7q!is- zWPNpJ`?C;8TnJrd0zKFsMQaxeMV(No$_zH+&)V_Ed z!YfF%!R|#v6~%U(*GGWDChb!<4o~V(zCkkU&V@Rru}z9~mNp9S50dOGofbBWdHJF=Nh|p8 zq$o-1E^OaHR!Q2c?L)~fQku>vXlb1bI-j(UF1tw8giBfU8eg67FLv@XO7nCu!b2O4 zQWfoPDlkeZLi0TGaFyB%e{H9MuF`p7s-2p+NfDmyaDbo8-=d12o*9D5;(E_Rc2lOC z)XMiMjy(C%Km=->AI~m=f(4hv$6=fMr3dq%CvH-*P=sO!GYo_EV6_0wwODBepNB}D#C+q|SO;mHBI^Rao(!j(bai+FkT7f_=XH4Sm(p#XG^$nZ;+lE`A5g zRkg6RP4uPVRiuf+i0&j;k-B+!byvjm1?r4mDLFT4i4S%1k-A9jOgLUp%yspBtD~(x zQbVt=#{QRqG;J(rhrFn=uhdRAt3*ei_(~pZd=-AU@i#`q{_wmkU#XYY|LZ+mk;b7& z@)bOMwu|6w;WYpE^vVxybPWgA{!&e$=^kq7FGUGyyJ@1oR9$Mcn`0{);HP)z{p2q( z!KeN+ozlsVY0XWfrpT;u@%}?7VePS0sjf7e{Gy~??iWYGC?`L|w=d`Wrz#FWI`H6UX~A9!pg2Fc z{Rp~QUkVBLKq9!BV+z9;_kos4cNEOt$6-FQnBV7-`K2UKU1_>Jf}$Eo0X2?tjPt$k z7o1OhfGE^rM(C+!z{@mq6SiPVf6_5vw_saZxh-ArUepk-o>x@8g~|Z4mOV9 zr@5(zXaz8YiX*6TLty&-|6+zp$-a@OI8A!gy14ZEILePO{*2|uR`rO%_nD4#btJ1Q zn!)}WXERE-NXRwxF;cg1skLY_V%n>StEtRLYs01Bnzvl^xabCJ6Nd8+7xLuV>rmu= z#5xR+;-&8n>pbaRlvGF9`JOx)N!h~oceJdL}`MXyby?;A@^>z$g&=e`WCYuqY9xfjZxHId+LSmp)8mvWQ$r>Ac3Ns5+Wq2Rub zI!1F+tw3tU1iBp!3r902l#_bhvW(PVW6%8xxqAR9Rb5VQjq7{r*+d#o@sKD8F~fNO zs*|@M7Nf1{l_C7vpIZfo&JBOX4sYF~LR1YjGag%U?Sal0fG6j`%;E-w<#KMklf_`r z>+}A&&i>Gf69#j6&}n(p6Ak6vfEkfQ02Jeyr{&ha(Bm7-LyGtS3jT%MZZeNpuMZ$S z_UxP!Gw!V83MRR^O=q?rn5%6XkY19rzqlp%EBRPzIUjR-74^T#+UV+Q^?4g^GMm=< zmjP-H+DxR?w^>ZPu@1j(gF?3g=(^il#_s^PUgQ z#kX{HuZ~n(SiFPW!=%POvv1%sC)a05e2jyw0k60vDQilheB%ra2$LoWUFy+|FezG> zRN+1O!1g0Oo{Q%g=fBaZXZ2s+*3q;xuyVWUOR85v3iAFL8nB9W`H#=)m!-X@+h@c` z-Idplc-N5+#Pgx#vmz6E=c)(&Z*V>De?`8VsvPwD2J^Xx|Dg-u;mP0m2@ys_Nby?~ zpTo=+!)PNtY%2L?`q@z`Wx(+xq+Elm;(rWHcmB&Y=(*o&Sa}DZT*LeKif^^*D}^s| zzoOW28BUzO8ZJ7%1EoANK)&!N>S@{}Vr#Dm0fo{9}M!X1c30&@G3G`=dIziK}}R zsc~~DNO;wO`ZSjs>Aou#XlZjPiaYX7HJ7rrRr+7B3==T?B`W|3^} zM4!b;<9grJX);)BlnGyBPASMXX_oeey9eT${MxZgzWaHs^2AKok zy`p~oPbpykW2#r$gRa#yUW!Wl5&+97U^bhn1_e)6zu}|tHRkyb#7C}zLgws88~Oc? zePAWaystOGj-st19O-Z%y?CJM4&+AFK~K*$)V`skvm5$?1r-2WcGEquwTejcAQJi9bPvF$)^^&#P5c9ahUGsL zpIm7_;JMub(ksP(zQ3vNU~XanFuEZq-Q8m71$JUnk`x%X`2uI&%Cfgw@fknLzEy#g z6)zJ$`Cu&HQbWumb$zNMV_V6jTL?$3wvt(>J(otem8vA1Mt)T@$Pof^TZnEcd3M49 z^vhgB_dn3%m4|zCqrQ2I2M(+)gU7*i`4I1S8r)}qe@5~eAdbnoG4Rb7wYKLO|*q(N_1ApWdM)%rD0X@Hj zutHfiEQaQfb()1ps;<>sL0%Kd&z20K4j7Z;z(75=8>#@1Ux9a5zPy|V7I%R6Ek9^e zLghh`^hvT*S@2(>gv6R38IR3&rL zZ6&)y4;7Tw#(U*6k4ey)Ls5;gg+9~;feR!a?a-c;RnseyWzK_RDMB0r( z<_HKPCk3y27Q(cE$(e`W?sA7kv~ z7`u2khcz@mmBdTvoP)%K8$4Fp&$Oh2RLi(u1*&v=Ri&a1QlU_Mm6mjr8g<G0!|@%t-}qJcLa*@I?(4 z7Po;z32DwDD67?%m$fg`sHE*fZmN3znx!dwftRu2CqrE6YI__;|wqA7yU>7ghECk6&g$ z5jZo0iUNuZh>GHZx#5BiiaIJNmL`@K<`OO`DHc{b7--l?(RwJgu&gMvXazNOTuM@_ zu@y55%RXJiKG9~B3jg;Wm_fdelGxGGUhJ7CV_d!g%(QO6u1mJW4xMHBO~P(E`MNxHlgJLGxoJ|Ywa{5% zbQl&+z509iM{?oKVqpJ+dMk*j6dZbEMNMtD&Jb7drLQ%%4hQs!+b|@xKIR$av)ZD5 ze4VU>8=vdsKR1i+mhuo>Fo2CPSZDG(93tc92s=b6bHsR%N9Ty19a0v;G5KkzO<5?9 z&%yNEKvL`SEMo_qr*jyK+n?`8^^jgKe%jBJNege%(0e!CKrtm z52ciDq~lbBQH}43K)R@XPE(&hiL1S1Kd_>9r>N3bT9lX%zH64ZY!NfV`ekvv(}QZ4>J#g2)OpKf zzwIKT^K%bV3auMLkkUb(nhV-Px#O&yw_OZ2-Mv)G?P93uz*70icF|?ZqsYpX`Sr+= z>6r7yT17DY)4TTB2gbWU!LjsotNX|5Vkp)=gYB2St$Tisz-{aC?k}|OtgyS4@+3mq3Y7%X>c6_U6-JZpI*6sa59!D0+m;*u4=JUJEa?%0pvf2?Xmmk2M zg+Bx2t^+|+&F_D8MK&A=>gJpL9Cn=8Jy=(t93ay@K?8lwE5IrA1kLc>xg541J(ys6 z{L3qHz`>v{zMZy%HT7W7Sl`Qc!1nk-9FM-To%9?G3LTn`)jRDodkosA)vX_X<_yYH zfAx(;$kJX|V?_&@9o$Uhr#=ahv>XcR5_~so^eK3%zjM$>>ZVVx$PtI|4PURV^4>#1 ztL3Xpg?!*Agj}vb z(fKq5UreAdVv9s$$f2*4mqKENPgpp4NUpUGwwk5kC}7$Dj<((8H<3cz)?o{xABo4d zx~)2K9_+!+yi3)0^;4rYZC;?cx@BK|6jK5yXy4JhdSjGk$8@*o@*$2O)b?T1O3xRc zQI~)|Jveegx}FoAVg?0jd)fTvzko43AG~olc3kNPZ(y^{qQFME`#IDlA;jGzI_add zPC_fqvcvPD(B!#GKKH!nXBudgC!fcJ`=ZdMTyxzb8=n^;V}g!iP#uN|{YxLff_cV7 z6LBy|OFRn>eFd0*5f`8orkd4)c3QNC5eGZA{K}p;%Nurx!`EOPoPu;Y_pIjVL-^`Y2 zFNluT3jfAN{fw5e-4Sc~)16|bspzB}y;6*j*)NE%``_=S@B6gbIR;UI-c? z*S{iSe749JUlHlzXjWTd2TAdfy%27K}weR^>qVQTccf(E(13@d73Gv&)=VzKF&>9XS+BCg||(`kkUcbnkIlWJ5t*d%vE z-tdMPa+8WH9yP`l+)it z1Kw|AgWUKg(udYrAeB~y)xh}5h*v_B|6}ozy|s3U80M* z6FMRL?h<#k{~5bRR8QNcx9n7^9DldyWnPAU(u%vq!uBbo5P4N0Ayxk8ZV_#*cnbC8 za39(d+D^TcDm&+hzUDRc4RS(`=r;M)JnU8PvGyIj+VjklkXL4f(15q@JnVzsTw`G{PTN7Tc4;1llIVfS4*!+S~)z5B%rp& zZqu)$<>mWCT+maGBO|b7)=&M;DF>|;JVD+zfQykZ+r|+Q4HdB_eUqnDeJJhd;M>6**ek1^@KvL16Ck%6KB6p)np1L z`W8H?wNFF9z{Geb@}W?Sd4iaJvBcaYfrJ2C*bCgKZp4811HV8p zefU@lZNcSrC}Y7&eGTq;;pIewY~w;nak%~OV+A{ghdKCHCw?tR7{hkIn@h!2m^Y!l{nw$J~?xcxZzj6({xYH~@ zd<(DrnRn%{Z;6b!=YOQGY#rWNym45A$NQcIceRhHyYHjY&@`2KeyqIjZP7h;CLBN& zZ}TVW?y=~=1mJ;}!QyoPr8)0N!MZ4gd5VdHHQICcfrg!^iAk?VKQO z-F{U*>Hh*>+G)N}3}_9^{eIIW$bDST|I@&`t!geJ3-=`A5lnJ7s=wS%!#9-%Qu)Uq zm^AXJHUA(iDefUhpF>F)IiwNxc9S03%^<7qqkuLv1vCb{ z+RR1cH=MKPM^Y^XANv=kp&~i1&UffdhF^Oqsb2s&hYx83dv-CB;0Fs`eGolZ`^Ja0738D?Rc#3Vv^XlR9<{nB$@g-aBPkk9<~yZKqG=ZY3dkC3PuZ<%kK(x zcezOHiTNss=}ewSA*OuDpNV!Sb~X_N10^&G5| z+(DzMKjqL?25$6GBdfGB+NIfHOYb1c6^Zh--6A}=auh~c>T?%yFv5wNm(a112Uq)s z%3U_mR@UtnQGEwNWNenIO``jM0@S+~Q~9XJ-o{3!_4PBfZxsW-H%`mMJ)&#d4jW1O zfnH*>_lU^ur_fj9*$BOhh))qPH;3#)(R&X<>l3nXP+)ifKG-b=#Hl-SU{GL4JA9+- zw}u?cj9bhdWzb&H-gL`4Y2S@l)ouNY$*GhB{&PdGyocOgxAN1f=Rt^O}P(sK#O&)n$0onmNdsSU9o$VD2-I)j66=o-I_ICnZsbRyK6jr8_Z{*odSDMP4Giz% zoPP>KLwq!_bY#R7xLq|LyVkMQcnnm__Mvu6z_90&eWFif;7+PRd@rJdrN*M{by8>7 zQ6^AaadmWwD9;0q($4?%>CI(x(M)}tP z(c69wYXVw~@>1$!>2>I&4*YLZluZAX4v*;5`^%rv(XcD(Z=iZ?Yo{W;*NqgJTi|;i z=X~1vJx3yH9ue(wv-(R->Z(Uu0>TBS`Z5si%iWE5DXRmH`t2f%gJwWbbn!}A^QjAS z1DZ@beFy8F6zUu)zPSgrlb?FWV5$$M*unW!=iIDwV!^4@Ig?yE3+=twud{~foCI** z);T?Njsu)mbWR7IgF+=rbdHbC$pq&$o%0K&!aXGmoE&zmZxk_hlCT1RXKFWiOM6?`pi|A=~uQAKaTSV8Ot=DNa zH|oyzgJjVyB7E{)8YjhFtzLi)_j*w)iJkobwcga>`?2R1TMDKki&1sZQK;kDK|PLu zBL|H%S@^N~+I8}eTSTnytMB7gvfnDY`fethgKW#lmO-`@vgO_?B7Eb>wjH+l0k9?Q z#!d9Xc1 zw$by1J$4CfNxRdoO~OX)VNoQJiZ|5>q`eW^J)>a@Je=K!vh5ZcqJsWs05u6G)NeKV ziTdRLd14+mejZuY|`szhUD-oaemEHxSx9=whknk%DkYTTpt=mG_3duHRq3Gtj zlx*{0>oy5CWJ?TX$1e1Pi3)f~+2Yq1_dba!{ry)`<%|7ker+_{1oTJz%(|7jt`6Ob zy%&CoD^V{m5+efB;>eFwMV%NYZ(by(nJ)H`uM+*yEUzpQ6Jj>(L%?<83#a|=`&h3RwCASC2CKe03 z?-sHRTr8q}SCehlV&vouvgIs>-T<;~Bc6q9`^on69@xHHEFKIW){An~jn6t1HBPtF zQmGo*OXe*R(|exismV)C;CXa=8QI^~?GvUE0KnuS{)^)W@G&ME;O`;4ac_>`jvj;BOk~XeTLrq z4Q43z0=jR*Te0e#4+# zSV1j_yPy=6yxY&T41l`cGetl`PK zu&br}sRkK(7iy5W+s$&pT_VPc-JhYu?x)dhxM4&sgIFu?iT|)4Lqmyc%x{y zN;TZ$djzSh zuE4B1byKzdx(?Kb_s%uTA}9=e4+`{cYj${Y;kb6Rw+EwlySfnNA35;&VSI&)Z=q<$ zBY~dCzI=J6K-}s(imE2ZCb8UfQ-4{uNlY-UjFa`7FjW)QOAdTc++f3>{~8hI=&pd#GDYUR(&5>)fK7WyTQ7uu3$ufvV?g`HEXa_^%m<34tH* z;ljLKSP8m-lSxgb9c2STj5t5L>7mivjF(9L3T*_PL;p#f9JyH}#3iEb*1rF3yD748 zoKNi-r@OF(LPasMt3Op}S&Y`fFMqInW;3R(KFpOTH)E(_iIbN%iy~9d1M;ClG0HT$ zk33O`4qvJ4DZ#oy=CD;Vo1b)H(&ybK0mkSKdD6# zldW3N+up@f`0gRmH|zzdkeq69r`w{7(@7ljFpA%)ZgTp=h}bg&W&Xoris@{=Jo&Kb z;QRPH&`=*1Q+>yhZA1|U-Vtl%+9DAjar4aoiJVhwD(X~6FL|s;Bt*ZKr;U``Me$d2 znNIgZ6mt&#Z3_Mo(bqSYY%?CgI5_w|x#Dt2_8?cmqm|a zPH{pHdE`;NXvf#fpB@#veXHI;WOh6zX2%9z&nX;_*`xXt_dhA_U)76R6H|vWzX_)r zj91kkyUQMri=pk-Mk9)aqD_=s@VJ=X{&`G+r@ZU$G`i4urN`Zk#n`+fj%K?!Wt~SjOhtXx~+g!zWP7oR*N zV%mB-2PtajPBQM07&fUAV1p;;lr!-hlC$ch)9gud=O4|w5~$REpsh>g{oR0e?3P1K zW5ux;EA}5LK3{>cVo!_}QFM_#7Pd_t zii#m;h+JNUUc>o2rTc5qyL|mA;qPNA&ngE>^fBeEkjGBrTY6&_E>q4Vx&Iq6 z*5X)>xrdaP!3c42^hIeoBgO{NRq08%(LR^%N}qE^L|(VsNiVSYE$U(`*O3oK&!E|j z_NS7{cbyTVe7bExi8Su2AA<%=ZC~Ehaf`cB-u63j(Wl!3qpvE(jfYYLzUJcIUFS=( z%UR4{kM4F+4kwEpmRV=NOKJrwQTKZ>KKx34e1|36}wkLlj&a_>*#ksb*#+M-exEh^y= zXR763B+-cigi%|8s-vTq&l@9Y;lU*niS6&xX^s>HB#c#hSaIGNA#>tX<0GcSl8UYu9ED z2kQ=3g+>3nn_2J5=PR*__wh8dJX?vbO#C4k{-O9SGMAbJG*rj5Rm>#xL6#GT&J+q# zFYS?*H6Cay~?!HysO5!4n}G&bOHrpnb3aENM?T-H!eU)z6vH=bNl!RXql zO}>5{(el1G7mrBAg?G;s%1on*d#KFcGK~QhdiGy-OwNJQc*0E4bn}Tgx zAEE8P97#_D$5bJSoz&a5H#DwK$V2vLr>bkV%UvIdu-?CgYL$QIMK}~7K76$m=|hve zH4>|bI1%Q3Em2@R8!3PJNGvm-#dname2kU050R*iAB#kj&vyC#$C!sr_(`_;L>#*= z{#l&)fKS--tc|J@cDGV~cOlTOu= zs>OMzbG{X`u}3GG6>0rUbRN+da?ee8KP%Op+Zq~cK19FXJ=cv1tj3TLaE1=U^u~~M zO#=%J4?xE`zcV~oJrUoLoD>nbR~}lYts8RSQuS<;i%yC-@zSfvB`u&}=sj~%%ru|< zy+K|)i8nrSmOSvO7!>;Tjd+{!4Hw0KP-Dow@CUJYb&Cx649kYYcFDNU#64{qdt8BD z`O+Hk4-PoX4h-@ARrTE^H(o%;x~iT0_=1?%r60ZyFB){37E?N?W%B9^QF%sA{#h*R z_)L!WM0)K;e@Rg<;LC9LVd=Uru&eyf&%&B862oX5ds|~hx#Jxa^sOZ>)jUYE{8S)9 zn;-FDM=A_}OhOlkYPwvDr~(rMN{ zB+!Nmr<^!w1WS55G6Qe4_IaYIWRAnx9UyBOhP zPH!6^|M){xx?+3-lsK5{V1~muU?##$g_#L62WCFZ5|}$-a$sCA8)44CT!6U*6W|x1 zgu(QH83>aIGYMuU%siMoVAjBFfO!OF8%%hcfKf_Rn*b#iW&q4km_(Rlm?<#V!_0=s zfVmxJIm~L9`(W~rsJkzU$ll*R)Rg~!eUA6cQ=36cX+JqfURw2=_KhKp`n-V+^1wyx zwAA`awT0MD`mQIhj;`LJ&n@ty{#*wc|Ceaf{p?V@o#;0^@tvZ(W_1GQ6>wli=+%G* zelBPKCA!8=Jc}j@rw3sa*NCl6r)$DA`_It+ys#-+KYu2-LA&eDtE?lR;a&X_#p8qI z7^k8Rua#f?C1Tq@YoW@Cmf+D;IMmCQMro}_Pb|AyPOcaI1MBel1>R_({;(P6qlk$k zpWfUQ%3GhJoMCgTmLlB1fDH<6@f_MkV&GKEThaN^OUj8F%$s3Sn)q&X=zhZ{vZsKvf^zcd9{TGZgoNhVc7ctqNy*VL^eh~?Q+NUb?LhX%~BQJ^Y zu0O?KUp0F4G_kk`zB(F1`l3ICrL_&w@=j=27DrRG{=RZI1~X#3eCiTDY3T)CV@U7> z)FM?#;}Q&uV9%>>v-(yfq+K%?yOQA<9~dJN5E$&S_;Lsjt!20?S=EmE^Ap-ku*vU0 z6nzVY{fA#PhCGjGVbv5nYSP2$$j&)2Y4k~O2C~e7x0HYKmdm1d$0tztY%;4iqORh8 z$cj(omdhgS#!OA3^~iBbtU4Re09U``QJ?!6mAzTL7ZY?ixyevyn!2!Kc#gd*??LRI z;;WwfMFw2K__}?7+o>LLC0d8bXBtFgr%$5jTG3b)m$vtNOtTN@=Z=z}HDDF092l3F_85avAYJi( z6x5nug_2BHyoYtiU=SJC-S1iG;fnWCkQP_Gze6tWr|A#lig&Z-SFN~2ZVJVYojw%A zFHAL_PrD+v>C*Qb zbUhKM(`zq(|DccNJ6-;6>k$?u|7;WkdiracbNp<&Z@90W?u6AZeh<>4(=R6aiOH7e zv0h!JpQ?L~yK85E5A!Ju+0Vn&qzq)GZO$N9>&;NV(R?e_TB$&TCOUjnt}CzeTQI?Th$sjT2s5`_W0jt zixe&Xwto4bN520sa%T++C9aXjSlblKrR4qE^e-UW?U&X~?l)OFInp&pbNn)h)~0*$ zLC-PzAR~iglA{Op>ovE?57J^)^K!q*k+P%N65VHlrZwjVfn6X|$d3-9{XC9R2M29N$ip%TrtB9sh{f#6bw6cEOt4wDAhLQ}1k` z1`{1Te@DW)_-tn_W+OgUYagK|7$>BjAE~vq1F=PLl>GD`G0bdjXpljdM2tN5HhK!v zd@Z5oZTSsyiLb?B?(|WEe4_$vkFRC0*#`DszLrSyfAbn-n4cxy^i!pr;%7;0t93tQ z7b*QL51C%-Qr@eL<$j;R*P(V-vU^-S?8vrbWD$ey=Cx5c+k@EDbc$4(%+9Wzo{WFzIe*=@B=%@0CXPc;A>s7pt^IsxF`Y^|jf%;RavY z+4YHW4ckZRx(QcgGt&wZWIxi8`e|J6`4mSfX4fCZfxVQlcK#EIG02)34Kz4c(Re zPgjpg%B#j;>!dU9`#OA7mxRs?z8XsUta_0(+qB5~l_#k?PEd2^9kPLK@GyA&+4`Qx zX+CrqeU7}uY+tRR#LgEb)$O&udx$)BR~|g;KPj*K_jQ4l)>)^2PqMCPPbaY;l;5mb zl{nk45*Kx^IE1j|`anyF>+A8|t0=ViBrQ?mGsT8$Q(>x(^;sO0cC`lPi;Q6O`;MLNrJw1YQ2DvV@|W2* zKB)X-tEHchdGPok*t36?9c+$}Epm9&>N9W4XQM=;dv5@K0t_P}9Lh-IJo94u*_ zEb{}R{)QWXx^PRDk8}hD2FrQj z78fRO9z+LPsR?a&MH^!RI|zT?`J#rUy_=<%e;HV+(&?g{*3Hr-B(w%r)FuxWfsKQ) zZ8i1~+#%G>($8E13v?pJdqbLQ_}6$kYB-);tUpK}WY$D*5JsM36WW6;caZ#!bMoYH zOIX_s0;xK16%m+=;G0~L<*LgHk|+L)JdINI#}9uRsmvgJ?kc8`Yd$xy9+R4Ujv@|0 z*0v*^m$SQDg8iIoTIY*$MR!Y>E8lQY_#h?)nnWRYHajEq{);vxOf@uJ*|kX-+7A(h)( z56S&t27*VH$JV61sJ#jrUVqSrPcv$Efu%=@|D!-d9!Kv=C9Own+y1W#Bv){>WKF~| zd2pbmn`>_CdUU>QO=9cv9Fj-0E-xVYm6BHDQ4G1O=1l7frR2fB*5wsi0ME7>fIWgD z_(H4ll1N+)Su?lw0Ln1cS(Dhh+(Yt+*5zK3Uuivp)sZeJoM~O5jy%}cx?HhCzO8k+ zjpS=vm)l*WFt>Guc#N&-K!+O(wckM`h!I=|91c-B=6Un2kQ^kk^JXb zm;S9jpw~UC2l>DC-xII|3I(L_bL;PMi6(D70-m05AJMwpOY)CS%k=}%{AKm}KVn0X zA$deAv4y;tS}Y4sc1c?1nLx|{!4Hy zrwxKN{r*Mn(B1o!{LCr68`RX~pt;fHD8Hea!gK$dYElo@w{Wj_NqlQ&Jd5s3f~A{z{(_70LIS#!gJ9`8+|t$T`}9RQayT;S z{QTybgrJKlZPX9-Jf$_QT2Cpziu-!pt0Z|Ac+e*~^zAhn*Wk38v}PEE7iu+E;N`VR zwXp~550;QZM3vr6Ez`8W(!gyV0^)z1HuVD1YCK*wu|z_FmzDJWrpq(Cn~EZtr=c_FqdL-2Ry$v5lw0EkbKwv zmd~R}UPbak+0uQX)}L|Jocpq=N1aBRpI^mx!ZXBBDV<+8}=boLQF3@?{VwLLrAX%H0W%gU?hUz` z`DL6jPv>Q-Z^Pm)ER_RBTe|;W zK|eeJK`-f{2i-->OG>di0`8AGXa$ujCCA*u^1x_Ir*6ZhQa@L(r4Ub=`=R`yf>|7S zMgBh8GHS3-`zzQ@lO6ab&KNzex`N?CeF4`ZLW|O1SBrI!0}#u(Emw@Ogqu1~mF_W? zFmqkEEApi=mf@~BaD3IPuWjU&a@Dn6{k=Q+Tc~9wd{ch_Mr1ZQbDAEbF@95TrM%oiVLWD!n!9tTQP968-V{1AGhJ8EjW+Bi#S;78-G)&Ts%+?YGN~`YCv|qv(1q`tW0u-_tm8&FRLw;;=P_JYk_) zrII$V-~4SXS7$CsJfy6CtM zQ$sJeo6gT>x`b&uQzz5GI&~?r%m`uHTXA9?rp!nSR5xj%k}vT|bm*f1(ur zC}yNEy@_ci({)TAXZjjboY}7BdKJ_2O#fjT6sF6&F&)ZuD$`}46uy$rjK`VoVEQ)G z514++bSkH~4VQ&zrlXn8VY-~@{Y;CQzQ(jNTxj7d-*eVSv&a3Jj%NBCXW<2oz?ZDQ zhv|#Pqhp%Fg))QbN~W8cKF#!%E-pQb_AuiErk^wYp6Laq^-Mc*K(S1R8UZuCjp<6J z>zHcK3;)tML3;j!(KkeoNGMZZrn#MT{#3?8*+b6Yx6|B@8n4sA{(3n6FSm2ZfzvH99dgV4HI2SOy5x^7ZKWgEHl%&&gdj~2AEHM= ziI7jHTDtX7oGtmf+&-}-Uw)rzStQe@TB^%SW>_3PuFTYyD!S8zsX9Mxsu7e$sHV-V_}hCD)+dojTv3b!FFL``bFUSLn2Ew@!0k*QiTji&D)F4G)X} zDmX%Q9HA0^h3dBJ9>u?+(`t^0;XZ={PJ2U_y&*6k8KCQ2?xKw$^= zmvjf-6g@{ya0I9fl)}i8J1reuBkbON-goRL^Sp0+%e;HN`%kVvx!DeKzjx2c+>`E; z_XD2HhitcZuN_KzPd;q-mIEK~R-9b#tw3S+K7TUTyWjh!_Z{y((#`|_fcKq~1@L;m z9bo^-4bUi~ki7fs-Z$+O2Su?@4qB+EiKCXlQGL5vRB4XD`waZ5@V?>Q<1HJ}EH)H# zcuH}5o4ht&tZVhX`{aXjEL}$#sqmIj6!jSILuz6vUMKITh*o&tBL9$RD4cZL$B#{! zipi*JGYe_kkMIy8Jb4#x-b4)E@xBLl$QtAVoWd&rgt#9%B)K1 z^5FJ<1WZw~54tXA&~=(4a`*g6c?o;c=eEdR?OD79XL*Q=mc13;ayz-2w`$eG>{W`= zzyBP=N^HUlm*2j4`NIASa~A4Y_?A~H8l8@}w$}aL55un1jSBpv+ z;{Pacd3W!dq=n~<@&_9QU4}A_08i#>p7ri8FD|$AXb%OH`wege4XsGYh!vK5rR_dT zRKUFDcgz@Wt6MLsP8ni3n7+-lg6Vri5x(MKMk#xEgmI-onSX+@m+9wBtC)Vn zw3_KTrYh45OzW8b0qW99?0h|?^(?r|RLRl#zD)g@1~IiU?Z`BgX;-FprZG%onf7HG zpA+EHiv3__BrqMt)WOurbOzHoOcyX+#x#d%KGPzmB}~hhdYF21TzU$tnNi2Io~iE| zU2bC<%GAy@mT5fG1f~wAPNr#0)0t*4&2q6NmuV5x5~gKLJxsk!tC*f+TE|qmha=3? z&NP9klW96rS0-C>nHDiEVOqx2!_>>PnrR(V`~GvP74cyk$u@$+WjD9m_|(Yw@=Pth@~smNu>_ zpK!#o(nosUw|GO*Y9v1WRM_a9uk@kTWAxKcJw?r#B8xw;j1>+CnkehgK)13~NWJ8e{lFRC-5SLtSZsf!aG9vq*m)2GuGS zXw6`GdJAe|ujaJk-jHXsaA)|#O{Ys)(255}+nU*m2mTy^Wh~EXK@E8h^Y3dxb^lR; z=d-|hyPgA^85oPyNV4^i9RCilFruUpNjzxUw-pF z))!1jtNzQi>(6`<;{wJD7?(1p?mqo07~iQw#mm@u6II4hELWm*|1FF|b?j1_x;Lzl z$qEj}cE)LpmoUy?d^_VD#!DF&GhW8Hj4?KDX}?MhBmH+UqnZ`y&DDOf__QOpV}7?&}|UIpz}$(YXSqF*&*z0@j- ze|J5?^r02~LK$NRm-dTiZ1hMSz*=V^gcZ_Q0V6)`m%-SW^vPnpn&r8S?_ylUSgUox zD`jl-SSuK>VSR7+K)tijiy2j{ki)o+@jZ%Q%#ASH|&-?_=y_Z1lM^7-PCn z`{l;CbPtW1sfZPfPJJ0;Y?9M{9>%$hy^Pl~u4cTBaUEki30nL0(8F8LFx172#mtCh zoWZ(?~4W4Df7N&zz-WQAhJof(%h=K4>mWE{!zYQ`%W*D=m#Z0n^* zxPY;p@v7DH=Pz7U-e#@!P@5>nOugQW8LrP_ww#^pBZKz@cXq|b>VEZYLE{-8DblO+ z!Hf;+VSWPhM=^CUO=jw3n!+^gTG~~a!Ho14bWUub+>&n%Gu?fgd^6wLU%sDf3z3tu zt$)2#G}YQemaMY+YQ3WPf!7ThJY?vwgyHfLPp~~cDkRtnbXtcU0G~&YeO!c4*%|I5^m5vsv-8=s%(T;K<8)S~p40)AZ}xmd9FQZ~XUG zispOK$*Fv7jZ<`Sz6>_c3F(PoG zg@Xhhz8MZmg7h+A;5ybf@E?qg8vDYddX5?L`WE`HKEeZ3L*a6Z2$Vf?tq00%Jpx9A zeHk0>{aeU`TF7lJaI!zQIfe%vTX+!K0(WhJ?JaOj3mn@5_icgWUCc1DY;X&l(89r} z7TD1OI~f~qO?nHQ$=E2Qt}JF4g(jD=(aILLke4zxx^5oEMzded*y!jeH|dYeklPuv z+@&~LC}c41&hJ?P<8a2MjO~oQjEy#^jBRuVRLgMfHq(a0=~n^b{D)zLT*b&te?M z`X!8w6nhxkS*|jU2Bz>8+gv?>SXOW_?!!2XvC*3@Vr=xJN*Eix?+V67P1>^Nth}nP zg|AdI!w5jRMURkC$U+$#Ih4TI=zX^gpk+m1H09Y(S3~{$G+=Xr_>!FEbHD1?pR(Yt-txpE-TwN zlxOX;X0?m6UkXy}tlwH}D0YrZK{D{DHPMV{$|*;!JzUM>OB(){gA}8D5ca&TugJ6K zihtR)xa=n#$EZ3r);DRo|E=DQ|8O8gVuS{w%2NR#TV)2)9}$)<#jMWr>D>+ zZ47>T3;wc)^tflW;P-t+PeVZq{@btX{1TlXq!rbnR=Pp9@qJ4OpBO$ncAMvJj&4>d(~1G?Zx!)4og%{|9Rrukt7sBr{E8n!z-aX%5qTrUguk zn3gcDU`p>Q{VExInN~5aCQ4O_%8WXu^-Ps*dJ1h!?M&mDI+w1{aj(-Nko zOv^yEUT6g~JWMN@dYM)+t!An+t!HX`MvthSsS!XtV+YeTrWs6gK(*pqz>E^6Z!>+5 zX(iKYrvA@zfX@b&PdRRVAICR;fEn9TMQA%RDA%dZHGb8sZqRd#4XQFW=mo|Gt!p7y zO7!3jxlP9%6~hDjRRwwaE9*jTTmBwXo_@xf<0GrTwHB2Z)mYPD{nDClo}t`SUVGm9 zPUrHhvsRmb@Uj)RFQUkUk{KBPNK{DqyC$2dm(f{NUdsB;YVyrmarYt_G{V+3&fzDN zcup{--SM*?$26uHOtXFtl%Mssjdz9qt}BdJrYbYxAif1oZ-H~0;Uwr6GoGrX&{DNh z+DuLjrHAoNiW7f$4VvLe)cx@?V;sacK%u&s0y*&iLyw>#k7rCC!UH9}nS2ItE@LA? zC5(*(RyM;))cvY%#z=t&%AZ$rgi;XN3{wgn&9D}MW_U8>InD4*z(vh4CD79h&!88- zz8Pa8u zX#qCFB+qGvDT2k#@HAjgGfW9mo8e?&``<fZ=Fj+<-J=h|vtwBPnWzsZdrl z!>Pbk%`hdXz8R(*vj1ZQcmr+lP#gw!A$?RxG7SbWWm!QpOl6>~8J-R7ZH8|Iu4jCM za-)`@&`VbzA?08UV|rwipuUV<#%qz#Oo0NVST_GTSUwXGBv~5ciFjZX;S9#~nosu(7UL;giVIrEOIyf2jAx(_Qz106+(@9xas&HcK?E&O zG_n-Wr2P2-wmSm!O$(5e1?qEyCfMm$!Pu-r#lu(|rhr$;*l6{t7#kzwYR1OogUZ-w zPU>`gbsegn6^to5B}k8uF|hP!9K;c_F*at{Lm5*t>1Su$G{?x;SZ0dXFdm9Al1*R* zV<75a+(GvbyNvY+8M7s6j6+zS&e&K6%3y3vpl32R2C`X%sZut^?m4VrjEr*`8zbQY z#>R9@5o2S?pqOzaN2r9copCASD8^;L+VhWQhEa^VGp=9^1FaWBSI zjC(V#W^Bwgs6j#cI+QV+QO62>*+D(yevB2NKY{^_{TUBsY-3Ct`lT_ZT7`b;jOit(Uj}2U7wMPjVg^+c z^vhyQtvmg47*nl5zg)&t@6oS-G1UU}D`K3cL#3E8RowI|VLVHRimQ|v)H2YojPXJp zDiw^WpwcgEs$SRW>*T0AS#IKr!OPgpxSFvqWAp~K4!EC=T}mA*v|$CsqCb+hjBSkl z8QU4RGcb3R0~yD&JczM_v0$9W*rH)1D}xzUR>)#(W1P!4n6c5%ZO_=~=XPLR#QGf> zmoN@tT*kN)VaiqyGw7Tk`gs|LF|KAD&bW?o7siTJ&#|tIZHyxr+ZlIb9M3osSbMAv zX4qLFjd2v?493xnvlw@0oXa?daS`Jlj7u2zWL(C$m#-ea;$cQ_R`4?J!?>Dp9OF91 zeHkk@JqP+R4rM%maV+EO7$-0u?90X4$&4Yakj{80<4nfG80RofU|hg>IOAf*BN&%5 z9?7_Z@n{z_Dw#2caTQ|+W0i3d<9f#982bn7IgrfQ&UifIc*YYLI~cnrG9!%{lNe_( zp3FFl@f60nj8hmFF`mk}gz+@SWsK7pdvxqlu4jgq6>el)&3G2$I>t9KR@&<+UdY(S zcqwB$<7JHF8LwyT&@i6A4|hq@Si#r8TvN4WoWb&TjI$UAFwSKh#JGsDjd2O%4vfnP zQ~B%23=b=GV(euc&bXR!1mk+feHr_A&~s!YV>{!~jN=)PW9$Id+W)1@NM{8f?qg*# z_GO&IxGm!X#_bpvGY()}$~cH|1>gKTSYagNEXF?E>C0v8%eaVfTgD}f+c7R<9KhJaIEb;= z#f)%fR5KpQxSp{O_agm6^c-l%IFxY!<5_3?J@gW-)HZIG1q% z<08i4j7u1gWL&}6$F4uIO2+LNS1}IIu}e`64_Kkz@E}I_z`qlxm~klM0LHP5M>0-e z>=UcIcN*>)ryK4yjQ20oaL`wGkYhMtTwpk0Tx{sa>-wdJKH~~QpK+z3KUmkVGV}@4 z`>z@fSfSo_$`%b(MoD^-jiVXQL7kV*?*sb|Jptl%H3XYo$P#t_FC)P=I# z&2pZqP}(w%Ww|j%GiEOQS)Rc1=Q(`E$&8O!A)WE7j58U3$T)}bql^m}?_pfb_G z8P_vD&Dg(>o&(=94rP3bajb@s{~s{Jm@6^nRub5OG0s-FW;EtToGf3)?v1$fs6}S{y5`e#xF1~W&9fB3dX67D}lA% z<-5$NVukk@mvDrPxfhk?1uV~G`7p-yEH?^uC`UMm<^FN{BQd5%Vg>gujoG45R>)=t zIqU&Ui$o%IFFoh+Zm*qFVFWt<+zy~`!cC}R&I8E3Kw^BBjn+`>4A z<=pHl@hrEpyny9TFfL|1opFMT9oU#r$_g}#PQOsj;(j_*DpKI^7|RP92|jQW*Dij%5 z7qEOA<6_2lGcIMknsEi=nT(x5dJeTGOs`5MD?G^xRg7maRvAmiY3xA<#`P>OWSqef zHs)OY`{@C$V|hBe?+8rcE1|4lOhIO_LI^vEW%(?|35<&wI~i|goX+@J#+i&u4b1*` zGTQ$fR!C=sELP~uxPaxe85apXMWYxOvwQ>NQpPVau3&r@<4VR`jrKp60}Nw@Dpt6e zv4`c+j8&E|U|i35KV$#?dIS$M4rN@%IF@mRmj7TTFylBYI2j*hT)+_sXPnORIgHVv z*CuU$V4TVFLyU77?_*rd*!3ba%9!yK<01~Q3*$3HrzA*o^d_!G#`K>X86bJS-zcdDC0L7$1;9}aRTEBjGgg8<%e&x zeG%d7h!)yeK^=oiX6T#7%RuS$pb(jnZC&AeK;V2F&j;9(#aGDTc)X z)2TZg!1%!Y9t~xflQ8>WUWR!BW&*wy9Ro8EraMds41GWPGu)hlc^~Gv9s$Z0m_isA z%$+dvVP?Wigc%M)zxKTX6r3I#pmc$y9ZWLJV3^J@elSa5X2E2@OoDO1#KUxe@qyVA z8=yQ6QwXyW#s#w)W+}`(m{~A4_YP2Iz@)-VfEfcb1SSq93Z`>U{2SLNKp6!y1g1Ys zFBm&a7)*PZz&-(w`Iu*pvCYxTM<`S02z_H^=FH~bV#F&{ri`Dbzfimrf)pGL^+;5h z%$RQR9j*c!zxrl&;*q}b!`Ty!WOu-jABudWBDiy)3Ki!>Y^9y3d%4}}+c^W+_~pW0 z3IngPM`|3Yn^@M|NAjZiFLZ!tig|NAF9j1K)1I{Yc2JwS;UJ_Z*A@{-j-iPC>p?oB zC|)ROPVCZkYLQHPD%fukpz+Ivy|fuN_~gvUzUGl2ubTfVphrJ{nC5z33J&j>md(xF z)Hkz}JHtKMTevr}xf($@Cn1|BX(`CivKiR;<-*R%K#&on{;%0gPV@(7ABao>#JN#M zS-4qk=3{*`JB32}#_yU)w$P&t3x)B8$$}f_WW;*17KV4D&9_U&|Hs(5fX7u;i+`PY zWoGi4lSh-uqs{agN*`$&N{c|#QlQWRp#*M`*H8k6my9)Nc*sQL5d@cLDYyvs~2@HRIP#%u^S>d!3)9j({=cL}#dxKVXfKx>D3@nxDQLZ3d(bB}v6-e* zlq3yN{T;4qBFp*QAhE?gjbARBQn>?nBtmog!SlaSzKe37UZr_$8h@Ha`txVM%JTm- zY}Fu@cNcyR;?DhB(_tk}o8j-|yC`=wtY-ChxUf`~mpz@dl1koP15X`a4_>sw_|R7@;2o0qM>~w2TDHtY zW21f-2x*RX99~FNS=~C`2Foxgmm->0Ln%0IL-ZuOe4=xF7l}8mTRk7Hb*n&6evXRJ zc2=2iC!&_J>7+J-=YRct7u9+rTKyePw94{CZzc3SpxirF81u& zuL3>!2?p3S-nq$Qy6*Rb=YKsc*P;HPPjvm+bf>O( z?OBxla5Yy&coK(5PcObWK0ciprk)Kz%>PF9yReF=zr)otmF0;ZhvgtBr>OG{bxq=& z8L2J4Zw*QL^FM$6R~eqjGzrS!jpNt(tj!Mk#EkHLxU5xwhs#=(mH(+?5*!E)yaa8W z?+2K(Y~;=Lp2A^zx&P=Au~(PK@?%Qm6DO9)zXK z@)*#vtwersM~Te8t3;GA>(>kIOdTa^Pyh$S!MZyW}#gl=~oP*SqY5E#33Cp0G~+<%(!ZJOEA0 z+T%Mx`Q&V}bcVKBNeO5^dGAzOeF5zh6_=HkBBD}Ti)b238?;v5ZosFQfVUR%nLyG7 zw9O_V%-npD*=+bShK6Cn71(7M`ytMxq-!hT$zXx!uC2;AR7f)dhYM)kM&1at7WmyT zx((krw8Wn*S+?YF%LAUb!o;%%G^?#h@Ho0Y~vUhq-DnM z`>wgF?`kb{H5rs?nY;e4zyA83ZIrT1p2wh|5!&8&$^28+ty9B{94sKd)5KEF_c3;_ zTc>={0-DRmWLYaa74E9{Do>3MpAXI?+6@r*`R{c7v_PAD96$X%SyD`8DJz$rpdn}u z^sAu0%5u4jw^wUj!+WCKt$c1xUa5Tb(0sMqSef+B>4#~Bp5Il<$DUg@I6~7*1~oHw zi*y;n{OzLi8Qm1-;U+aXI@J(s2Ftd+*Wm1{mAzQTmSsFC6Xnj@PbPY@0~&(vYC1}!rah6-+=^aEGHo750`ZEhw9)Oh=%Z5~ zX?+avh@TP&{72}Ik@KV1V;}MrWj@Q3wG{LAK-<{H64Q?+m&K&HXRS1M952n*YN^PT zWlFm^VM%cg5Y`hG#d!xG_XDAL=c#Dc$3K~+RLedo#|G|?%0y_PJQ)yI&9^ulvHwdgh3%C z`J&fI)m&62Z)odpZRTqM5QwW7D;W8f3Wl=t=cC@@`#u;@`v`bI_AhMc8-$vW>U&G1nyjyWBbF=4M7qebtfUd@W=*ZMUCYg7^psC)V47W1vkd+r zX#2bfsJkEc`$@8^J5Ki&-x0}ZmaV?nmu2ff*yYu%`Lq|{m#ocF<)3h?{6>uk`^x#> zPzm>xO73({Po06Lfj>>TAGfhcr#fmS^+dyDeQwr7&3IMDPA9swDUHJ4`b8dNKmfxr zg%uf<>jSAuvEu>lOxl!hLiw^kgwO3C`5=|EF#l&{}k zN)AM2fEA@@fo}YodeRp&_!`_m}M$!0iw|#fgzK=KUTia#M@&>Ujfwts=nABOb zq;!%>IG#1xz!>FbanB`X@-Pu-y_%2ffl!%tAS0$D7>{2YkW?V>d}wum?f=$$BJv&v zgt#|A*tJoqwd%w_@@Y9giI~=Bc>DpVs%S&UU%Y`?L+7fA74bQ;EXSz1Y*HVB)3Ss< zT6lauK;P%=`dXsq%ArR@J`GHdfPP%ZrJjiXwSa^_J;US2?J_#cj#4RWk7i2J5mQaK z_7JU$dAu74#WhAl?TM3}TtsKAKqUse5 zC(py)t0Vo3>aRWEAKee+-CkF>rhr`3-sLHC`5y-1Q&*PiG3qU-c)@U3vsn536H|h8k2!$fg;zmF^ zds`EX_sKg0BazqQPlk|ZdEq6^;9bq&T_rUyxP!M`hWv6KjlhvWH10`0J!?b<0-<@3 z5v`NMebHW79kK(_$J~U>=wlk$%`lo=KU;lVAF!FVHFnoZV@I_#K2bMWo2wqTGl{hF z_QTTpK^{ARXvGKILCY=G5bvZ;6dI2JOG>af(5v#dQ4ltDpE>~ z$n*Gdt1=>$Jtb0!-dNdQnz5Zfj3nyL(dQTMp18lh9=-H34No}~s)JdBzL^y9Aa_Txzo^OVzjm%kCo zX!pQ~;tfGH()L-A2Z3FlzXDv-+ZPf3gF@~DROdH+T@fugCz2K0vR&oGQ-GKB(xVVi z>rs3h3%Jc`SLn@9-~#3e){3aCpo3k~9hF#nIHwAq>F=hn34EErz9O;#Z<-iCZdFC4 z3N^B-BPLbtMn_Ah!i;O-si^R;7;+({bED_ckGmxkrDP}_O2*<4ShU^MG>zWjjf-0~ zcTCDFC4C=O4`9N`BeVO8X^afYGtXo4muKtcUiDnTM_?l0-1uHD>uWiJ%R+$;h^B%S z-~=(nY|uw@9{6UWrE!v#^cAh#Y3up&;ZF9MMD1#=BroB(`gc6u0D@PjZfPpY>dpYo z>TeKfR%x2mk0Q|@$lZZQL*EZLlRr(=o2I`653ASkI1RWE$T$7*qNaZ~ZeG(rGZ5b) zRe{qZ6Y*Wz^#554ybEuw_w#rZh*or(7C4|Sa44%y@Dstng%Le|Vn#p;i9U;xb*tdy ziPR(vG`sMtxmJMthj4ZtJqr{J;oxhB88y|fZwOb~2H@ZoSrw{TA2N(C(G5t2O?!67 zaCZpz2SkJhe7L1OeEUofZrlg$0NB!jj0{o z_)ee8Bd|(rPB-RTk=DBmE&P<{G?!_ZT+q)@@H9Xb=fr`#|(6riR zV_+eLVI5N?$Bc%V4Mk+(V2Pyqqte_PV+wE8x(Z?@k`8x;+ENV>Y3L(UddL(y=)^^q zbONhU=~CJXa1-1L=@@~0e8!5hJ>VG<;xci3K>h+eNxV!mL>&rumqMfS{yPp&tHX+j zteA?(lKmwT-d%3!;k5yoP&W-2H^EK$XXxZB!c_RQ98&8KFgZ6YHP(7G&B9@dbB~74>yvnO;X+8EYaTCqI}oBMP*Q4B2Y&DzR zjz_xD-3#2jPU#RjIXA=Sy!yMuicJ&eS<-O6CA*DK%EX6TD?+k@7(|$*xcz)gaw`LJ zVn;yU_V|6cbItD)v$M>2lQcZ-0R}K|d>T0RJ#O~;ag)+5fpn@NL`9|&cSI$3EOiF{ zjK^Pq`{cGzk4^;ga{YLV)fmMb5+LiyK7>|oDa~ju8~flkw6V5V6HSeBsU^3(%aQ|L zP(Ivw*Q<%W=(_XqfJ1U%P~9yt~y58Gr05W ztBK_5$t3|h=bV&1cw%$v5d(HJcLAG&@$aer+DT_CkMDvS4rq>gMWr+C7Y zbK-*msR24w1Jogz`l9$bz}sFZ#kk*((Y1ECx>oA+sGQziA+x5UVpGS$yDKI43r>&y z65GRj%d&0&*mRWe3UK~=2~@2kdlPb7PUIKBBT6Ib1w7h6Xr)ECPoUxRa7v}ZD}ARwb?5n<;1i-76M<-@%m zy)CtrISfNmYJWB?O}jBfVtp$kN5kakt}`w9GO+Pl6GI8_jTrp>TP*&5$<0P}pTTuh z3>W$%a)-#FvB|GRjsZH%L$Xu*(RUH+YrCn~5DW}Pxn7ktLd0@X6fkIr1 ziiOuAK1)@_Zj5W&QA2fBw;z?*Q$8ksgW3pWJKpD}C{Iw_ooJNNc1xvld#O7Bk~5tz zi(Cg><@xdBCNNT{^Ym0}NLr~kVd~GWwU#XCv}DBiA*TvyG#1S&ACpf|CdHKn%exWO zLk~U`kaq$H@`4VbQ89fyehWtD`_cVQO=1S!Skh1mt?aFSw9~Ht6Tk zingESvp)yqRA7T=(<;D~M_bNhK(+#TJCGl@IQm|F4*Ekiy;*g8ICU z6__B>roW<~j!&*i6)mHs9VtTOhjQgPC+do!~G5L;j8@!vowKJ;^n>Ug!5L`LL5;74wm zgbAT9A_)fA#Xx?dY&cFGq`2mOf(sz=P;7Ckiyo7`1m{!itl=n2J2QY)>y6$hL&jtoWS1eskj`EQm~2! zW-K-;HN$q4F_CjeEjfKSAnzCq%98#N9dXzgO0An_$xR1EE<0e!dHVvgeos(VkA-CA zXt+WaGYx5C8dAkHq{2DnFT}|!=mBcku&<^S;Q7jcdyI}HUmGWVxK$C5iuQP0%2z46 z{t}QY0DnhSNW-ea987 ztYO*ZtY&Uw1u|XI6`?UI7%kd2lR79ALIJS=|fiWXwgTfKGOOa(8q{A#`TfYhaAnL zMIW8|Nb6%jA0zr0*GEntvYJPWK05W0*2e&k?6ML49M?xqAF_r=i#|H_k=Dn6K1TF0 zu8*8PM3d9PBe6^#4y}%SKG<-ky|MT7t7BKJzp8lo;%PF@7-qi1N95PRz=U*aw`Z4S zQ9s+GlaZXOyK8nIfX9^I>wJWI0vEt(>&Vj084ZlGb?w!;yw$yC0N!REM+5PSA&t~7 zeN5oGhj zomeW5A20A{IwbbVJ%i#0OwT}=7AgKmU`XYdp&9j+IhE4>_6+l=N7TXe$)!q=4PPf^ zUZ90IHEt@B_vrdlYY8+pO!2pOMQ+Tq{DG5*Ln7EsGwb@j$U{KB8};KeYaXn9cxxV3 zX;4bp(-EQOawVZSVsU-l(sw7X80j|HV^G$a+n zVF?dL3{UP<7zdS6r`bLAk^>K*1&%6B_kQ6)@F2JeLR7Hw7(b-Q7nt+$f2cNhV?dq& zYHmS*9b%$ii3U?)Xg7X<(M;)hR31O>_h%)7k{}YHo4q!PN;>jgOP&KVo_{}X{is5I zG*u%j`opE{%Ze})td*)4?w@5Jon4cVHG^Sk>yMz>mPnEHIWxFNqeU@BxtDE*hoNC1`8$ZoDx6nbgMJQ+n-vp`KO%UeA^4yBN*Ju#w1JKy?%eWZ0{+Pl5N3^*&|`r zF};}zt7WFqP``D=PY+VKz=qr0g!pl@_OabJzeurj1m4Dery*dkI>StkyQk%*Q*~IH zRBj(~@1b)ZvgG-^+ya~$sO_te&$%aHFV1!ckV5 zc1;JGD5A+BxL=^feU!27;Ykyqc1j&=YX2ABTWL{)Bt$1|w5V!YRJfSccu|*v< zmFfUKL!&z_!hHgrw}SS(Y>kvn#&gk$$haBoyJ&TPh{zv0nxt$rA`ukzf%8cdFrvXE zLbOgMH@z`K8@qrG(*%#A3(pKrbdcfqYb`91h4fdIJ#|uPRY^2MSgS%b^^RE_yQ4~< z8j!>t1fu;Bo!Z5l0`h)fv(l*MJ|5?XA$##<%waADGV0D{oE3CzVFFOv0B~bo7K5AO zx1YsO;K?e+3;YmP0)9`nb5YoC4$?U|*|43=p18-BRby4MV3bV`!!;7?ts@01IO>I^ z^t6DymXECuH$(T$p`5lc)27fH!aWtzas{0Ou=T^Fzzk$%20s^CkJ5;Vy3gSHx1XwX z_&vhp$E|f`vTisetLgfd(Dk)Yk;~bQp&J3L*)f^jAD0Gtol455lD&Oe4pv1(^q+4l zb{MN@+VtL-)WR%%@7iq1E5Jb$A;K>pn2H*aU1&h3570Y!CVW3`bAMri%AD9@s#+$$ zIVW=`dg66FvOu6h_14IG=?;*IVx3tkXO8lZx=f1O=t&m$2c-r(U&wheVmD?JuZdg% zJc3WnqypSTDIk+C1*G;DtT1_snICt1On0Y+m5*L~*+hKY-8+=h#m*^go7k*!xqv+S zGF9>}H!Se%G-0}A)825^hZ%ZVK&qCL7wRF(ego`@QcTx|G^I-#WpWI>-9V2QfFJjk zG%_i!UY(7#Mwc|YR*>0Ot_a8@o`){Jr*Ta^v&XjYW1$1wi847_L`ya?r_$Y_X6erz z{HO?Sgm)(;)K@P9zq901z}p&*SpuOT(KO1=LDdNDZ7`0XgQ4alnlN)Dzvx4(2vCJ0d+GP9m|OD%XKpn`UV!XhkDetHZO<8iz zo0OFq?zOy&X(()d9`(o2I`J1v{s9;hhSIWB6eZNWg~{n2Hv+}D-;;HbEf?*H$T{6} zWXXY$EF6x>te%w2>S$r>aD%uuS}GRT5X?Uql-c{jQa^_MXB30dAd34zi~IOlCeX0z zLo%q?J*SKnv~vv{1Eqjj4`hn9~D#4PbuxJWv?ao0*QMymV`^Wh``~Zct4d>540R${9mg@z}w(D%DM($9Ax%3susru)`aMZ~U7K@!zJJ zYdBGzY7o(H(}#W#;-Co}eVOkWT&u5PnxScVc2~-d?*!!5|Deo0f5o^zFsmUZ4MeJz zNW>nVQJ+&>alD}$BTslQbHqIX`7a=+2N_I{qFa4S4XypzfXv_FmZ9>@;6#uax8JYT z65%}0a;cfbNZgiiRmPrWvg-$^!9OJRD(5}*@}7gG(tDsxF3RpJm(%uCuvxuQ-Z7ex z_F-F&7_1_DtEq`KlGuNwME5Q+o|hnCPz7lA?OrO1_f60Zn#i#=0HK0BL6#s#kR!+u z5*r)v3Cg=(j zZ#ao6?8zv^Nn)`-lI6+C8bOwJ&HVwH!(2N-tJXuniS1=Mcd&AIUS*!cNcTNd-22^p zDZn)%9TDmLS4%De@)Kh}ZdUG?OjqxiQ36v97euF9Xksr@g55S}PA&Q1CoOrz3&@Wf zi}9A3d8S$><)dhkF&>pbpdzD|#ct^eY-DT0HNV2jBv}+}pdNQEQ9o{J&rSCb@4!;I z1O52Xpgh_^cSNpPyQ^e3UHv=h_BYV&x6>=PFjOQMBK*7XT+5X^Cu(VDMPwzty%!ev ztZ9O^hW&WMj9EIZcRrA?n`%$5meUyzk7N8iii)&|F|l#b`9i{;n>Cx2h;6>h96!sF zKb%c>?YPM(z;#1Hk2_Cq!8mXN;I2u~h5K+@50c$H(-Ug`4IUxlkR{|_qsv_RkoBuHxu zz30d=A^9a>dS2ug;AU?xnn-R@u0XpB;>Qb+-ijdQjlwq&(bFDV_fwl=FZIBZKM&kDr#+So#U6>GgL`FCQ0@V*vlU zQz4CV_wf|(-R%Du#qvQOp92zQ1DyUyuaaZcFt3jm9$m}Y^s`GJ8GQ`#2z)S*kYv$j zcP-~V$m#tNkCy=VB*QXYtB!ZdX`#Svq4|M+=eyPR5#d&pjCszR)%KCu#GIg<1GN0B zTO5N4`2#Bg6}x_DU_l&!!mDt~iaHZvp~ z&CoHIp`&WJ%z3cJj+}%0ivc@}8;II<$BhX*)s(;AfL zmIfu~`Ssz>-)roK2EQx{(-$9Sd97W0@^r&GKOyJuE0J^dut#bvCZ`OS%7*@OS=(D7 zM~qTkFtAJ#cyn7&x-%wf5ZOJA(2c@R;Y`<-^T5@&qdo)s|VF&G#$@f7nd@ zoL6e?1&!%{1mtcY@qinM4|nFxvKMA`_kKsKqz*=;mUSqJ$3^{W= zIlPMTw3&fcOQURm3#0#B!}ncyGs>%bpeT_TC8D&BlAsJJT^EDMb;b8YgYvW&7sa!F zf(AM*j2!Vt#H!)+C=IoSZoOtpVv+*`Mp1-8VcWtgo5Q{=|pN=fWa zU=pY^?)SlSmkHFHV!|Wv2t4Y4#+`ZVaF#hJj)e|v-YQ^}!oYQV9FdaZNSPr!D&tQD z>TJ{qY@l_;r88Q-EdZwowInxTrh0N1Ix#pRmoc~ET>k4pHwg~v^Uk}Q6 zfV(^%AMX6U9#igCZi5&WId#yIicnPXH0f>SE8%2W8~(@c-CF#qzJWZo8s&@6XWpSs7xZ@miCZreb7yu zAGa`99WxrFDul(xf@#0uZYWHpB9ai-VPKBd)gJa+$5l+hzaX%7NZN?%zfD-W_wc1-6k!xc<;SsU#|FQ1xk znEoBc=)*9YE-WsJ$1Nt+dD;QBFNEY-G^~wE(@ot76zH;#b<{C7`y*G7E6CM=r)3Im z%4_(tg^UHU)RXrAM5vH5DNY$VSSW){m*miNj^OUkHLJ&*Z866w^lVEyRm*^YskFQs zZEJ5#I#&nfG@$iUno5)#=zdzV=&X#Y5CiZU72*y)%I3@Y&Ig+9d9&1M3`(nN7vJO~ zx?Zd@=gZA@yRpf?+UyzUOJ`%8pJ0~NTTeInhz87(fe*J@OQdyl7DlOK#OQW9Ra}vf z6~lG1WU!w8JSp>f8)VM@RWfVu(NfyC8pD3446zODX`oAGYJKThWAJM^iQMCbqwe5T z$VbYYf17QmvIV|~i61v=`1+YXOVe2PX)lend_>QY=K`xkdMS;o;fvWmcEt z5^IBUB+vr8rnCSzTZm9JbNpM>oMUHH>;l}304za25tLs5?!Ix#iVoLLOU~syJKanL z-As((F27RRNua59aaqTZbp*>&^O+h{>nxR_ZG0U=)#~-E+xuN^mYVUI?Xx$jEwy2mY}gZ&Qsz%!W!1@ zYNclHEb31^+7RjcXi)wW*sF3?-({{D-CdV9#32X8(hE?TW^l%G1Pg)%!39EetoPgs z>F5MAfjLK}?BlX+|HiBqFq``+N!v|^&?qXlGR>X{O20A^cror5WX&s)d5pOYG=?e~L+E8% z=Z0!y8(2%(9W%@%p6s7Z(bQ5jc1Hu}V{0UDmNMI%b_BYtHm;}2GO*5OEKOR?dQ-@F zye-z1>ZF&PYLccs+y=rR9b%lFcp)gWe$0IKGemGxTsAQ%pU8l`d@L%-(HMsEa^rpn zJl)Du%LJ%z9+hmaDD9(rQ9_kY;{3RoUaH_}k1+THvo=L#6De9qYNie2m(|E+*tsvp z&aL}87gO68P}`eHy-mu?u=1JO%_fVr^XyJD)6|*6G-e>dx%HboetjvAii(`pT%GMMOB|a1O$3tC(0$N*Erb;8Oi ziuhh8x0ualc=4gN5$YNYj*bhXn^H>XB2uo3yYeUR%@n#XR4a)6+*$<*LbY{he zftJVI)D+`>KUO{Wk#$r`eLE)eTw=o9ppuSv*-4HjCSR_dWJBRZ<#>6fEM3~g^)F`E z=LmvZKf~i&Kv`T37vt^v97$))Ejo{?)uG}t?s@xq=*@V%sjNwQ=@rfTc1Njh4>qTM zjKZ>;ZEd=wigJ>>Ehx9$PG4*y&Jv)XV8vM2c-TEc=pOyy-kXjJ86itQ10+6AYV}AV zIiSaNl=fAiN$F+WlQTtUv7569(0&bcD4nt{#;5(Y8wNUfJeut<2-U-<(+r*fUj&>x z7uic22hIt~=YS_Y1|ROsc`cD#GjtvH4d88$!H-)dVVNaXlQKN^45giwf%|r2jx#d%Puz#emrYD?TAe3 zMiP^8J(UdXA$bnyRu3kEYO%5n?FHy*rK@G4n?+~pkkXEGLel32P>idrX@6vbPkt6< zl$*NdVr(;JQF)ALq^ofu>0}Okz{J7;@aHPGwG4sigJP1s9EI!=% zwFtkR7JfX?}VH)>)ayOT9W)8KkYC9T8rZnwzU1cYig)kB_e42BK9n7q` zjHw@p{<|AfKW<$<$N3!hYgKm)CRqHkF{o5=|JicxKU?U0dj}x5fJr;)^y5|; zrg}Q((8Ki4I<`LSUsYi>{VQ|iE5nQBlY>Xfwf#%v?1S^=v;zxJe-^S}vPg~^Yn7#= zN63QSrP9*zE>>U97q6?yF9k--p3XMs?4|5F7vLC{0ta+(#>i=o@~~Qzn4iU?QPYWE}|4 z51$nAS-zzuql!~?s=rk^VH5;y9(57s0sKV<+K@KoiT8%&#lDbCX&5xSPtHBd?ODfvI3XWq-gzPO&XbsT9?iV7oq6XG%v0-_r-pjDw`C|KrvO_$ znLgZkWx2gBJ8)-67JMWmk9iD!+-l^ay-{>HHsY}`I$^e-X=;wIkmH9rwLKW6WyM&e zS+|B)A`JQuHhW286E2U*eNUj1#JpX>&vY7!rtbMQZ=%*4D+2pDU zX=UO)Z?K#hQiUX07pP(7M(-y>zKP$6#!qiFVf`R6)gonkTP4)9NV+~Bl>32$8jkkV z9SaRU^aZLCMlm|o9YO`6f>0?EYAxY}5>0+S&AW;2AheC{XExmvrlN4p zZE>CS6sau@vSqARPQ{FLB4(pCn2kCx8!g9dG;eB^%)xBbxO+9H=+|IESc?hacr?Z1 zWc&(Lo1F+XJnXd=h#uq zp4v4vvIbkjQOw>J46<0r46do2328k>hy(_RGB)5w*$W@)NXo8EP+kPOzv^bA4|i^F zw^Qkf3xe{+3yHZhXu0>782qcy#ywB!?#KOpjLy>Gt*%#6r*^n^(&g)vGu3XlG`5`= z6bESini~xt?qpZ0Ic*0Ea62)$c?<=(_AHc|?v32_06HX)U(fL4)hgr;I48!H|M+# zyCLh*g|G_35e&tIBZOl%Br4w_Jh($I@TX;m7Mz|Hmg|80f_ee&@l1Y^C5!*zVKi4I zVsupe+fNYrr`;kd#?@2ak5v|svNyuxsXDsJy(}^J=~V$0)VfM)U5&K-l4H9-x5}Cw zm)Z2&NxJ96APX}6x(iYb1Tg#}NAKhXSd9CHSXa)LD=`XPic#nyj6LUK7&;S!&nXyu z)?x5jGgwALEte%2i)LAK3U}vl^^MiWwfk5yX70z~ghVBKH(afime0AqRXsJb48x?F zJ1S^g(QZxz{1to4-%w(nadV{rM~@1jLJhplAub@VLius`Ko4zE`}`Ufa_H;zLeNnA z?q+FuG9>>B+^E9IqN%sTeTg3=Uxi2X+4myJ*sX;In(xf0pu5oUmYnX@=Jgmpc!xu~WyZ!^)>avQr)D){Ai!IPDpCe;~<4 z&i|}onx?}PowlS-=3dg#O2*NIEFI)k)hZ|sAb>FtaOT%DQNY;14`FA2K^8kLJIs7$wFK!F~`z~kVbGi67XrHWBFLy z&WbzOVyAY2u5V%&IG4wzKq#JgQSz55To(wuCmiD9ZTCjnDh~T-3GC;z*$+bUc_4!q zGlQODqDx6CZ35_5x+$%&!N2#zkldB0b%aFm=mZ_vBT6Iyk1&m^kZDi27YGI~h=AIW zbm>R;IK9GI03dHy@Z(mAB_%JD7`-S1`$Bbx^S+0<=5ydTTm*0+B*%Wsjf)?*bb|t2 zNh5uaS?VTG;SLCs4~#09_!Scqk+vco@@x%Fr7l=!$0371g7gCg`)G`|FJR zm*Ba}ghK(tgP*L-5T%HTQu7Pe9shkC=J95_BX5M{>_2-mU0vY7O|P6Uq!SSILK<_C zX}_#fn8^rpib$HCL5r=A9h1Kc$+^Erb^o@TD}LN;En?iN!fdD)OuI$Rrr%dXGXD=m z$n)dFog0p~mu5463dy6u(;kB#x9TjZ+eY!!vMqTV2c}iMXrU&txX0Maj@pNyCfN@WQkibqju;wSRTjT)|D?fu8j_kOe+LmY%vpPtw!K=7d|1 zZv*${YBorf$XX_?M>A<{XVSWu^@k>%qfS=l%EwDH@pP=s?60-y8=1rE+QR_l`{LJ7 zCrm^b>&CbpC{M6Xs*;oTmB^Ys>>FYfUcv~xz#D;$7U=DbO|9jR{}`=TFj}V=scZJm zW~5jsE$@xUb+ouiBb+jZUPxm^^6^;hY@>G8blQvNwLQz~&~vCe-*HRUk6W9nWz%S> zQ?kxpx+%9KEc%vzShHo!vY~yPM7bL3eXD zkMn^*e1N-K(vc_SM}a`I^VB+fg;}}&(>nXOOLVLfW){f>9OUKJc&?-xcek>+vyK*> zbwru+^qnY~XT$Py;3b5*11byId*5Mbzk_~I>B`&NB#QqPDEn@ibMy&zYMvt2bJUpc z!c@cHH^wE-!%0JX`T4M{hVh0IFxeC^s+r^f=JkC#J*hVmr-jf%`9g8K^QmJBV*`&r z)>b{14{MWdpVdiUTK_j8bxplobFhKSLK@|QeN9>E-qXyk>e;e>bPn5PTi9TeVjXoZ zyOZa!DgG3ae5xc~3QHd_rKu4jhyX!=?4u{gzu;H!EBF=s3VsE@h5oSJ_~clf9G)0< z?%u$Lq|CR%^3b=#GPDQz+H9D&#n?Ndv@ZZ-O82&TDE_=co;F%;@Q?4NX60#nN=5NU zzC$r7jf^SARfgxsz2T`qFdhm5*PQi5($e*ZH{2tf?f}L{mtS&{2gp22fO`4gAk&h5 zj(ts`i8Fmsw>y6oksH-r{ST|=t+W#(a%v6(wmJ}yGWqcWkGT5-vKExe0_NuntS09l zC)#zVa6pTGV&aa7tp0FB4ys60^|(5vY024XPOT`ExEh$zGP_LeTv{kMe6> zXVq8nC)iolr!=EzGG4JYQE4k0Bl19=-p_>!y`_eB8}waXn9AeF3;dBhzkH|cWIOpz zeW}sZ7+cg2=ubBcvz*rOyVQ_xu;*1%8b@4h#~h+W;npZuRpK+yS$LEJG!D5pZ|- zlk!7o)CNC~Cp_~?MD76cvra#5{w|>1{kwq2o~PsdQkLg;fJnu-uES2~BgZ4q7x8Z~ z*awT*V(?$eJD;nyH%gMm8r|ZqPZXG|df2USO+=mp4#2L}+K*e!T#8EDsHFbKvmLB1 zyuev{vaoiP?Rqqf2#sfmN#8!8<@>IHLY%G=UUN{eh}WuMO|rM}5Ry4DWzCba97ex! zHn6v`XK|`UTG>=r-Q2@eiH){Hp9ssZfuZl0Io~_gZdfv`+ZHMeE%V8+jCc`Io@qQ+ zB{__2KXvR)cKs@RNU;xNZ;r@oNO)r;EN^>Ke7JMbCOcK?6YJc$$xap!9^Yio&JtN6 zu2L9Rv212bOtU#yo-x<$YD?{y&+0T2p>1U156HkDSILi23Z6qL_!3IN(Fen_;y^^^ zq6j1hu^CLM60pGV&%w_D^;5+P912AYML}uVH!g|D+v=cwFDND8(%A|^yk2v~@m5V#O={5n6}Y?o$dW1d?;9u%f8$)O@_AUR#H z*P7UmXwy5fKgt-7hQsnWkn^IN_Tgs9N2k=L`2;2X?uc9iG)<5!)xJ7Ze`Q$-+GANB z^VLDqgM%SX(^y+lCLit>X0>1+WDP8ttINzv*LKyY8A7|zy;!(dUmK!19C>*}Zc+If z8P?tuUk?m>v~0NFC2YEa4#Gr441*sp@T3tXfCAy1-FV3`^ zR#tNI69bqYknMT~P3Y^)Qhw~F#*dq&;)mT6G)~(VyQZ;gJS@Kldh^^fxO34KI+JVa zPy}Q0u6?Dl6&0DnIY{@=iq7j_{|+eXGbL5LuvK!6tdj6kREEPMTB`&wk* z!BY9*fin4zedY4Zo(g$#G$EhkK;^@ny!;p^FYo2>p=2%O` z{cnoOE_bTI^8NQC^8Fu2}CK}8ge|;~O$=@uI)(`OUVZgoP@8Zx&xySUyax>IljBJX8k2-4m$2NimHG`goEnE7=`V%5CCh9K@WsF+t5W|LBZW1!iRB3$4cHeoaJJo)9r}A%z74!h>`Z0f-(v7zyd9RrPc%OmyO?JR zb5cQH6!b;uhX!APUqbQYx?{CQFSgMBBBR&HyK|`__)>HAnnK-RI;U4Ue;Sry;1&(c z^m-|yP%7=``xsu8uB{NoQSmo`F%vO41TXMIKt9>dmFF;aCjJ_h3xJxRmO1yF!?rL* zJ^;-BDWRBl9W?j@&{iuADeCUW3;f{j6Uwe=j;+055}nplYu4G7a`s?YHqkww(5wAa zmD_gQCDW|gRF(Qlghh5t$aMCRG1g948aSdZERUH8sG$wO%}=+m;&&tX)WZvQ<$g6H zU&ZggdvYfmIWylx$G1-trgAY;s$jo^bxx(6gW$~w-f(D)UBOR9R^2+DIYpOx$k48 zeJsMwPbG2&6k}gTw7HfSOpfcJ#4C>Di1AWPP&L(`x)}CtYjU8(>Mo0 za?V%@=5Ma(qv1`T3~3{xKTOCE_hBdc&K?HKVb+!hInzNCZtP>jYEPqtx)(^xrD3@f zcmSbp6DT$KUoT^HQyP^|-Dhx8NAnP57WmcU2p(MsO9)HoGNd<4Lnc5WKq(GT|H`x2 z6A}Dh`CmxL3-IqLN>DxWOT7dot_sTyz;uGL#6k(LU5$SIb2mkW_)LllJpZpLDvV&E zpFX`8 zs35@qLlG75A56$W67qg8^vo><>sn@eVS2(LK;5=K` z%MsZQZ2qNNynfsaXxlxDs2;;sE5{UD&2=4QFG?F1C~gF9^!)m9Yb6IoIyivb!g{s2c0q>Y9msR`AWCa_ljUge; zNP0y~u3#;nf8WV@hD)L&&U-IpcaJ&ny)87Z0#a)@;g5l5`4lTO`>`ev%Xl9aFwQ#U ze#iIkBXa()+?4upBV)aHKiK>zW__;b>SOjp>~(wczyX$>fD!d;reQ2if&b({BrA`3 z0zJYseu$@Trf0v6$nSvseUpCNdUsUb&Hl==CuVdA)Ah3+x9d+4IbxD|W{wEx+@Y6~ z@ckkA>g(kH_g}{zrw)t>1&kU~)}UIrQ0^Qcf6(8LTbq*D;yKeW9G1?(2!kG*ta_ue zlEuO$tSF{f55S!0{NrNOQ$?zP0hOZB!-A&x>A=oB zjUDfbUk5yCLgVk5itqwIs`=3a=*IQ}`Q(=`0%C2cbne^6wjcL@n<}JyyZ66MYC5Kc zhG|se;fVYR*!YT@;eI^X%GEzC_17|AG`AaO^bQtx8Zbdv=32JhZP*N!OKy~U{TULf za`c~L*d`E~TA{S8EWu$!9dsHnR$=gypp7X_CztFiQ2eu>i^xQt#-0PkpZ)^2>O74- z2#S|IjtyLCM4}KUSMaCdP0QCmnJ*;3MC>%S(-A|EKLu8KK+3noGN#Db5H*4#J`VKL zr@0oQB3gp8gu`5d&e`iQHtILvUHUbOSoyJR6%xRG0-b+cVjq(|CML)1;Zy@Af^t?B z@_#w(9uO~)^xCle0%-a*0(Y@PYb=CLO-}4%Bp7ww4&dIQ?wZTJF;V=mbxX;L*<6cC>L0h^1jUKXeEQVxlBofVc30^^=^KknWKTO;{Xjzb8VPRaVP{0cBB zc_J!LkdkvqNu`$(bvpnge&b6C_){k^$y1u9WPSM90z!c&ZLFFSJWU6rDVf3D6il8S zmee^jDe&W#UY5=tt8%7$X5;NgE99f}u4nGya%5(B%jsXg+JkOqY>^_7$wfo zF!#;i&PA8$_Q|bbc>#FIi;*8sa;dt8tOgsc?$%Lyj*-rv?1^hRFO17VlHE+o>PWdM z=Z-4r+K2%gX#Jg=$^yKR>7-^K{$wn;1Z9@-i0qO>Ji>sR&$IKVE9}}*Igi2sMt@i4 zR9?w=tPY z*3pdRzfL%oHm=tqYobRqtD}q)Q?r_6VkK4TDE^+n6Y9gAr>>^2S099XVJ^yY>1IIJEKI}5U%g@ zfUAADrH9N=w9B_dx>UaYEa&p=c4=Kce)n#n_<++9!Q1)Az4oliN(NBQu~l|(#+>uz z&QR8_JywZ*+@8^c-q~S^)x=IDDqvGLZ}wv~wbxJ1%GFF%jVCh6CN@}N;>u^tg!B3b z?3QdR#|?TJtJxIQ#38XJ`kkgHW_-D+=Y}98)*!KFJE=E0Vna(n<9NaoiA=0MAoWkw zwB?iV(X&hB%fRhyS<<%^WxaX3yWZ^QWuF&|U@&Y0a->(^{G2&`_F|{}Zp`1cF{$kf zOD&s3YuO}P%hFwKjy#*qerPgdc02bIPpUy%G~X)A=lL7$`fN<4^s$7&^e#yaPHu6f<@4sj%gLK7 z+$I*ilE07OTi;s5`u_j<-wDrmu5$VR!TZ;MzSTePti)<9BXN!we5B;AN5sN zm&jv)GJlKrKjVE1_p9IS@_tC)^&GM0Y(PB*`+Bmeeup_~ov~UtwbWN9Eu4aE>CV<- zW@bz={gYT$ZtR)eiTn+CkH-^ugxe1QaOZIXoNiaoL%jFXC32_7_%XhpadGFj*V`PO^!o1G zKSSRLd>RRLH`ptx2b$xi(0e{xBJT%CxAV#k_PNtOzW(_Vc^1$_o^hj{Iyx`vg)j22 z;6Pyl3UjFMOWe2vJcH+dyU}irYR(HfnzR2#d*htFwD!zJrE(T&{Rcl?GYr3AdNBFS zk4v0QAMiFYW+INcetluGM0Nu(I_KSBr`((SZ?KoH$&2cK zy+l3$3+-AA$+)Vbk;tz zPV|h$a|xO5%e-By5z6z{sLVQ-aPCzB)K3OJKh1P^I|6Oa-U0i8(!_hBXmL>){wq5^ zKWL{`Dsm;T>#ypaj`;v0_OXamKo{|Q{Kidot<&)#d&zWl{N`X(o(JTFxbxl**$YZE z7f`mH$3J8rG0k=QC!_K%parg1KZJsoueA3=+zqVaKj%z3wF_@&45>6@N!vu4!RaF` z9PxYX;i#!w$=R4$QMl|K@h){A@ZA6M5YgZlbH}0SVc?4+_yaZ*#;Nd7H~9+$I$VF> zaV-ot0h*2nZ{emKl{|rDGiCIc-JTUgKUU&;hK%|xUe8*^)&Fc3x4CMubQ`+>@p}-z z8y;*Y+qoM;{n37Yfu3(HP>{Y5^hOMccWK+DJq`= zt~-3pOvIKxi7_3Xe8lp*`SRuZEN(9V_vOpg(|h?7OqM>@vkTAb=ic}IsC)p>3eMYc zZnB%58*j7gO~jqs?5qDJFLTW=qp}T{2~*Wo4E>(Esv>SafT-U^<;i^9-TE|L7p{Lb zD)$24r|vYLygHt<1C8&LZEF!+`LUUS4B5Be5c*ixa+8xyaWsd%8k9ihdV#K)2=leRB|S| zI{L6-u?M4MUkF=>EzYjn?V4<|mFuZ72{f<^tAPnb!y5^s24(OS2nAJ*jA#`$>Sp_l zy7@?VOuhhIK*aQypX=o#-hK6m#phW;Z9~E^nB4@GkqfIpg@a z^K6DGUoY>YIe)*)KB95_oS1AmHzrF$ZmNB_v-TtQiqfw0WAeF+Vsc}s+_~W+c5=BQ zKLK_c9|6<*7t%Oo=kxUKkJt-K&D9N@1ACdyrE|!xDK#D4Yo&5=Z_K%5$Ue%H+Q)~y zD)7{hHy-rDf6?7`DxzK0R&nmW)owSc$5yh*>AaIncX$4|lV)4bk1_$SV**^a-E91t z(32>dk;GI!coTn2%1O=lc^U2S{kRW5TwDIhjWPKXkZ)S3#RwrRvl(5;GKVK6|&_aHJ+|H7u?kGjsh^zN`4+{RI8d zn0%4y{inO_6^qnE2A#=`t6Kr`73H|Qsl)d$S5xNe>;`i=2NljW?qjEYI3^1}6)V_| z?V~x3JABRgsYfaKe~XzO@8li!5wr54EdMk)2+$R3+J5s9d(N_Yj&)%$sHgMdf~K@< z8gUCH@9olOV)B0AIU;xRJ$CaZP021z`h2}$WihspBe>jep_G!d>efQPoHQ1>6c)MJ zCdZYYQ$I=V!nve#dn5zRdHfzbX)^eGNH!m@<|!rAss{C!Kwe=_i#4O&x$r)Fp(&Dy z66dxZ_T0vy-^b*`uf}A4+$~HW?tFU(w~6M<=B+>S??``&$tzxUa{n>YJ-eRgc?$QJ zeLSuvP)=^44Um9oO+fFyVE>$&9Zhjz&d9tSlYZcBFCre!7G?-Z=MUH0b@MbFt=cdB zPfRZRM@-H;(d|P%!uP{2?!0xMmnU^QIk#)F79U1Sq;j~%8`q4LFRNRbl-&&sAWh#c zPholfq7mZ_9r-SJ^lepGQh_}EjW0u;<)<3GzUzTbj@|HMV}kFO;GmHHwwB?+IrE{) z>e7BbM}S0G`Ms&y?196Gn&7W0{J#W9{qjSD94g{dKb?o+%behs=6?6OeCJH3p%r@D zhC>;LiUcZOdflOX`J|@HHL2@9T3NlRpHGr`2=7>tNX@=o|3u_?dAW1V9f{iNNd!(J zu%7oGHxKW#g3U+eiUevLTfDOJhn|n)>WX|EPxFex&t<+7I%DDIFX9JQxsy5L;63sp zhmA;6!ee}P0d5H&wfZoU>i>x(smw=iftN;qc;-7F=;~?KY!{!0%j@)ELf<+#laA4v zney4k_fR*wOJasL39Y`132pTZZ9^R=9nXr(;0$epq#0_{N7YDJD^_pUFE$E!sBIMJeBquV)Xa6_f8-}e~Z1hL3j+zcIkcI`wH*9 z)q8LB-W~2cE3F=(!F!AMo@{mnz2v>0_ugOg-j8_iA@6;&_rA(|pX0qx^4=ZZd%pLs zGH;f+#UuQ&$qjIa7lB8-_t(AmKJWd8_YTc*`D?uQ*SsA3f%ksNdrx}rNWIHn@4c7l zTf;xrBW(8G@ATfi-uou+z0-St!FxaFz4v+V-+S-BdGE5M8{lm3y~=x^?!B+#t>Mcp z9$}~Ve#Cn}`TtrwAMh&2$N%4JtIle1mSGqU!Y~ZO5RU#ZB!~84RGhS!ijEpB(m5%$ zG&vNTgi~#`+P{O;`h!DZvN%{7!oe^ME6FhYUhnffuJ69z>-W2^-|xD9UDvzU>v_)e z_rCAvex7r-o!jOcHs7~7(mvxpc3U{s=0!Hg*u2x`12!vc*4u14d_a8v=1aTikF_^^ zn$3%BuCR-+!#;pr_VSx-uKKs?Y>u!SrPt1 zr4}}aTGgxkwH2w?mS?R@O+V&cGj!^Nam5pc-9B}~_~I#3 zXK)jH+62bz%G3+XU#m>@ls{3KnpHlqD)pfaH?B_gB$V%6m6~?& zkY1NfC?0zE)TtBhEcQ&DGJe9eX_psnSW}&vm~i03dTqqGX~n~*PMtE4Zyfzq2sD*YZ78smGU}T${S<=$rdoKlS$F2}7sc zIc>`13D=wJdXJh=Jp9hWt8cyZ_Q@0Y$xB`83x4nQ{oFh@nt;uq&5+Ho&4|sY&6v$D zn~nl&JLxvFZMtn1*!0;fwdglp_6$C1wf=23@dI+&w4V0(Dyjkf=_=L1vb4li~h&!K70EA#1i}UfXz~yL7NpeL!y46sQP~_;5*1V zQ_ms&%kO(J^})r?MA!QDsUZf~n`^z&Yk@_6!P+?fJ#iQsG$39^wHN;Xq2K;jX>B*( zgzXLgzmnREAJ}Oeq@o9U{YzTVzuX;go?RZ9cA%r&wJ9|{_20*>f6q0ceED4GLFLOD zQ?rsvP8i@WKjWGMGX5{^)I|2H719n0%(IG&znO_2Nw~t=bE@-r>(IO>SsYsaPQW>p zGXKx|&8g9ZBZ4Pd^P@JMnbveLb3pkITT+it_(&CB zZGQE7>P6boac`uK6sOtTYV)8st@-0^zVK%1rCRQkCToX_n^Mow^jU9N+Z}Cl&Rf>& zFWA$c*gR{yz1((dy|1nsl+Q_#<&JU;Kq+;NtHjOUv_f`qPLH7w_Y}kw3tMWHt%m;(QXu_2#LW z=r?8chAV~lZ*skln`*nhN|`Z@&0OY(AiowAUnUz)C7H|*z`gc-!&lawKy<>{hj24p zU{3_$bbdWWF9hIK{EB!p?twm%gNw6?mI=aYqCXH9ztJ=zJN&2ek-v@zj^x6ROiqcj>~!Yi;$x%(7b{3N9)jMnM&IcEeRyNcLGcTo0aG>J-WD71fktiO8 zzY%RG`!ZvmBk^rQPo6QkH*o@RE*Zu_1mP>h?bnWxHd4t8oiOWiN<&8qUnV-z2+X;H z`lg||;X2zp;h-z6WwPNU+kLQsG;#uAc+dzAg3@)t(L~$yLjP9#g(w_x6~AZALLPV@ z(HR8b_e3jn!Xrjn^Ih-~+dc3xqGdwxbD|x`;3Zd60^=B89O|opytr6HO2+ZU5n-hL z8a7HDcfxZ=S?-4U`CJjK;Dzni@!`wOECc@@O$jmIj4|fsn^<1Uz^&sr35q%jk0_*P z#9d+$rHh-}`Q}B^!SWIK=0xg0;}%w!NHI=gL*A4)GpDd~Ty)*Vk4JIwv8gmpT+F4ZycZ zJ|!()T)}p@YM|c?W1@=*aTQ5nW$}hTPyo)s9;&c+jgYc$h{M`~~?1eF+)-HygrIB*> zQ8+uqWTE?2b!c+y&0KL?r(pIuA+hnYZ3 zO%271i*J!uJO*E_wTe0lN7vDPQgmJzuBYT^H{$dLYkmk8hv^-urU2YcbU@}g8Yzh% zoVbp4S;n=F>;HNt^nw>Iwq2|v?Hq*oI_buv@XqyIot&``x;C(5Z3reca>?T2;bgMr z!wbkVdR1{Xsl~+&B;scxg50!`+bS!Ftt5zxKafhi6ZYR^ZAdI3QPvepNgE!5e`-E= zPVZ*EvXRW3$=PqA(|U>d<&+9cc$??US+qImKWm3oyk2-p)GCQ=*moz5g{#8_hmo=w z)GI8uJpe0h55o(0(N?B&bAn@tme)uRi61h3FFS*OeMD!)HqFPh1460$jR(2MnlSp> zvqwm63H1uc?xvLo*brRuDLcnQ@O`2xi^1zZW0`3waejr5!NuD@=j?HDUW^jO#ZO5k zF8&##{?{?_Cll#kSS}t*nwg&sKP7p0vom<{m)14yhBL_Id-x_&IPoiXhKu)-ARd5q zq>XjO58AjQaPcdW!ZKg^kzYv$6Xt7U&L`?L#5cd8fv|$uOj__L>>@cVFFw*vpMi@@ z$rwBYU-{13P844Gz2zRboapKhei^x zwN9|#!Pb0n7Rh0L08ZhTX1CE+eDEIlXYvjI57NTn z_b0Jqyc0fhvbEzN+(@?2c*XQn*cUDy?&rT&CR}h5QLFaB+p;Jk&Y%5S#4|Wh8fniVq&1ZEcz*wR3CqNZ*Ww}Aadv|7%Fp4T&rOKm7yM4-eSU$` z!wbRl63oTtTSx7NZ(fjK2GdbQ;l{xU@vb)lAHUFACIp9HWF52@uDIBmABM-f6ZmF- z9#Y_HQj3c(k!`s6j+^>#Wg>hDXE?+zF4%7vU#2>VB8BG?-8#k3$Y6?B{Em3=@Nj;m z{n7+}5reK5dM@J|*>SOmWaB<~NL~UR2qy{uAsKg4qL=&G;FSp`pW=1Hv=OYtRS zkuKVV`2I*5Bg=?w#D#Z4{o=ZANKQEYngkPL`2bu^cGFhEa6M7~Ax^)R1H{FlqY_Ms zp9#tRqzo6IA+R};KB56o#lLT$!Qx`| zjSM%Ai~cY8uapUKz-a0Wcfym2-tmZa#6f>9zDY9hC_H=&b;>`z_n+XYK?rjOC{jQWaO;LjB#>G8^;pXY& z6U=EuI}q#1Waf*nkh!>PVuCr76i_wd4WtkkpPoql&t&3hCVnD8T>NtqC4q~FO-?ZD za2MRh1%B!7|$IwEo19IjV92Gi!!sws9C9B+H*L4H?pp4Ce_;e*7@@Xn{DpWaBC{yLoc9R5BuDLq z1A+;rnPtR_$!=V{mh8jDCXzItojuCBkI{x6$Kg+883z$vOv7A~U>fhE|L;VWK0)!` zM=`>I<=l{XgmOVg1uIazVj8K%#l<9oi&dl*7oQ{TcmzKFB#jvtmlFru7hOxaf^hLn zKmX-0aVETo48z^f$xMlmt8(YlU3a1qh`ApC11 zXGy&}H_H#>v# zqf`wC7luC)-JCk1fA)LU_3D0~OM>XAT`dXbQKH`)6p!CU$ApWy3NF4!M&Qm5A?fCF z6;~1mRVJR>N^8g6aN%w`Al&yUjg?RxeiK1PeP-2-JI0xjrXXhq>%QW0!o}%r+`rjb z0Oo#ewF5WI`-aBFGU7EP7Z)d!5xBVPTW;&PcxyZRz{Pp()c+DD<}p#J;Nqn3=ml|c zD$)D^TuHjiI5Sv7(jMjwEA0B2GsDHkJ?t14-}!|dn{5~0AYIIl!heVc3=q?Pqo^ODQ-X84C~90RCE2*Rn7Hu}^!~{efs5C4 zQ~xDQNLt7;T)ffrGVAcpUcJm&iM`A=Tzr?b;&CSRG97p;9LkqHbmL+paZ*~Mew$wI zgeQ_9XD^;Ymf_HEuI<~4Pp0U%;o*EgLNhKdHp*_cCdegt(JvzIbeE zFO$Q3F--Dtv4~%=FT#EB8B&6a)g-Wp{$KLXLA^``FNlX8%m#4rND{$aa41o+i|a`q zk6hxb#EVDaizhSxPWpfG6h>X6|M0*cvl!=vtD_She`>Gz(8;3L&wrI%i(a^iH0rv9 z=P)2?6WynH7wN{uCB(^1B?Lbw@i(S$;OV{0FdC+KKJnmUJ}Jb-kI772?48ZFaK96| zlN?+J+Oo5L8B8+I^UY_gXtGg za%|HDD@pu*0s9Z`WwMy>gdf-*8|$!w*@jfyc7w3=wEq2=aq%7Ek1-+HMfTz1*CdGzb;2(TDXzsSahBcMi_hWsp(H%L zh`Ptcx``YVF1C|ATs&Y>FH?X!;pt>1+YyIN?q$kw=r>hNR5KyIMYiDL$#+m^cs3k5 zg?jS7}c8rU&?xR$AgbKiAGpS3usvpE35<5Zm2;oaOv z#7{`Zw3Ik|Kft=Uco=cxeiw4j9IGo0!yD&vcDzOM!u$tWh>dz-8OdU!;%1VAi?5PA z+*?XXkYPOEiG3epeOx@0OvYXCO`>i)3a2fk{?$K6%D5aJp@r+=5N;$cHX4BwgVq80 z;0Hv@dlu7`5`9c(me9gUA*CfoAE&-?anZ9}qIeMcLiRlZUb~!=(VLUy6mP#3RwMGk z?JK!~Xl2-3MGyEG4i8*QJK%tv@I+G0GUEB95f>x%T$Z@_T>}S)ix-FK&>rATDqQm% z`@+Mp>;<;zXQM$Rw2|)cQ5w`soB`2&UHpjzSwZ}RRN~^Wm)S8cz8_&7Tx?TtG3Qkd z0vC&jgN7`I?fIhrMgAMa3*u&ygGXS}R_=rxkT{!^;^GCbbFjGh7+Hsl557Uif{S0h z$qfb(fF0Ofp`qxC5i6h?SjM;&hMM`n8ILd}_v8I*Y z5Eu7;+{<+0;^UuinbBE^2khnqaIrwa#oNea+y^^|8gi!}Irvk0J+6DP?`ISp*R+^S zI&cr%|2aj6n-~W`)a%9IsxPTmPCy*f#zElX9V7?$!Hpz3oe!Vk4$_8;iCMnc;CUUEyJ3K6KyL93l6^lvJAl8EVYvAb5-lUnB2iqd zC2e>Z9{rQH$&Ot}A<-vc;xnX^4T+zVB#t@;T|ZkJ6>lZ^EF+eaB0L1YCVFfakM5)@ zanVgWaIt`>VTz0V{8vjAEP_vx2p)osL<@=gNhK?b343@Acfym1mJuhBBIb+tkePS@ zRuC;C?jkuexy8dTNFMI*M3VPf3yD{f0$vcWBa?A2yqDCqG{&^apnOG+lz}25y#VXAkcGQqKQ1i&fw|J#CQji4Z99XG!-1QNlP?4 z4ox)8coY_;C-Rd^?s)K$!#M$5Tu9t_5NT=BN!|e7u(1ZT--ydaq&n7 z)o#Sa0@8+i;gckt0~MbqS-7Ynf!(-RK=N_%Zc>N`{Kx@EQ%qy1CwLukE#=t_-g6A| zad9yjfrsEXM9YX>$MLNTxOniOL{p5rV3f2!MM=Qf$0wRj+?>Eckhv@)HW2?3CL|A> zm}qKoF_y^&aB=&oOylA)r?W#`Tt-sZsQ4Diz{QV<))l`YZsvEwBeN-KT)ZSF(M-mn z-wa`58517(EUCrC&aOW$;^v%0(@k_{=G;WHl*mKy%v|c5cH@Rukxbfw`09Cy zCKngaKA$SUV{qsNT9^LcgESJ|ks|Py!8rA5F60c!;0nI93m!r8aB)5vgNx6QVq9EL z=Hd}};Kh^#H!~+Zg}ADCp9v?EEL@!K=f7c01YnG)uNH4`vjXmgZ`f`wVFx7s#0+zX zB$^QGiYE@GHRIxCB!>IoW}-Wx*n1c|Z{YbKo=O6^KO6B~Mm^QD0?fOD>lOFFU02e= zr*c5>g^`ISoB0uV;x$|mcs5*hEmcLw5{5%YvE#9<3#VSk!7)DoYsk7fo|<6a0uBfl zodwi?2NQ@nljx%naTgg>!<`CxZ=i&5v6y&q@q6OKJK@nca-g_)@Mx+J7Y7k%Ee8t! z9V}XWa15oliHFrO{zUUA6ZuSp;9Fx8O&Z>FJnEifRcp-Z=*{$88(9X9^3sTKaSG|e zeQ@14Ixe;ofuE582P8ViCz>)`yoZGSOh_If+i>v-(t?NJ8semc#Em2a7r!PsxH!9z zz5y5ONFgqMM2d0o!U;4?T)dWOzUUvvf0a!5;C!O@Z(;>;QFP)il7oxpR@w+I7Lfwn z2cMrv-EZKG;lJaQiyNoVFdI2&_yIALkl5hk#5U6Z_ZUAsKCbvn(-V!Cg~T^V1s;Vz z6IVDT&L2y-gmAHo48zTgL^FrzG7iE9(#?s9r`*e>OoJ8ACNA6!XWvKt>!*^z`x4E( zS@hvt5euTeOG7%OMXOb3Ne3*3TfZ(@tIZ#~OF^_%%7h6aekHLBKnP#J6>H-c37f&LF zlE{X+4_PPUh9e%K{sSx&LCPMZr_;{hzr&`Bk3P;p(UQesPjC>p2d*dTpd#=S(z1#V z8DOxSc7Th;Ptss{FcDuNIk@;48HPi?By(w^@iHO0NC_@3Uq(^lJ;!6$IPGJereonC z!~ki;#o<*vVBkJjOX3Fyk6Uf^nAva`adXh(fEw0aP5&<$NTS*?e7M%?w}Wsc(T2p` zq?-~Fudbu@(&#+!aneQ07lZXIPiq&yC2m~2s)06ziySGTaSElV}BhcmPk^z(L{S1d{Y5qZPw-Bpr{yyBpa)4;tcPQihA`HgVbG ze#zIQi3u@xGd&tE4kw03E^!QT;$nojaPdo`pBISdZee}qi{r=$+y|$;#QM1S^2?kU zF24RU^y%sLWhWirATWRFt#F#jD<@q57GSJVRP=v6-~tQFzD)T$XG| zTtM=1@rf4d6&FYCq?g3Sn_DS4T%1KBxcC%_;vx78DdIpy|AZKq5fkDAWE&oY1HPm& z(lDLyB%)ih_&3Sr;KZb_IAh!izaqL)I^lzDR2e%HuWqNPaq$k4r8gn)d$Od0{$JAc z9gT>VEVhsc9)q*?aS0W3eZzI6Ae0j45x?>zgNrAS04`qq8ym&NCrA@64(y`c;9{_w zhP<4UgmvB2|1c)%n5ZZDco=?7nsD)szj*k>#b?PrTzr8zR;0w)FCodeaPh4~2Ccxw ziG7pI7+f5j%*f!l_$XP1Kk7#w=G)}9F(Dq8X1ySuLb{kQUP>H1xr(DmI_`y=`9iZS z&MX4Q9?w^2<6ih1Dda%K^`|kcIxhZ78gX-al37gr>JCFlS$0zV!7>O>J%b~i#H9rv zAn8x=z5wnbInVMO0KX@Bcqg2DCIe#Q;18 z&V;y(bl~Dkq#HNqCYc*^89^KO!dHnt4Hx^Jm&9+8Q|!=5((oAUB6^Y*&pDqHpgoC~ z5RHiGfsc~-=RYCjGomL~@z4vB%)WAd{tH`(LyZw0J=j`Cyn*D?H;6}Hm}H7@7d)Tn z{k^!6WYQ6dZxc5zwvv222LJH$pH}z--gOa;gv&#mL-KJkNQ!Xr3!=-+b8!;iAYyq4 z{zTl*@fIB}9+qT0xL8Aq@i2^%6kNP|IHSAceuFJ4(?{+sh6_@TpU71;2t#Fg=k4TVG5lipj^2Wsl zq!kas^Y3ICe+fH79-NY7cC&*Z{E&>HsKp=dVrRIRJe3u2Cp?Adt|O%hyr|EAki`4g2`@NdS}8*aQlu`JOO`QTe02eJ zkBdztf{P!KC?12e7IHv%03QD^?SKOncRrG2+Hmo(ApHaGf|m!W{{kj1XX2knDI#1v z>@jw%h2UfoqS(cWOK5bsIFCf}Alyw_cpenpPp~swe3^9P5xAY?&ZG?+)uXQ=E)?pav9w(mu?u&ewv-rkc03gQo($2(u{jXsng$Z#$EsYKr$JS9?xY(~a^i`kh=UXFc#Ha< z$pm8hZKrp`#e+!*_i0`;HzzhEPTpaijStol)o~c!_KsEeK3GS5EH6e$2`;|4?`J~t=$Eu`Tx=$lxVWFJ!_8NGaV^mqix0H1LoO%rIWh>3 zz>mJRmWjdpzu|zGAAlL{bi=qfig<9*KjS+Z0uwQK!}lEZR-S6$@E@3uiz7%0?t$Bh z4k8K%{m9k9eDRN;=x}hc-_JBs+zD?Xx>5PyDzb(7;^TX{g0|BCOP(hCcp(J;^NV%w z7q=3_eDO1qfs6l;99;a*K5j_37k=<7b$t zq6d@Zeq_{N6gw}7ACbv;4Bo`Zs@tf0FPuU2L@RD4?eu!$8>AcWIohg5W34`nQEWcs zmmA^FM=)k3-gDqojjX!;sNTk(*-BrHq#o1T48vXU-$6*lUytLPfj{EO2hKl%L6`8J zxI@b=Az!_W=4C`x;+PU>Nx_`e~k|1=MANs z;=F`WrddHu8p2RHxOgxr!^J^l87|&H!g!Bymg3_t{X3YG`0pT2;@)AD?l(MD!vh#< zrvMj^_VZs66Gy|-NC_^ECuMk#ae3n7_4LYPemi$Uco1pC#ba$3FC)#&?=eD7eAu0% zE@vnuN>0osV{pIZ8U|~c%!GIgS%QmGZ5N*+TA}B_P8tNNeq?VG<3PoCNXoZ78N+tl z#Y3;|ZCuRnIh>L`{E|OD{*uOF`utkXhK0m`NE8?3pWo&!B;WGM|6WjLUogGTin z97=;mMQ&lkEF<=xzz%TnC^8xEIl6Ao5qLEcuitljZ_~-OD?Ue(KIZ-n-yvzZ`0K>p zCJPt4i5C|&{;ZbiISy^l0dX}@?yWu!kY&Wxqy-nZk+zTN|0O@%#fEu7+)J`Q;ZlKp zro|WfZ-bR;(9rRAZ4IIg^86zBnMj3FG3mv#I}# z&$y0f|JTU4Jx9RR$ha>&$Z)?LkhqUj;$rGN+5s+}H=j!m7v03{=J_9L&}%KzbJ$po zSNreyw72*l>TULyQKYOOp8GJ30vGeiTwI*Fh}MgXb4U~y%OA0p3BkX}vS!*)u(!FA zG~p4r)Tw9Vk=3BvVFMuDGu~)Zd!26(;O%c{pMaKwlEQdUz6YtK6Zn? zXL_3uF1|)0xY(iK;@%Jkgo~?I&~D!0;R3dhVYv8O6(xy_qgHW4!o_){V+Z}eWd3UE zl^250vxeekqn+@XS{l_?DJBFvN%}VC!^Aq~Dad}Fd|I8a z$lP801QdSU+S`P1aW84a#jcN77Z?Bhn00Y6;}fb97tbY0Jbv{UKs7$t>L%tp{a;cn zNT1zQ0WLbpU|cLF`#2ym@i%Tr6t!61MW2t0{eGua<4!o1q_H#celiFbmyujtG=I=O zaM3^LPi_)Sh!2pNxVVUv;X$~SbnoOb9Ddr(0di*I?SHXRT>SiR8YeF9CB?Y;hl4kL zOcvG0SKpiCiQWrj!$%YO?);tf|2+p`)!?j;_UU5^xa7oVi4XVnW!?bBZRQg4!lM{| zqKJ*UV3cIwV()|F!_mfh6y8j~B5r3K=ol{kNV;+H*hBps1>I!!p?%CeqDO4;eUia^ z@e7iTcfzCjmUI0iMBIKD2c?a|C@IFpHd45qo)kWRIP-Dwj3d}SF3uxie4Za^&FI75 z|M90(aMF<+DK1VUowzug7GRT9Su{;ZCBz9~Bdh>0{iSfcOc? z$Hi}mzes0>oOEoT`1`tS=(Rm^97Ranl!|!fpgyL8b|BtLYH@Lr?V^uFm@nRWJtI=e z;i-&Kyo~nLW9(s#UCcK&@E?!QWaq%v)8yEd!`j`$}JbJ7(zsE?) z|7{dyjjsF=DPVc=shj(l$+%caW`05cA4U?#^)Y31t4=tZ=!`>f3yJ^m5gu?0RmD9* zJesuQ;@X0&Ru6pICS+)q#uC$QWE~B9n3PaQ|%_1rvwEvq=yaFC-z{4c{jj z+!tbSb`i_ZrPGp7mpzAxL0&}0 zO;XsI7fvA=%ol6PAY9x}a&a+pN+09F#j{BvF5X9q@c`UT+G%IvY#*hCi_3k~zmr>S zn2BTWVq+A$ncBx3In8Q}E;yr@mQ2-%`|n|J0UkiaVblAV!MIpVJa_;eHG`{y-qQsa zl58IDg0SLVMxXecYK7kWSXYmI_xU-?nKURSd~oai)DIqoLuOeA*B#d`L_Y$j`#QMiMOXiD@l~ZN7xPv%2<0zcOSf=_heGs-1*ADuB$t%m~ z#b^iOhs1-6KN7DV#bEjh4v3O)!SQ4neZCJqM=J3MoL@~t#e+~oTnA`3J%_sPISjTn zOt$Kk8%)muxqA-8-E+Wg4aEINn5(0WPr2aj&v6F0nEfKb#pl;^mbiFrBc+Oqi#Jlz zc#q+*`Ti$nY5?s3FZ3KpTLWs}yqN~Ye6f&h!^MfD1^2;`FLT4eL$Grz?S<}Eym1?? zeH$$teoIpDPMG~V?TpJ?e1-UPnUEa)21SjFTgXgYoZLjQxug{rFC*=^2QDD$+=6iAmu!cU@W82l{u@E3F%@nn`M5alD~cZX z!39JQCgR(qgzi(^Mau9P9Mwk0662i>bbL*?%ZXD+2JVAvzs2bR!|*$zKX~v<#PPB- z1QV_w`Mn;yWnV|mfUk#Xblg2 zSYlt3`8{vP;5B40E*29H9!lolG|L_dl|4{Ac-2c-t`yEc62h1m7cS zu`zhmvDV5ic$4j3c;ukIrj4ET9EiE+Ak7-Q`707;o8o@bgo|$+&q4h_{~tvXPq22- zbNJ|2pryfLK}l>~x9|7rTfT?>R2B#%nGoBRY781k=u98QcZ8lK4-=pgG&m zxU^dN?7n6#aj=m1Ey=(&2uVIsqZ6MZ`UWEnbJA+h7mq&In(u;cqTeSF$J<^A=i6Qi z-zF;EW;QV?%ok_aJ`=9Dy%D}k-1_^kC~_WyLurMkpjFE9&v@WZU)>iqOTdFW#Ca)Q60Do?jqWLD{Lp)rkLPojBHIL!Mm^S zYf4z51U^JGzZQN&vcF|#aEQm6pAQ>|sxJbkTtgMGZYf+zv~C1;6D=d=UTb*)e4T7# zd4DtVCvmaRpi%6YXoWKP4AF){@Oj%cuItOTN8qLT^Z{%r5Bi95~>!^PlUg5&w`f{Z6^wUvb__gk7vHV|50N(>SwNF zIEQHdT==x@A?Ur;DiyJw=%B;!ccSIH;jy<_J_ufE`v`b9acP^-{|f(UxNIw>uZu&z7qaS zT3EglPMvR^j7D-=LUhKBaN9#v8z&|n^)Ndb!wS`lxLrPCEtCztM5Q8j2m6}2tRNn| zghAw3J{{H&wftJR@bSK83-in1kxy9jTj8p5T0iSn!wD7Eb3+kqAUdG1ANkgva6Q@A zTtHl`;D(pj?t$0X9)-@OR=tYn+wO+9+U|oJY>&X$Q!LMc?t@n^vv%x(9;Y7+7wV zig@h`Ydd3BaQ$y(LLaeggMC+8XXb!MRMI9`IRoBCR2@aIxr$4R`E79KDr-aHH`O%K zeO%M9_Zn-P4p>LpSUwEDCb~M>;heP`^gjCkxyY;<>v9UfiM3X7O@>Kz)(*sHZ4bfE zNr;`r;7#>?O&RWm-DEB<4tS1dJlqMNBL(<6xQDdh``{=3=dB&@hNL-0oHJ%2)`Goq{U$wV0@yu?D4-difKDAn@8?Gnn{~O_`&#d~(hrf~CY^V#q z`MK3MG{KITRf^(;U(wO9j0gVkHCN7~^bPR9cAgO^#ZbGSn@WfEf)kGY*}D9^@UTwm zjD<4b*Cc>avz-x%T&UX_tRkUx$vmptoD=%BXU2N zQy20~7Y~hH91*E?X7S|sw3VF&xAJ|{aY=#6=Dhz|F-Dvxn$__Q8RdIO2Uq8hpU^x$yiU3}nu&c`$r+h~HXh z8xu2zT0Rr@9%gN*Ww^skyVPObE-zzj-^)2bR?dLWlXiBz4xV;}wQe@dztUlHm@jT8 zx<@p_Q6sEv_86?)^zvWDMy{qPC{oekVN`Wo>^;h1BDfRICc0r{Gd^_b^$yd_{2)A~ zz+qbOo`bh*VD}D%`C`tE4hDhY*#b_sU5pWb8ZSs@jb=es2*6=p>X`ZB{Bg|3OX1Y< z6gQsD2=ylyIgD2hN8iCg;a+&y6b_UdmX@@!P8HcIG z-EcZ-!~^gn62m*-^^8le23P=tr07rD4fHH`m^|DsIco)H$wUquM|7lxu!*EFzZ>SR zv<_$(OsI005c8AZI1*nTezA(qh52pp`qfs+6~H%aZ-O6JTPL#{{;`JoZ`BUgFnIY| zS~c#5e-PbLyWt@<){fKRnYQP^DYpCI3uFuHZh^lMXE%KVJgb(v$8+G9byg?V27j-& zJf(r_|LO*MJytG(5z>jbz~6|frVBd4mW#uQ&e#Kkwu?UyEpMK4n6rtz1?D|(m4rBp z=p+Mhi{|V3U(!Lef_TykmS;idI{NNz`T%&vi!`*qc$Wh=kvx10{F*Gm+u=RyIRTb0 zfj<*{K6>q$GygrWc1MysgvVdF+eygI~VHd$vm2!2U)aBXnHD;xwX7r`hA z;^JKq8W&y+Z+guUe>>)dzi#95W_}mEsfl)jd*SHq4m0R4`u{P=N}`)YB|PW1fl zY+Y{7%@fOo8ecEYtg9cDN4YvKG>>)=XZ z?ni!#mxh-6k;AMY`be}Ab`sr4#Ic{yK3KU3Chn#q`kR&yHxo6|E%0Na6W9%p`_$TT zHmo9pSUwCpNEV*)8P!CJHQ$fi65}A4D1;H>8bfCS`+Z?;Cj^Edpz=eI1`JIgcrVOU_ zO^(;4_&L!T$KWT)$$Sg@0J9tRAHYWO6nOFh$;N?a!G#0a0bT~z9+YeXcr6^AmK<-4 zW8nU@WPkkV%)!ZKDbbNu!XJqmQ77DRNOHV=G{RqrJ3waw#~*6V_rZ5aEjx(9gmi1& zBzT_fgW(;v`(Tyr)#?6Z28&2G?W{Z)x{pjYQCvLc=w!1F9|V6Vy8OD~<;O4{JMZ;J zz-Nw4Hc7n(m=IilTyp%b*a)9KfwSaCZXxK&Og0%TBQ~9s9KV%|lTPM@_55FnjLS+k z*(_8D`<`l@fdgJm^j&Zs*!y&Sd#o5WGl!-9hO@g@i)H%tf5*ME%jd%q9axQ0qn_NokJj+8c>jFxV z`QnckT5Y8h?sc=AK74?SE=e|BEE9w$4~e_qWFZwqA2Nucp~)sCks^hoh9$?l=X}_E zxaCebi0G;j&nKBIzYcz7&u@bVU1}|p28Y@{4DPj>{D+o7{ z`1b+8?f22p`p`b$A4K!b%w%&G(eiG%i410$EimbRt}I+UljxBvABO#$0Q22}WOI~% zHpR$P08hKInMV>SD#e9^)Wb#w<=YQy%A_ zaUaZlf~x=*ONmZEth8O6{3Pv&WyH^ku8w{1u%*<$R>)Y&rS+6`23fF)=v|AL^{jOU z;t?UM`^<)~lOzWR4O5oWhVVT22GNbG2_~+vPQVGDA=+06p0JYYzJ=d2TS;A1GvQ)o z@ja4*i*2@x3o5MxDucU83CoCct2k@C7EW5l4mju~@cq@4BJ*3|qH3#;3BulMtb=gD zlh<;^>HFWZkjonAP*@>PBzou&pL(9#DE;{|_zuyNQWPGr-df%X(>HKgvaYy}=+QPk=XvcG5)=Soric3k19V~+hFIy`o!8OF4 z%-O^HUa{uSglQ4W#Xei9CYEu)y<`x+55BOCgDv9ue;snv>s-6M;DQ^8-dt{hXE#}O zp9@`Y(Ezm!{E_GkI^n$SmY2e}o2d?#X@)I3s9Jo`J9KD7kM^zbv3EIP<}ZPVMX7(? z%QK?f6yE3Tc|n~0f%TL!7oO5$Et3To5;dYS*i5>#Gq`N0Rf=NmE^A%!l<(+d`q8<4 zpKKobfwRZOybjtKp65p<5f2kSxSVJQVVLtHXY)KA3tak>b=fR~H~-8IS>6ke>!jbu z2f@m{90V?I*vHkxo0dj6<5!lM$=?pZ^8NIfEK>ou6TfZ-&B*6}&>DFm1_%CW-6VY7 zv~<$Vd~w)c^a=e3#2Laf@U*`Q~cWBL+UL3EO>@Z=P>Mdy|!lKAI8l0E}ikdI89&`(_KEC55ciwOtxi$A0|;W(mY z+z0kEKcw}GfBMw{=N{ZI{tzn;Je2im$Z7B?qJv%rZ%FSKf5!B}ZGQgKnZ@8;NAxoh z&L#>E&**2`@DcDmqK>5njylrvd^n3ZQn;_fw~4NZ;L-ieW2BMg!*D%`;8D1X=-JS? z`WdH!`y~&bV7(BA5t7LZV&2Ktd@nrl6wBQ(YI_WpX0bCKVneX+sT4JzA-doLr}Z=K zcnBVOI@{C-Rq!6tHjepl*Xh*1CSuuC!5Q`oFk*Z5nf;81Xc;fuOkxu_IQSVU#5>`Y zXIb-o@NL^&=l3&1iPm*r(9et~avxl5d-wu>KeOAOhz;&%5-+qCO24R|$tL>kS8*iK z%3_RYpiy!D#Y}U16$iU57YoQf`W0~o(Yj(c(YoR>moVSY3z7z+7sS`~0`tXo+r__0 zJ{uK}8DhD3p6zksS~nlwWxKf0cCm_RJEH$3dqUhvw6bW1S}q=Ly9=H}TB%EM1WBTW zi!(_4Ea76?#dWreJ8T!fvD_aQGtAx@Je26@#MA8g*>EgTb%^)a^Tl%8#pi4nx7#j$ zWxF_fxK%Y`@$jpxoduYvCpv>LjM^^#Kz4I!b-|IBauwhnxQOV|4Z?TG?v9iVsZ$4@ zmgx8NGabg5P-S&xxU#V_QW>p`Rkl}lR(4gIDo2&8DzhrPD!0mAl~?7dDya%ol~zTn znyR8zomE{`W|d==b5;7PP<3^6xVo`AQr%SDS{HC;8P)=}%MO|Ny;X4Yoc=GMAv^J?2` zJ8QdYO&urYrDp|^)lI9Tt6NvcR=2P2T-~+WR6DAj)lK!S_3iat^^S)0LmM(1avSm* z3L1(UN*I>a_$Vz#@F~A@_P~ttqLP7A%S-PYSdh?O{`q|aufCN9On*L|VD!^9u{G^$ zy4IMrj*(sw=q;)Kfd>uETkTn0u-dyiu)1`0 zaCOD%(CX^d;nj_+|M%yYUTxg{jgzgWH@G-K#M8h0+&{ymQN`eczXK3P2%5E`nOS(=gu5>T6xDk1D)l6-!t&=i>!hQ z+C>$%3oB|DSEpTIPP@qdXG1CPQ!>zXrit}8UXH<4msyuxms=O83)Y3|!gZ0lXkDzX zv(D5z>#Y;^aI(JoKz(_kf8go8JNq-_Z240Ez?^dLy&To1Sp!G$n*e->6-X$*bH>0$ zIJxDjQ7j1zT#*~CjnU3bowLrx?%Z{rI&Yot|9Yn`9{J-t-J0pADxH<-m9EOn%IwPAN_S;mWkIF4vZ&HmSyCCWw;8TsFNaf;$#EJh4aqSES diff --git a/editor/imgui.ini b/editor/imgui.ini index 497cade..44b674e 100644 --- a/editor/imgui.ini +++ b/editor/imgui.ini @@ -1,20 +1,25 @@ [Window][Workspace] Pos=0,60 -Size=1344,716 -LastUsed=20261015 +Size=1536,708 +LastUsed=20261022 [Window][Debug##Default] Pos=60,60 Size=400,400 -LastUsed=20261015 +LastUsed=20261022 [Window][Toolbar] Pos=0,20 -Size=1344,38 -LastUsed=20261015 +Size=1536,38 +LastUsed=20261022 [Window][StatusBar] -Pos=0,776 -Size=1344,32 -LastUsed=20261015 +Pos=0,768 +Size=1536,32 +LastUsed=20261022 + +[Window][Не удалось запустить игру] +Pos=649,356 +Size=237,80 +LastUsed=20261022 diff --git a/editor/src/cutscene_format.h b/editor/src/cutscene_format.h new file mode 100644 index 0000000..70800e1 --- /dev/null +++ b/editor/src/cutscene_format.h @@ -0,0 +1,96 @@ +#pragma once +#include "level_format.h" +#include +#include +#include +#include + +struct CutsceneTrack { + std::vector events; + std::vector strings; // UTF-8 in the editor, CP1251 on disk/in ASM + uint16_t flags = 0; +}; + +inline bool CutsceneEncode(const std::string& text, std::string& encoded) { + if (text.empty()) { encoded.clear(); return true; } + int wideSize = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, text.data(), static_cast(text.size()), nullptr, 0); + if (!wideSize) return false; + std::wstring wide(wideSize, 0); + MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, text.data(), static_cast(text.size()), wide.data(), wideSize); + BOOL replaced = FALSE; + int size = WideCharToMultiByte(1251, WC_NO_BEST_FIT_CHARS, wide.data(), wideSize, nullptr, 0, nullptr, &replaced); + if (!size || replaced || size >= CUTSCENE_STRING_BYTES) return false; + encoded.resize(size); + WideCharToMultiByte(1251, WC_NO_BEST_FIT_CHARS, wide.data(), wideSize, encoded.data(), size, nullptr, &replaced); + if (replaced) return false; + for (unsigned char ch : encoded) if (ch == 0 || (ch < 32 && ch != '\n')) return false; + return true; +} + +inline std::string CutsceneDecode(const char* data, int size) { + if (!size) return {}; + int n = MultiByteToWideChar(1251, 0, data, size, nullptr, 0); + std::wstring wide(n, 0); MultiByteToWideChar(1251, 0, data, size, wide.data(), n); + n = WideCharToMultiByte(CP_UTF8, 0, wide.data(), static_cast(wide.size()), nullptr, 0, nullptr, nullptr); + std::string text(n, 0); + WideCharToMultiByte(CP_UTF8, 0, wide.data(), static_cast(wide.size()), text.data(), n, nullptr, nullptr); + return text; +} + +inline bool IsSoundFilename(const std::string& name) { + if (name.size() < 5 || name.size() > 63) return false; + for (unsigned char ch : name) + if (ch < 32 || ch >= 127 || std::strchr("\\/:*?\"<>|", ch)) return false; + auto ext = name.substr(name.size() - 4); + return ext[0] == '.' && (ext[1] | 32) == 'w' && (ext[2] | 32) == 'a' && (ext[3] | 32) == 'v'; +} + +inline bool ValidateCutscene(const CutsceneTrack& track, const uint8_t* cells, size_t transitionCount, std::string& error) { + auto fail = [&](const char* reason) { error = reason; return false; }; + if (track.events.size() > MAX_CUTSCENE_EVENTS || track.strings.size() > MAX_CUTSCENE_STRINGS || (track.flags & ~CUTSCENE_AUTOPLAY)) + return fail("Превышен лимит или неверные флаги кат-сцены"); + for (const auto& text : track.strings) { + std::string encoded; + if (!CutsceneEncode(text, encoded)) return fail("Текст: до 95 символов CP1251, без emoji и управляющих символов"); + } + auto stringValid = [&](int index) { return index >= 0 && index < static_cast(track.strings.size()); }; + uint16_t previous = 0; + for (size_t i = 0; i < track.events.size(); ++i) { + const auto& e = track.events[i]; + if (e.tickTimestamp < previous || e.opCode > OP_CHANGE_SUBLEVEL || (e.param8 & ~(e.opCode == OP_PLAY_SOUND ? 1 : 0))) + return fail("Неверный порядок или команда кат-сцены"); + previous = e.tickTimestamp; + if (e.opCode == OP_END && i + 1 != track.events.size()) return fail("Команда конца должна быть последней"); + switch (e.opCode) { + case OP_WAIT: + if (e.paramA < 0 || e.paramA > CUTSCENE_MAX_DURATION) return fail("Неверная длительность паузы"); + break; + case OP_MOVE_CAM_TO: + if (e.paramA < 0 || e.paramA >= 2048 || e.paramB < 0 || e.paramB >= 2048 || e.dataId < 0 || e.dataId > CUTSCENE_MAX_DURATION) + return fail("Неверная точка или длительность движения камеры"); + if (cells && cells[(e.paramB / 64)*32 + e.paramA / 64] != CELL_EMPTY && + cells[(e.paramB / 64)*32 + e.paramA / 64] != CELL_DOOR_OPEN && cells[(e.paramB / 64)*32 + e.paramA / 64] != CELL_PORTAL) + return fail("Точка камеры находится внутри стены"); + break; + case OP_PAN_CAM_TO: case OP_FADE_SCREEN: + if (e.paramA < 0 || e.paramA > (e.opCode == OP_PAN_CAM_TO ? 511 : 16) || e.paramB < 0 || e.paramB > CUTSCENE_MAX_DURATION) + return fail("Неверный поворот или затемнение камеры"); + break; + case OP_SHOW_SUBTITLE: + if (!stringValid(e.paramA) || e.paramB < 0 || e.paramB > CUTSCENE_MAX_DURATION) return fail("Неверный текст или длительность субтитра"); + break; + case OP_PLAY_SOUND: + if (e.paramA != -1 && (!stringValid(e.paramA) || !IsSoundFilename(track.strings[e.paramA]))) return fail("Звук: ASCII-имя WAV из assets/sounds"); + break; + case OP_CHANGE_SUBLEVEL: + if (e.paramA < 0 || e.paramA >= static_cast(transitionCount)) return fail("Выберите существующий переход для кат-сцены"); + break; + } + int span = e.opCode == OP_MOVE_CAM_TO ? e.dataId : + (e.opCode == OP_PAN_CAM_TO || e.opCode == OP_FADE_SCREEN || e.opCode == OP_SHOW_SUBTITLE ? e.paramB : + e.opCode == OP_WAIT ? e.paramA : 0); + if (static_cast(e.tickTimestamp) + span > 65535) return fail("Команда выходит за пределы 65535 кадров"); + } + if (!track.events.empty() && track.events.back().opCode != OP_END) return fail("Кат-сцена должна заканчиваться командой Конец"); + return true; +} diff --git a/editor/src/cutscene_preview.h b/editor/src/cutscene_preview.h new file mode 100644 index 0000000..9cf27ef --- /dev/null +++ b/editor/src/cutscene_preview.h @@ -0,0 +1,60 @@ +#pragma once +#include "cutscene_format.h" +#include +#include + +// Deterministic 60 Hz reference player for the editor preview and scrubber. +// The ASM player follows the same ordering: finish existing tweens, then dispatch. +struct CutscenePreview { + struct Tween { + int from = 0, to = 0, duration = 0, elapsed = 0; + int Advance(int value) { + if (!duration) return value; + ++elapsed; + value = from + (to-from)*elapsed/duration; + if (elapsed >= duration) { value = to; duration = 0; } + return value; + } + void Start(int current, int target, int ticks) { from = current; to = target; duration = ticks; elapsed = 0; } + } xTween, yTween, angleTween, fadeTween; + int x = 0, y = 0, angle = 0, fade = 0; + int tick = 0, nextEvent = 0, wait = 0, subtitle = -1, subtitleUntil = 0, transition = -1; + bool active = false; + void Start(int px, int py, int direction) { + *this = {}; + x = px; y = py; angle = direction; active = true; + } + void Stop() { + active = false; subtitle = -1; subtitleUntil = 0; fade = 0; + xTween = {}; yTween = {}; angleTween = {}; fadeTween = {}; + } + void Step(const CutsceneTrack& track, const std::function& sound = {}) { + if (!active) return; + x = xTween.Advance(x); y = yTween.Advance(y); + angle = angleTween.Advance(angle) & 511; + fade = fadeTween.Advance(fade); + if (subtitleUntil && tick >= subtitleUntil) { subtitle = -1; subtitleUntil = 0; } + if (wait > 0 && --wait > 0) { ++tick; return; } + while (nextEvent < static_cast(track.events.size()) && track.events[nextEvent].tickTimestamp <= tick) { + const auto e = track.events[nextEvent++]; + switch (e.opCode) { + case OP_END: Stop(); return; + case OP_WAIT: wait = e.paramA; if (wait) { ++tick; return; } break; + case OP_MOVE_CAM_TO: + xTween.Start(x, e.paramA, e.dataId); yTween.Start(y, e.paramB, e.dataId); + if (!e.dataId) { x = e.paramA; y = e.paramB; } break; + case OP_PAN_CAM_TO: { + int delta = ((e.paramA-angle+256)&511)-256; + angleTween.Start(angle, angle+delta, e.paramB); + if (!e.paramB) angle = e.paramA; break; + } + case OP_SHOW_SUBTITLE: subtitle = e.paramA; subtitleUntil = e.paramB ? tick+e.paramB : 0; break; + case OP_HIDE_SUBTITLE: subtitle = -1; subtitleUntil = 0; break; + case OP_PLAY_SOUND: if (sound) sound(e.paramA, (e.param8&1)!=0); break; + case OP_FADE_SCREEN: fadeTween.Start(fade, e.paramA, e.paramB); if (!e.paramB) fade = e.paramA; break; + case OP_CHANGE_SUBLEVEL: transition = e.paramA; Stop(); return; + } + } + ++tick; + } +}; diff --git a/editor/src/editor_app.cpp b/editor/src/editor_app.cpp index aab52b5..c0ed3e4 100644 --- a/editor/src/editor_app.cpp +++ b/editor/src/editor_app.cpp @@ -1,11 +1,67 @@ #include "editor_app.h" +#include "level_io.h" #include "../imgui/imgui.h" #include "../imgui/imgui_internal.h" +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" +#include +#include +#include #include #include #include #include #include +#include +#include +#include +#include + +namespace fs = std::filesystem; + +// Replace a file only after a complete successful write and close. +static bool AtomicWrite(const std::string& path, const std::function& writer) { + std::error_code ec; + auto parent = fs::path(path).parent_path(); + if (!parent.empty()) fs::create_directories(parent, ec); + if (ec) return false; + static unsigned serial = 0; + const std::string temporary = path + ".tmp." + std::to_string(GetCurrentProcessId()) + "." + std::to_string(++serial); + std::ofstream out(temporary, std::ios::binary | std::ios::trunc); + if (!out) return false; + writer(out); + out.close(); + if (!out || !MoveFileExA(temporary.c_str(), path.c_str(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH)) { + DeleteFileA(temporary.c_str()); return false; + } + return true; +} + +static std::vector MakeDefaultTextureSlot(int slotIndex); +static bool ReadTextureSlots(const std::string& path, std::vector& pixels) { + pixels.resize(16 * 65536); + for (int slot = 0; slot < 16; ++slot) { + auto fallback = MakeDefaultTextureSlot(slot); + std::copy(fallback.begin(), fallback.end(), pixels.begin() + slot * 65536); + } + std::error_code ec; + if (!fs::exists(path, ec)) return !ec; + std::ifstream in(path, std::ios::binary | std::ios::ate); + if (!in) return false; + auto size = in.tellg(); in.seekg(0); + uint32_t magic = 0; uint16_t version = 0, count = 0; + in.read(reinterpret_cast(&magic), 4); + in.read(reinterpret_cast(&version), 2); + in.read(reinterpret_cast(&count), 2); + if (!in || magic != 0x58544245 || version != 1 || count == 0 || count > 16 || + size != static_cast(8 + count * 65536)) return false; + auto candidate = pixels; + if (!in.read(reinterpret_cast(candidate.data()), count * 65536)) return false; + pixels.swap(candidate); + return true; +} // Texture slot names (engine: 0 = solid marker, 1..9 walls, 10..12 props, 13..15 reserved) static const char* g_TexSlotNames[16] = { @@ -16,11 +72,20 @@ static const char* g_TexSlotNames[16] = { }; EditorApp::EditorApp() { + char module[MAX_PATH]{}; + GetModuleFileNameA(nullptr, module, MAX_PATH); + const auto directory = fs::path(module).parent_path(); + std::error_code ec; + const auto projectAssets = directory.parent_path() / "assets/map.dat"; + currentFilePath = (fs::is_regular_file(projectAssets, ec) ? projectAssets : directory / "assets/map.dat").string(); InitDefaultLevel(); } EditorApp::~EditorApp() { + StopEnginePreview(); + StopCutscenePreview(); StopPlaytest(); + ShutdownD3D(); } void EditorApp::InitDefaultLevel() { @@ -70,159 +135,203 @@ void EditorApp::InitDefaultLevel() { sprites.push_back(demoSprite); selectedSpriteIdx = -1; + selectedTransitionIdx = -1; draggingSpriteIdx = -1; + transitions.clear(); + cutscene = {}; + selectedCutsceneEvent = -1; + StopCutscenePreview(); + cutsceneCursor = 0; + previewX = playerStartX*64+32; previewY = playerStartY*64+32; previewAngle = playerStartAngle; + previewSceneCamera = true; + ScrubCutscene(0); statusMessage = "Загружен стартовый уровень. Готов к редактированию."; } -bool EditorApp::SaveLevel(const std::string& filepath) { - std::ofstream out(filepath, std::ios::binary); - if (!out.is_open()) { - statusMessage = "Ошибка: не удалось открыть файл для записи: " + filepath; - return false; - } +bool EditorApp::SaveLevel(const std::string& filepath) { return SaveLevelToFile(filepath, true); } - MapHeader header{}; - header.magic = MAP_MAGIC; - header.version = MAP_FORMAT_VERSION; - header.mapWidth = MAP_GRID_W; - header.mapHeight = MAP_GRID_H; - header.playerStartX = static_cast(playerStartX); - header.playerStartY = static_cast(playerStartY); - header.playerStartAngle = static_cast(playerStartAngle); - header.spriteCount = static_cast(sprites.size()); - header.ceilingColor = ceilingColor; - header.floorColor = floorColor; - - out.write(reinterpret_cast(&header), sizeof(MapHeader)); - out.write(reinterpret_cast(map), MAP_TOTAL_CELLS); - - if (!sprites.empty()) { - out.write(reinterpret_cast(sprites.data()), sprites.size() * sizeof(SpriteEntry)); - } - - out.close(); - currentFilePath = filepath; - statusMessage = "Уровень успешно сохранен в " + filepath; +bool EditorApp::SaveLevelToFile(const std::string& filepath, bool updateCurrentPath) { + BinaryLevel level; + auto& h = level.header; + h.magic = MAP_MAGIC; h.version = MAP_FORMAT_VERSION; + h.mapWidth = MAP_GRID_W; h.mapHeight = MAP_GRID_H; + h.playerStartX = static_cast(playerStartX); + h.playerStartY = static_cast(playerStartY); + h.playerStartAngle = static_cast(playerStartAngle); + h.ceilingColor = ceilingColor; h.floorColor = floorColor; + level.sprites = sprites; level.transitions = transitions; level.cutscene = cutscene; + std::memcpy(level.cells.data(), map, sizeof(map)); + std::string error; + if (!ValidateLevel(level, error)) { statusMessage = "Ошибка сохранения: " + error; return false; } + h.spriteCount = static_cast(sprites.size()); + h.transitionCount = static_cast(transitions.size()); + h.cutsceneCount = static_cast(cutscene.events.size()); + h.cutsceneStringCount = static_cast(cutscene.strings.size()); + h.cutsceneFlags = cutscene.flags; + bool success = AtomicWrite(filepath, [&](std::ofstream& out) { + out.write(reinterpret_cast(&h), sizeof(h)); + out.write(reinterpret_cast(level.cells.data()), level.cells.size()); + if (!sprites.empty()) out.write(reinterpret_cast(sprites.data()), sprites.size() * sizeof(SpriteEntry)); + if (!transitions.empty()) out.write(reinterpret_cast(transitions.data()), transitions.size() * sizeof(LevelTransition)); + if (!cutscene.events.empty()) out.write(reinterpret_cast(cutscene.events.data()), cutscene.events.size() * sizeof(CutsceneEvent)); + for (const auto& text : cutscene.strings) { + std::string encoded; CutsceneEncode(text, encoded); + char bytes[CUTSCENE_STRING_BYTES]{}; + std::memcpy(bytes, encoded.data(), encoded.size()); + out.write(bytes, sizeof(bytes)); + } + }); + if (!success) { statusMessage = "Не удалось сохранить карту: " + filepath; return false; } + if (updateCurrentPath) currentFilePath = filepath; + statusMessage = "Уровень сохранён: " + filepath; return true; } bool EditorApp::LoadLevel(const std::string& filepath) { - std::ifstream in(filepath, std::ios::binary); - if (!in.is_open()) { - statusMessage = "Ошибка: файл не найден: " + filepath; - return false; - } - - MapHeader header{}; - in.read(reinterpret_cast(&header), sizeof(MapHeader)); - if (header.magic != MAP_MAGIC) { - statusMessage = "Ошибка: неверный формат файла уровня (нет сигнатуры EBLN)"; - return false; - } - if (header.version < 1 || header.version > MAP_FORMAT_VERSION) { - statusMessage = "Ошибка: неподдерживаемая версия формата " + std::to_string(header.version); - return false; - } - if (header.mapWidth != MAP_GRID_W || header.mapHeight != MAP_GRID_H) { - statusMessage = "Ошибка: размер карты не 32x32"; - return false; - } - - playerStartX = header.playerStartX; - playerStartY = header.playerStartY; - playerStartAngle = header.playerStartAngle; - if (header.ceilingColor != 0) ceilingColor = header.ceilingColor; - if (header.floorColor != 0) floorColor = header.floorColor; - - in.read(reinterpret_cast(map), MAP_TOTAL_CELLS); - - sprites.clear(); - int count = header.spriteCount; - if (count > MAX_LEVEL_SPRITES) count = MAX_LEVEL_SPRITES; - if (count > 0) { - sprites.resize(count); - in.read(reinterpret_cast(sprites.data()), count * sizeof(SpriteEntry)); - - // Legacy v1: sprite x/y were 16.16 fixed point -> convert to raw units - if (header.version == 1) { - for (auto& spr : sprites) { - spr.x >>= 16; - spr.y >>= 16; - } - } - } - - in.close(); + BinaryLevel candidate; + std::string error; + if (!ReadLevelFile(filepath, candidate, error)) { statusMessage = error; return false; } + StopCutscenePreview(); + const auto& h = candidate.header; + std::memcpy(map, candidate.cells.data(), sizeof(map)); + playerStartX = h.playerStartX; playerStartY = h.playerStartY; playerStartAngle = h.playerStartAngle; + ceilingColor = h.ceilingColor & 0xFFFFFF; floorColor = h.floorColor & 0xFFFFFF; + sprites = std::move(candidate.sprites); transitions = std::move(candidate.transitions); + cutscene = std::move(candidate.cutscene); + selectedCutsceneEvent = -1; cutsceneCursor = 0; placeCameraPoint = false; + ScrubCutscene(0); currentFilePath = filepath; - selectedSpriteIdx = -1; - draggingSpriteIdx = -1; - undoStack.clear(); - redoStack.clear(); - statusMessage = "Уровень успешно загружен из " + filepath; + previewTexturesDirty = true; + previewSceneCamera = true; + LoadAllTexturePreviews(); + selectedSpriteIdx = selectedTransitionIdx = draggingSpriteIdx = -1; + strokeSnapshotTaken = false; + undoStack.clear(); redoStack.clear(); + statusMessage = "Уровень загружен: " + filepath; return true; } +bool EditorApp::PreparePlaytest(std::string& startMap, std::string& enginePath) { + std::error_code ec; + enginePath = FindEnginePath(); + if (enginePath.empty()) { statusMessage = "Сначала соберите engine.exe (build.bat)."; return false; } + const fs::path source = fs::absolute(currentFilePath.empty() ? "../assets/map.dat" : currentFilePath, ec); + if (ec) { statusMessage = "Неверный путь текущей карты."; return false; } + fs::path sandbox; + for (unsigned attempt = 0; attempt < 32; ++attempt) { + sandbox = fs::temp_directory_path(ec) / ("EblanStudio-" + std::to_string(GetCurrentProcessId()) + "-" + + std::to_string(GetTickCount64()) + "-" + std::to_string(attempt)); + if (ec) break; + if (fs::create_directory(sandbox, ec)) break; + if (ec) break; + sandbox.clear(); + } + if (ec || sandbox.empty()) { statusMessage = "Не удалось создать папку плейтеста."; return false; } + playtestDirectory = sandbox.string(); + auto copyFailure = [&]() { statusMessage = "Не удалось скопировать ресурсы плейтеста: " + ec.message(); CleanupPlaytest(); return false; }; + fs::create_directories(sandbox / "assets", ec); + if (ec) return copyFailure(); + if (fs::is_directory(source.parent_path(), ec)) { + for (const auto& entry : fs::directory_iterator(source.parent_path(), ec)) { + if (ec) break; + if (entry.is_regular_file(ec) && _stricmp(entry.path().extension().string().c_str(), ".dat") == 0) + fs::copy_file(entry.path(), sandbox / "assets" / entry.path().filename(), fs::copy_options::overwrite_existing, ec); + if (ec) break; + } + } + if (ec) return copyFailure(); + if (!SaveLevelToFile((sandbox / "assets" / source.filename()).string(), false)) { CleanupPlaytest(); return false; } + const fs::path pack = fs::absolute(GetTexturePackPath(), ec); + if (ec) return copyFailure(); + if (fs::exists(pack, ec)) { + fs::create_directories(sandbox / "assets/textures", ec); + if (!ec) fs::copy_file(pack, sandbox / "assets/textures/texturepack.bin", fs::copy_options::overwrite_existing, ec); + } + if (ec) return copyFailure(); + const fs::path sounds = fs::absolute(GetSoundsDirectory(), ec); + if (ec) return copyFailure(); + if (fs::is_directory(sounds, ec)) fs::copy(sounds, sandbox / "assets/sounds", fs::copy_options::recursive, ec); + if (ec) return copyFailure(); + // Validate all reachable maps and destination spawns, including reverse links. + std::vector pending{source.filename().string()}; + std::set visited; + while (!pending.empty()) { + std::string name = pending.back(); pending.pop_back(); + std::string key = name; + for (char& ch : key) ch = static_cast(std::tolower(static_cast(ch))); + if (!visited.insert(key).second) continue; + BinaryLevel level; + std::string error; + if (!ReadLevelFile((sandbox / "assets" / name).string(), level, error)) { + statusMessage = "Плейтест: " + error; CleanupPlaytest(); return false; + } + for (const auto& event : level.cutscene.events) { + if (event.opCode == OP_PLAY_SOUND && event.paramA >= 0 && + !fs::is_regular_file(sandbox / "assets/sounds" / level.cutscene.strings[event.paramA], ec)) { + statusMessage = "Плейтест: не найден WAV " + level.cutscene.strings[event.paramA]; + CleanupPlaytest(); return false; + } + } + for (const auto& t : level.transitions) { + BinaryLevel destination; + if (!ReadLevelFile((sandbox / "assets" / t.targetMap).string(), destination, error) || + !IsWalkableCell(destination.cells[t.targetSpawnY * MAP_GRID_W + t.targetSpawnX])) { + statusMessage = "Плейтест: проверьте файл и спавн перехода " + std::string(t.targetMap); + CleanupPlaytest(); return false; + } + pending.emplace_back(t.targetMap); + } + } + startMap = "assets\\" + source.filename().string(); + return true; +} + +void EditorApp::CleanupPlaytest() { + if (playtestDirectory.empty()) return; + std::error_code ec; + const auto directory = fs::weakly_canonical(playtestDirectory, ec); + if (ec) return; + const auto temporaryRoot = fs::weakly_canonical(fs::temp_directory_path(ec), ec); + // Verify the absolute target is a dedicated immediate child of TEMP. + if (!ec && directory.parent_path() == temporaryRoot && directory.filename().string().rfind("EblanStudio-", 0) == 0) + fs::remove_all(directory, ec); + playtestDirectory.clear(); +} + void EditorApp::LaunchPlaytest() { - // Save to the engine's expected path (and keep current file in sync) - CreateDirectoryA("assets", NULL); - CreateDirectoryA("..\\assets", NULL); - SaveLevel("..\\assets\\map.dat"); - if (currentFilePath != "..\\assets\\map.dat") { - SaveLevel(currentFilePath); // restore user's file path - } - - // Terminate existing instance if already running + StopCutscenePreview(); StopPlaytest(); - - // Launch engine.exe - STARTUPINFOA si{}; - si.cb = sizeof(si); - - char cmdLine[] = "..\\engine.exe"; - BOOL success = CreateProcessA( - NULL, - cmdLine, - NULL, - NULL, - FALSE, - 0, - NULL, - "..\\", // Working directory is EBLAN_ENGINE root - &si, - &engineProcInfo - ); - - if (success) { - hEngineProcess = engineProcInfo.hProcess; - isEngineRunning = true; - statusMessage = "▶ Игра запущена (engine.exe). Нажмите 'Стоп' для завершения."; - } else { - statusMessage = "Ошибка запуска ..\\engine.exe! Убедитесь, что движок собран (build.bat)."; + std::string startMap, enginePath; + if (!PreparePlaytest(startMap, enginePath)) { showPlaytestError = true; return; } + std::string command = "\"" + enginePath + "\" \"" + startMap + "\""; + STARTUPINFOA si{}; si.cb = sizeof(si); + if (!CreateProcessA(enginePath.c_str(), command.data(), nullptr, nullptr, FALSE, 0, nullptr, + playtestDirectory.c_str(), &si, &engineProcInfo)) { + statusMessage = "Ошибка запуска engine.exe: " + std::to_string(GetLastError()); showPlaytestError = true; CleanupPlaytest(); return; } + hEngineProcess = engineProcInfo.hProcess; + isEngineRunning = true; + statusMessage = "Игра запущена из временной копии. Исходные карты сохранены."; } void EditorApp::StopPlaytest() { - if (hEngineProcess != NULL) { + if (hEngineProcess) { TerminateProcess(hEngineProcess, 0); - CloseHandle(hEngineProcess); - CloseHandle(engineProcInfo.hThread); - hEngineProcess = NULL; - isEngineRunning = false; - statusMessage = "■ Игра остановлена. Возврат в редактор."; + WaitForSingleObject(hEngineProcess, 2000); + CloseHandle(hEngineProcess); CloseHandle(engineProcInfo.hThread); + hEngineProcess = nullptr; engineProcInfo = {}; } + isEngineRunning = false; + CleanupPlaytest(); } void EditorApp::CheckPlaytestProcess() { - if (isEngineRunning && hEngineProcess != NULL) { - DWORD exitCode = 0; - if (GetExitCodeProcess(hEngineProcess, &exitCode) && exitCode != STILL_ACTIVE) { - CloseHandle(hEngineProcess); - CloseHandle(engineProcInfo.hThread); - hEngineProcess = NULL; - isEngineRunning = false; - statusMessage = "Игра завершена (код выхода: " + std::to_string(exitCode) + ")."; - } - } + if (!hEngineProcess || WaitForSingleObject(hEngineProcess, 0) != WAIT_OBJECT_0) return; + DWORD code = 0; GetExitCodeProcess(hEngineProcess, &code); + CloseHandle(hEngineProcess); CloseHandle(engineProcInfo.hThread); + hEngineProcess = nullptr; engineProcInfo = {}; isEngineRunning = false; + CleanupPlaytest(); + statusMessage = "Игра завершена (код: " + std::to_string(code) + ")."; } // ----------------------------------------------------------------------------- @@ -237,6 +346,8 @@ LevelSnapshot EditorApp::CaptureSnapshot() const { s.ceilingColor = ceilingColor; s.floorColor = floorColor; s.sprites = sprites; + s.transitions = transitions; + s.cutscene = cutscene; return s; } @@ -248,7 +359,13 @@ void EditorApp::RestoreSnapshot(const LevelSnapshot& s) { ceilingColor = s.ceilingColor; floorColor = s.floorColor; sprites = s.sprites; + StopCutscenePreview(); + transitions = s.transitions; + cutscene = s.cutscene; + selectedCutsceneEvent = -1; placeCameraPoint = false; + ScrubCutscene(cutsceneCursor); selectedSpriteIdx = -1; + selectedTransitionIdx = -1; draggingSpriteIdx = -1; } @@ -306,60 +423,884 @@ std::string EditorApp::BrowseSaveFile() { return ""; } +// ----------------------------------------------------------------------------- +// Asset Manager (Textures, Sprites & Audio Import) +// ----------------------------------------------------------------------------- +void EditorApp::InitD3D(ID3D11Device* pDevice) { + pd3dDevice = pDevice; + LoadAllTexturePreviews(); +} + +void EditorApp::ShutdownD3D() { + StopEnginePreview(); + if (previewSRV) { previewSRV->Release(); previewSRV = nullptr; } + if (previewTexture) { previewTexture->Release(); previewTexture = nullptr; } + if (previewSampler) { previewSampler->Release(); previewSampler = nullptr; } + for (int i = 0; i < 16; ++i) { + if (textureSRVs[i]) { + textureSRVs[i]->Release(); + textureSRVs[i] = nullptr; + } + } + pd3dDevice = nullptr; +} + +std::string EditorApp::GetTexturePackPath() const { + const auto local = fs::path(currentFilePath).parent_path() / "textures/texturepack.bin"; + std::error_code ec; + if (fs::is_regular_file(local, ec)) return local.string(); + const char* candidates[] = { + "..\\assets\\textures\\texturepack.bin", + "assets\\textures\\texturepack.bin", + "..\\..\\assets\\textures\\texturepack.bin" + }; + for (const char* path : candidates) { + DWORD attr = GetFileAttributesA(path); + if (attr != INVALID_FILE_ATTRIBUTES) return path; + } + return local.string(); +} + +std::string EditorApp::GetSoundsDirectory() const { + auto directory = fs::path(currentFilePath).parent_path() / "sounds"; + std::error_code ec; + fs::create_directories(directory, ec); + return directory.string() + "\\"; +} + +std::string EditorApp::BrowseOpenImageFile() { + char szFile[MAX_PATH] = { 0 }; + OPENFILENAMEA ofn{}; + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = GetActiveWindow(); + ofn.lpstrFile = szFile; + ofn.nMaxFile = MAX_PATH; + ofn.lpstrFilter = "Изображения (*.png;*.jpg;*.jpeg;*.bmp)\0*.png;*.jpg;*.jpeg;*.bmp\0Все файлы (*.*)\0*.*\0"; + ofn.nFilterIndex = 1; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; + if (GetOpenFileNameA(&ofn)) return szFile; + return ""; +} + +std::string EditorApp::BrowseOpenAudioFile() { + char szFile[MAX_PATH] = { 0 }; + OPENFILENAMEA ofn{}; + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = GetActiveWindow(); + ofn.lpstrFile = szFile; + ofn.nMaxFile = MAX_PATH; + ofn.lpstrFilter = "Звуковые файлы WAV (*.wav)\0*.wav\0Все файлы (*.*)\0*.*\0"; + ofn.nFilterIndex = 1; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; + if (GetOpenFileNameA(&ofn)) return szFile; + return ""; +} + +std::string EditorApp::BrowseSavePngFile(int slotIndex) { + char szFile[MAX_PATH] = { 0 }; + snprintf(szFile, MAX_PATH, "texture_slot_%d.png", slotIndex); + OPENFILENAMEA ofn{}; + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = GetActiveWindow(); + ofn.lpstrFile = szFile; + ofn.nMaxFile = MAX_PATH; + ofn.lpstrFilter = "PNG Изображение (*.png)\0*.png\0Все файлы (*.*)\0*.*\0"; + ofn.nFilterIndex = 1; + ofn.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR; + ofn.lpstrDefExt = "png"; + if (GetSaveFileNameA(&ofn)) return szFile; + return ""; +} + +static bool ResampleTo128BGRA(const unsigned char* srcRGBA, int srcW, int srcH, bool isSprite, std::vector& outBGRA) { + outBGRA.assign(128 * 128 * 4, 0); + if (!srcRGBA || srcW <= 0 || srcH <= 0) return false; + + if (!isSprite) { + // Стены: умный кроп по центру с сохранением квадратной геометрии (без растяжения) + float srcAspect = static_cast(srcW) / static_cast(srcH); + float cropX0 = 0.0f, cropY0 = 0.0f, cropW = static_cast(srcW), cropH = static_cast(srcH); + if (srcAspect > 1.0f) { + cropW = static_cast(srcH); + cropX0 = (srcW - cropW) * 0.5f; + } else if (srcAspect < 1.0f) { + cropH = static_cast(srcW); + cropY0 = (srcH - cropH) * 0.5f; + } + + for (int dy = 0; dy < 128; ++dy) { + float srcY = cropY0 + (dy + 0.5f) * (cropH / 128.0f) - 0.5f; + int y0 = static_cast(std::floor(srcY)); + int y1 = y0 + 1; + float fy = srcY - y0; + if (y0 < 0) { y0 = 0; fy = 0.0f; } + if (y1 >= srcH) { y1 = srcH - 1; } + + for (int dx = 0; dx < 128; ++dx) { + float srcX = cropX0 + (dx + 0.5f) * (cropW / 128.0f) - 0.5f; + int x0 = static_cast(std::floor(srcX)); + int x1 = x0 + 1; + float fx = srcX - x0; + if (x0 < 0) { x0 = 0; fx = 0.0f; } + if (x1 >= srcW) { x1 = srcW - 1; } + + const unsigned char* p00 = &srcRGBA[(y0 * srcW + x0) * 4]; + const unsigned char* p10 = &srcRGBA[(y0 * srcW + x1) * 4]; + const unsigned char* p01 = &srcRGBA[(y1 * srcW + x0) * 4]; + const unsigned char* p11 = &srcRGBA[(y1 * srcW + x1) * 4]; + + float w00 = (1.0f - fx) * (1.0f - fy); + float w10 = fx * (1.0f - fy); + float w01 = (1.0f - fx) * fy; + float w11 = fx * fy; + + uint8_t r = static_cast(std::clamp(p00[0]*w00 + p10[0]*w10 + p01[0]*w01 + p11[0]*w11 + 0.5f, 0.0f, 255.0f)); + uint8_t g = static_cast(std::clamp(p00[1]*w00 + p10[1]*w10 + p01[1]*w01 + p11[1]*w11 + 0.5f, 0.0f, 255.0f)); + uint8_t b = static_cast(std::clamp(p00[2]*w00 + p10[2]*w10 + p01[2]*w01 + p11[2]*w11 + 0.5f, 0.0f, 255.0f)); + + int dstIdx = (dy * 128 + dx) * 4; + outBGRA[dstIdx + 0] = b; + outBGRA[dstIdx + 1] = g; + outBGRA[dstIdx + 2] = r; + outBGRA[dstIdx + 3] = 0x00; + } + } + } else { + // Спрайты: пропорциональное вписывание с привязкой к полу (нижней грани) и прозрачным фоном + for (int i = 0; i < 128 * 128; ++i) { + outBGRA[i * 4 + 0] = 0xFF; // B + outBGRA[i * 4 + 1] = 0x00; // G + outBGRA[i * 4 + 2] = 0xFF; // R (COLOR_CHROMA_KEY 0x00FF00FF) + outBGRA[i * 4 + 3] = 0x00; + } + + float scale = (std::min)(128.0f / srcW, 128.0f / srcH); + float targetW = srcW * scale; + float targetH = srcH * scale; + float offsetX = (128.0f - targetW) * 0.5f; + float offsetY = (128.0f - targetH); // привязка к полу + + int dstX0 = static_cast(offsetX); + int dstX1 = static_cast(offsetX + targetW); + int dstY0 = static_cast(offsetY); + int dstY1 = static_cast(offsetY + targetH); + + for (int dy = dstY0; dy < dstY1 && dy < 128; ++dy) { + if (dy < 0) continue; + float srcY = (dy - offsetY + 0.5f) / scale - 0.5f; + int y0 = static_cast(std::floor(srcY)); + int y1 = y0 + 1; + float fy = srcY - y0; + if (y0 < 0) { y0 = 0; fy = 0.0f; } + if (y1 >= srcH) { y1 = srcH - 1; } + + for (int dx = dstX0; dx < dstX1 && dx < 128; ++dx) { + if (dx < 0) continue; + float srcX = (dx - offsetX + 0.5f) / scale - 0.5f; + int x0 = static_cast(std::floor(srcX)); + int x1 = x0 + 1; + float fx = srcX - x0; + if (x0 < 0) { x0 = 0; fx = 0.0f; } + if (x1 >= srcW) { x1 = srcW - 1; } + + const unsigned char* p00 = &srcRGBA[(y0 * srcW + x0) * 4]; + const unsigned char* p10 = &srcRGBA[(y0 * srcW + x1) * 4]; + const unsigned char* p01 = &srcRGBA[(y1 * srcW + x0) * 4]; + const unsigned char* p11 = &srcRGBA[(y1 * srcW + x1) * 4]; + + float w00 = (1.0f - fx) * (1.0f - fy); + float w10 = fx * (1.0f - fy); + float w01 = (1.0f - fx) * fy; + float w11 = fx * fy; + + float aF = p00[3]*w00 + p10[3]*w10 + p01[3]*w01 + p11[3]*w11; + float rF = p00[0]*w00 + p10[0]*w10 + p01[0]*w01 + p11[0]*w11; + float gF = p00[1]*w00 + p10[1]*w10 + p01[1]*w01 + p11[1]*w11; + float bF = p00[2]*w00 + p10[2]*w10 + p01[2]*w01 + p11[2]*w11; + + // Прозрачность по альфа-каналу ИЛИ по классическому цвету Chroma Key RGB(255, 0, 255) + if (aF < 128.0f || (rF >= 240.0f && gF <= 25.0f && bF >= 240.0f)) continue; + + int dstIdx = (dy * 128 + dx) * 4; + outBGRA[dstIdx + 0] = static_cast(std::clamp(bF + 0.5f, 0.0f, 255.0f)); + outBGRA[dstIdx + 1] = static_cast(std::clamp(gF + 0.5f, 0.0f, 255.0f)); + outBGRA[dstIdx + 2] = static_cast(std::clamp(rF + 0.5f, 0.0f, 255.0f)); + outBGRA[dstIdx + 3] = 0x00; + } + } + } + return true; +} + +bool EditorApp::ImportTextureImage(int slotIndex, bool isSprite, const std::string& explicitPath) { + if (slotIndex < 1 || slotIndex >= 16) return false; + + std::string filePath = explicitPath.empty() ? BrowseOpenImageFile() : explicitPath; + if (filePath.empty()) return false; + + int srcW = 0, srcH = 0, channels = 0; + unsigned char* data = stbi_load(filePath.c_str(), &srcW, &srcH, &channels, 4); + if (!data) { + statusMessage = "Ошибка загрузки картинки: " + filePath; + return false; + } + + std::vector slotData; + if (!ResampleTo128BGRA(data, srcW, srcH, isSprite, slotData)) { + stbi_image_free(data); + statusMessage = "Ошибка конвертации текстуры!"; + return false; + } + stbi_image_free(data); + + if (!WriteTextureSlot(slotIndex, slotData)) return false; + + statusMessage = "Текстура [" + std::string(g_TexSlotNames[slotIndex]) + "] обновлена из: " + filePath; + return true; +} + +bool EditorApp::ExportTextureImage(int slotIndex) { + if (slotIndex < 0 || slotIndex >= 16) return false; + std::string savePath = BrowseSavePngFile(slotIndex); + if (savePath.empty()) return false; + + std::vector allSlots; + if (!ReadTextureSlots(GetTexturePackPath(), allSlots)) { + statusMessage = "Не удалось прочитать пакет текстур для экспорта."; + return false; + } + std::vector bgra(allSlots.begin() + slotIndex * 65536, allSlots.begin() + (slotIndex + 1) * 65536); + + // Convert BGRA to RGBA (with Chroma Key -> Alpha 0) + std::vector rgba(128 * 128 * 4); + for (int i = 0; i < 128 * 128; ++i) { + uint8_t b = bgra[i * 4 + 0]; + uint8_t g = bgra[i * 4 + 1]; + uint8_t r = bgra[i * 4 + 2]; + if (b == 0xFF && g == 0x00 && r == 0xFF) { + rgba[i * 4 + 0] = 0; + rgba[i * 4 + 1] = 0; + rgba[i * 4 + 2] = 0; + rgba[i * 4 + 3] = 0; + } else { + rgba[i * 4 + 0] = r; + rgba[i * 4 + 1] = g; + rgba[i * 4 + 2] = b; + rgba[i * 4 + 3] = 255; + } + } + + if (stbi_write_png(savePath.c_str(), 128, 128, 4, rgba.data(), 128 * 4)) { + statusMessage = "Текстура [" + std::string(g_TexSlotNames[slotIndex]) + "] экспортирована в: " + savePath; + return true; + } + statusMessage = "Ошибка записи PNG файла: " + savePath; + return false; +} + +std::vector EditorApp::GetSoundList() const { + std::vector sounds; + std::string pattern = GetSoundsDirectory() + "*.wav"; + WIN32_FIND_DATAA fd{}; + HANDLE hFind = FindFirstFileA(pattern.c_str(), &fd); + if (hFind != INVALID_HANDLE_VALUE) { + do { + if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + sounds.push_back(fd.cFileName); + } + } while (FindNextFileA(hFind, &fd)); + FindClose(hFind); + } + std::sort(sounds.begin(), sounds.end()); + return sounds; +} + +void EditorApp::UpdateSoundManifest() { + auto sounds = GetSoundList(); + std::string sDir = GetSoundsDirectory(); + + // 1. Write sounds.inc for MASM32 (clean forward-slash relative paths) + std::string incPath = sDir + "sounds.inc"; + std::ofstream inc(incPath); + if (inc.is_open()) { + inc << "; ==============================================================================\n"; + inc << "; EBLAN ENGINE - Auto-Generated Sound Manifest (winmm.lib PlaySound / MCI)\n"; + inc << "; ==============================================================================\n\n"; + for (const auto& s : sounds) { + std::string base = s; + size_t dot = base.find_last_of('.'); + if (dot != std::string::npos) base = base.substr(0, dot); + for (char& c : base) { + if (c == ' ' || c == '-') c = '_'; + c = static_cast(std::toupper(c)); + } + inc << "SND_" << base << " db \"assets/sounds/" << s << "\", 0\n"; + } + inc.close(); + } + + // 2. Write sounds.txt for editor / MCI + std::string txtPath = sDir + "sounds.txt"; + std::ofstream txt(txtPath); + if (txt.is_open()) { + txt << "# EblanStudio Sound Registry & MCI Aliases\n"; + for (const auto& s : sounds) { + std::string base = s; + size_t dot = base.find_last_of('.'); + if (dot != std::string::npos) base = base.substr(0, dot); + for (char& c : base) { + if (c == ' ' || c == '-') c = '_'; + c = static_cast(std::tolower(c)); + } + txt << "alias snd_" << base << " -> assets/sounds/" << s << "\n"; + } + txt.close(); + } +} + +void EditorApp::PlayAudioSound(const std::string& filename) { + std::string path = GetSoundsDirectory() + filename; + PlaySoundA(path.c_str(), NULL, SND_FILENAME | SND_ASYNC); + statusMessage = "Воспроизведение звука: " + filename; +} + +void EditorApp::StopAudioSound() { + PlaySoundA(NULL, NULL, 0); + statusMessage = "Воспроизведение звука остановлено."; +} + +bool EditorApp::ImportSoundAudio(const std::string& explicitPath) { + std::string filePath = explicitPath.empty() ? BrowseOpenAudioFile() : explicitPath; + if (filePath.empty()) return false; + + std::string soundDir = GetSoundsDirectory(); + size_t lastSlash = filePath.find_last_of("\\/"); + std::string filename = (lastSlash == std::string::npos) ? filePath : filePath.substr(lastSlash + 1); + + std::string destPath = soundDir + filename; + if (!CopyFileA(filePath.c_str(), destPath.c_str(), FALSE)) { + statusMessage = "Ошибка копирования звука: " + destPath; + return false; + } + + UpdateSoundManifest(); + PlayAudioSound(filename); + statusMessage = "Аудио импортировано и обновлен манифест MCI: " + destPath; + return true; +} + +static std::vector MakeDefaultTextureSlot(int slotIndex) { + std::vector slotData(128 * 128 * 4, 0); + + auto setPx = [&](int x, int y, int r, int g, int b) { + int idx = (y * 128 + x) * 4; + slotData[idx + 0] = static_cast(b & 0xFF); + slotData[idx + 1] = static_cast(g & 0xFF); + slotData[idx + 2] = static_cast(r & 0xFF); + slotData[idx + 3] = 0; + }; + + switch (slotIndex) { + case 0: // Empty / Black + break; + case 1: // Red brick + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0x85, g = 0x22, b = 0x15; + bool mortar = ((y & 15) == 0 || (y & 15) == 1); + int vx = x + ((y & 16) ? 16 : 0); + if ((vx & 31) == 0 || (vx & 31) == 1) mortar = true; + if (mortar) { + r = g = b = 0x55; + } else { + int n = (((x ^ y) & 7) << 2); + b = (std::min)(255, b + n); + } + setPx(x, y, r, g, b); + } + } + break; + case 2: // Wood + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0x68, g = 0x3A, b = 0x12; + if ((x & 31) == 0) { + r = 0x20; g = 0x10; b = 0x05; + } else { + int n = ((y & 3) << 3); + b = (std::min)(255, b + n); + } + setPx(x, y, r, g, b); + } + } + break; + case 3: // Stone + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0x55, g = 0x55, b = 0x55; + if ((x & 31) == 0 || (y & 31) == 0) { + r = g = b = 0x22; + } else { + int n = ((((x * 3) + y) & 15) << 2); + b = (std::min)(255, b + n); + } + setPx(x, y, r, g, b); + } + } + break; + case 4: // Metal + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0x60, g = 0x65, b = 0x70; + if ((x - 10)*(x - 10) + (y - 10)*(y - 10) <= 16 || + (x - 118)*(x - 118) + (y - 118)*(y - 118) <= 16) { + r = 0xA0; g = 0xB0; b = 0xC0; + } + setPx(x, y, r, g, b); + } + } + break; + case 5: // Door + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r, g, b; + if (x < 8 || x >= 120 || y < 8) { + r = g = b = 0x33; + } else { + r = 0x50; g = 0x2D; b = 0x15; + if ((x - 100)*(x - 100) + (y - 64)*(y - 64) <= 36) { + r = 0xFF; g = 0xD0; b = 0x00; + } + } + setPx(x, y, r, g, b); + } + } + break; + case 7: // Pillar + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r, g, b; + if ((x & 15) < 8) { r = 0x70; g = 0xB0; b = 0xC0; } + else { r = 0x40; g = 0x80; b = 0x90; } + setPx(x, y, r, g, b); + } + } + break; + case 8: // Glass + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0x40, g = 0x30, b = 0x20; + if (x < 6 || x >= 122 || y < 6 || y >= 122) { + r = g = b = 0x60; + } else { + int d = (x + y) & 63; + if (d < 4 || (d >= 24 && d < 28)) { + r = 0x90; g = 0x70; b = 0x50; + } + } + setPx(x, y, r, g, b); + } + } + break; + case 9: // Marble + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0xD8, g = 0xD0, b = 0xC0; + int v = (x * 7 + y * 13); + v = (v + (v >> 3)) & 63; + if (v <= 2 || v == 40) { + r = g = b = 0x55; + } else { + int n = (x ^ y) & 3; + b = (std::min)(255, b + n); + } + setPx(x, y, r, g, b); + } + } + break; + case 10: // Lamp (Sprite) + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0xFF, g = 0x00, b = 0xFF; // Chroma key + if (x >= 60 && x < 68 && y >= 40 && y < 120) { r = g = b = 0x40; } + if (x >= 48 && x < 80 && y >= 16 && y < 44) { r = 0xFF; g = 0xC0; b = 0x30; } + if (x >= 52 && x < 76 && y >= 120 && y < 126) { r = g = b = 0x30; } + setPx(x, y, r, g, b); + } + } + break; + case 11: // Barrel (Sprite) + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0xFF, g = 0x00, b = 0xFF; // Chroma key + int dx = x - 64, dy = y - 70; + if (dx * dx * 2704 + dy * dy * 1156 <= 3125824) { + r = 0x6A; g = 0x40; b = 0x1E; + if (std::abs(dy) >= 29 && std::abs(dy) <= 35) { + r = g = b = 0x55; + } + if (x <= 52 && std::abs(dy) < 26) { + r = 0x8A; g = 0x5A; b = 0x2E; + } + } + setPx(x, y, r, g, b); + } + } + break; + case 12: // Statue / Prop (Sprite) + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + int r = 0xFF, g = 0x00, b = 0xFF; + if (x >= 44 && x < 84 && y >= 112 && y < 126) { r = g = b = 0x60; } + if (x >= 54 && x < 74 && y >= 40 && y < 112) { r = g = b = 0x8A + ((x ^ y) & 7); } + int dx = x - 64, dy = y - 28; + if (dx * dx + dy * dy <= 100) { r = g = b = 0x9A; } + setPx(x, y, r, g, b); + } + } + break; + default: + for (int y = 0; y < 128; ++y) { + for (int x = 0; x < 128; ++x) { + if (slotIndex >= 10) setPx(x, y, 0xFF, 0x00, 0xFF); + else setPx(x, y, 0x00, 0x00, 0x00); + } + } + break; + } + + return slotData; +} + +bool EditorApp::WriteTextureSlot(int slotIndex, const std::vector& pixels) { + if (slotIndex < 1 || slotIndex >= 16 || pixels.size() != 65536) return false; + const std::string path = GetTexturePackPath(); + std::vector slots; + if (!ReadTextureSlots(path, slots)) { + statusMessage = "Повреждён texturepack.bin. Восстановите пакет перед импортом."; + return false; + } + std::copy(pixels.begin(), pixels.end(), slots.begin() + slotIndex * 65536); + if (!AtomicWrite(path, [&](std::ofstream& out) { + uint32_t magic = 0x58544245; uint16_t version = 1, count = 16; + out.write(reinterpret_cast(&magic), 4); + out.write(reinterpret_cast(&version), 2); + out.write(reinterpret_cast(&count), 2); + out.write(reinterpret_cast(slots.data()), slots.size()); + })) { + statusMessage = "Не удалось записать пакет текстур: " + path; + return false; + } + ReloadTextureSlotSRV(slotIndex); + return true; +} + +bool EditorApp::ResetTextureSlotToDefault(int slotIndex) { + if (slotIndex < 1 || slotIndex >= 16) return false; + if (!WriteTextureSlot(slotIndex, MakeDefaultTextureSlot(slotIndex))) return false; + statusMessage = "Восстановлена стандартная текстура слота " + std::to_string(slotIndex); + return true; +} + +void EditorApp::HandleDropFile(const std::string& droppedPath) { + std::string lower = droppedPath; + for (char& c : lower) c = static_cast(std::tolower(c)); + + if (lower.length() >= 4 && lower.rfind(".wav") == lower.length() - 4) { + ImportSoundAudio(droppedPath); + showAssetManagerModal = true; + } else if (lower.length() >= 4 && ( + lower.rfind(".png") == lower.length() - 4 || + lower.rfind(".jpg") == lower.length() - 4 || + lower.rfind(".bmp") == lower.length() - 4 || + (lower.length() >= 5 && lower.rfind(".jpeg") == lower.length() - 5))) { + if (selectedSpriteIdx >= 0 && selectedSpriteIdx < static_cast(sprites.size())) { + int slot = sprites[selectedSpriteIdx].textureId & 15; + if (slot >= 10 && slot <= 15) { + ImportTextureImage(slot, true, droppedPath); + return; + } + } + if (selectedPaletteCell >= 1 && selectedPaletteCell <= 9 && selectedPaletteCell != 6) { + ImportTextureImage(selectedPaletteCell, false, droppedPath); + return; + } + showAssetManagerModal = true; + statusMessage = "Изображение получено. Выберите целевой слот для импорта: " + droppedPath; + } else if (lower.length() >= 4 && lower.rfind(".dat") == lower.length() - 4) { + LoadLevel(droppedPath); + } +} + +void EditorApp::ReloadTextureSlotSRV(int slotIndex) { + previewTexturesDirty = true; + if (!pd3dDevice || slotIndex < 0 || slotIndex >= 16) return; + + if (textureSRVs[slotIndex]) { + textureSRVs[slotIndex]->Release(); + textureSRVs[slotIndex] = nullptr; + } + + std::vector allSlots; + ReadTextureSlots(GetTexturePackPath(), allSlots); // fallback previews also work without a pack + std::vector bgra(allSlots.begin() + slotIndex * 65536, allSlots.begin() + (slotIndex + 1) * 65536); + + std::vector displayRGBA(128 * 128 * 4); + for (int i = 0; i < 128 * 128; ++i) { + uint8_t b = bgra[i * 4 + 0]; + uint8_t g = bgra[i * 4 + 1]; + uint8_t r = bgra[i * 4 + 2]; + if (b == 0xFF && g == 0x00 && r == 0xFF) { + displayRGBA[i * 4 + 0] = 0; + displayRGBA[i * 4 + 1] = 0; + displayRGBA[i * 4 + 2] = 0; + displayRGBA[i * 4 + 3] = 0; // transparent + } else { + displayRGBA[i * 4 + 0] = r; + displayRGBA[i * 4 + 1] = g; + displayRGBA[i * 4 + 2] = b; + displayRGBA[i * 4 + 3] = 255; // opaque + } + } + + D3D11_TEXTURE2D_DESC desc{}; + desc.Width = 128; + desc.Height = 128; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + D3D11_SUBRESOURCE_DATA sub{}; + sub.pSysMem = displayRGBA.data(); + sub.SysMemPitch = 128 * 4; + + ID3D11Texture2D* pTex = nullptr; + if (SUCCEEDED(pd3dDevice->CreateTexture2D(&desc, &sub, &pTex))) { + pd3dDevice->CreateShaderResourceView(pTex, nullptr, &textureSRVs[slotIndex]); + pTex->Release(); + } +} + +void EditorApp::LoadAllTexturePreviews() { + for (int i = 0; i < 16; ++i) { + ReloadTextureSlotSRV(i); + } +} + +void EditorApp::RenderAssetManagerModal() { + if (!showAssetManagerModal) return; + + ImGui::SetNextWindowSize(ImVec2(820, 580), ImGuiCond_FirstUseEver); + if (ImGui::Begin("Менеджер ассетов (Texture & Audio Manager)", &showAssetManagerModal)) { + if (ImGui::BeginTabBar("AssetManagerTabs")) { + if (ImGui::BeginTabItem("Текстурный пакет (16 слотов)")) { + ImGui::Text("Файл пакета: %s", GetTexturePackPath().c_str()); + ImGui::SameLine(); + if (ImGui::Button("Перезагрузить все")) { + LoadAllTexturePreviews(); + statusMessage = "Все слоты перезагружены из texturepack.bin"; + } + + ImGui::Separator(); + + // 4x4 Grid of texture slots + if (ImGui::BeginTable("TextureSlotGrid", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + for (int slot = 0; slot < 16; ++slot) { + if (slot % 4 == 0) ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(slot % 4); + + ImGui::PushID(slot); + ImGui::BeginGroup(); + + ImGui::TextColored(ImVec4(1.0f, 0.85f, 0.2f, 1.0f), "Слот %d", slot); + ImGui::Text("%s", g_TexSlotNames[slot]); + + if (textureSRVs[slot]) { + ImGui::Image(reinterpret_cast(textureSRVs[slot]), ImVec2(64, 64)); + } else { + ImGui::Button("(нет превью)", ImVec2(64, 64)); + } + + if (slot > 0) { + bool isSpr = (slot >= 10); + if (ImGui::Button("Заменить")) { + ImportTextureImage(slot, isSpr); + } + ImGui::SameLine(); + if (ImGui::Button("Экспорт")) { + ExportTextureImage(slot); + } + ImGui::SameLine(); + if (ImGui::Button("Сброс")) { + ResetTextureSlotToDefault(slot); + } + } else { + ImGui::TextDisabled("Служебный"); + } + + ImGui::EndGroup(); + ImGui::PopID(); + } + ImGui::EndTable(); + } + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Аудио и звуки (WAV / MCI)")) { + ImGui::Text("Папка звуков: %s", GetSoundsDirectory().c_str()); + ImGui::SameLine(); + if (ImGui::Button("+ Импортировать WAV...")) { + ImportSoundAudio(); + } + ImGui::SameLine(); + if (ImGui::Button("■ Стоп аудио")) { + StopAudioSound(); + } + + ImGui::Separator(); + + auto soundList = GetSoundList(); + if (soundList.empty()) { + ImGui::TextDisabled("В папке assets/sounds пока нет аудиофайлов WAV."); + ImGui::Text("Нажмите '+ Импортировать WAV...', чтобы добавить звуки."); + } else { + if (ImGui::BeginTable("SoundsTable", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + ImGui::TableSetupColumn("Файл", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("MCI Алиас", ImGuiTableColumnFlags_WidthFixed, 140.0f); + ImGui::TableSetupColumn("Воспроизведение", ImGuiTableColumnFlags_WidthFixed, 140.0f); + ImGui::TableSetupColumn("Управление", ImGuiTableColumnFlags_WidthFixed, 80.0f); + ImGui::TableHeadersRow(); + + for (size_t i = 0; i < soundList.size(); ++i) { + const auto& snd = soundList[i]; + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("%s", snd.c_str()); + + ImGui::TableSetColumnIndex(1); + std::string baseName = snd; + size_t dot = baseName.find_last_of('.'); + if (dot != std::string::npos) baseName = baseName.substr(0, dot); + std::string alias = "snd_" + baseName; + ImGui::TextColored(ImVec4(0.4f, 0.8f, 1.0f, 1.0f), "%s", alias.c_str()); + + ImGui::TableSetColumnIndex(2); + ImGui::PushID(static_cast(i)); + if (ImGui::Button("▶ Старт")) { + PlayAudioSound(snd); + } + ImGui::SameLine(); + if (ImGui::Button("■ Стоп")) { + StopAudioSound(); + } + + ImGui::TableSetColumnIndex(3); + if (ImGui::Button("Удалить")) { + std::string full = GetSoundsDirectory() + snd; + DeleteFileA(full.c_str()); + UpdateSoundManifest(); + statusMessage = "Звук удален: " + snd; + } + ImGui::PopID(); + } + ImGui::EndTable(); + } + } + + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + } + ImGui::End(); +} + // ----------------------------------------------------------------------------- // Tools // ----------------------------------------------------------------------------- +bool EditorApp::SetCell(int gx, int gy, uint8_t value) { + if (gx < 0 || gx >= MAP_GRID_W || gy < 0 || gy >= MAP_GRID_H || value > 15) return false; + auto found = std::find_if(transitions.begin(), transitions.end(), [&](const LevelTransition& t) { + return t.triggerCellX == gx && t.triggerCellY == gy; + }); + if (value == CELL_PORTAL) { + if (found == transitions.end()) { + if (transitions.size() >= MAX_LEVEL_TRANSITIONS) { + statusMessage = "Лимит: не более 16 переходов на карту."; + return false; + } + LevelTransition transition{}; + transition.triggerCellX = static_cast(gx); + transition.triggerCellY = static_cast(gy); + strcpy_s(transition.targetMap, "sublevel_02.dat"); + transition.targetSpawnX = transition.targetSpawnY = 2; + transition.fadeEffect = 1; + transitions.push_back(transition); + selectedTransitionIdx = static_cast(transitions.size()) - 1; + } else selectedTransitionIdx = static_cast(found - transitions.begin()); + selectedSpriteIdx = -1; + } else if (found != transitions.end()) { + RemoveCutsceneTransition(static_cast(found - transitions.begin())); + transitions.erase(found); + selectedTransitionIdx = -1; + } + map[gy][gx] = value; + return true; +} + void EditorApp::ApplyTool(int gx, int gy) { if (gx < 0 || gx >= MAP_GRID_W || gy < 0 || gy >= MAP_GRID_H) return; - switch (currentTool) { - case TOOL_BRUSH: - map[gy][gx] = selectedPaletteCell; - break; - case TOOL_ERASER: - map[gy][gx] = CELL_EMPTY; - break; - case TOOL_FILL: - FloodFill(gx, gy, map[gy][gx], selectedPaletteCell); - break; + case TOOL_BRUSH: SetCell(gx, gy, selectedPaletteCell); break; + case TOOL_ERASER: SetCell(gx, gy, CELL_EMPTY); break; + case TOOL_FILL: FloodFill(gx, gy, map[gy][gx], selectedPaletteCell); break; case TOOL_PLAYER_SPAWN: - playerStartX = gx; - playerStartY = gy; - map[gy][gx] = CELL_EMPTY; // Ensure spawn is not inside a wall + if (SetCell(gx, gy, CELL_EMPTY)) { playerStartX = gx; playerStartY = gy; } break; case TOOL_SPRITE_SPAWN: if (sprites.size() < MAX_LEVEL_SPRITES) { - SpriteEntry spr{}; - spr.x = gx * 64 + 32; // raw world units - spr.y = gy * 64 + 32; - spr.textureId = 11; // barrel - spr.scale = 65536; - sprites.push_back(spr); + SpriteEntry sprite{}; + sprite.x = gx * 64 + 32; sprite.y = gy * 64 + 32; + sprite.textureId = 11; sprite.scale = 65536; + sprites.push_back(sprite); selectedSpriteIdx = static_cast(sprites.size()) - 1; + selectedTransitionIdx = -1; } break; } } void EditorApp::FloodFill(int startX, int startY, uint8_t targetType, uint8_t fillType) { - if (targetType == fillType) return; - std::queue> q; - q.push({startX, startY}); - - while (!q.empty()) { - auto [cx, cy] = q.front(); - q.pop(); - - if (cx < 0 || cx >= MAP_GRID_W || cy < 0 || cy >= MAP_GRID_H) continue; - if (map[cy][cx] != targetType) continue; - - map[cy][cx] = fillType; - - q.push({cx + 1, cy}); - q.push({cx - 1, cy}); - q.push({cx, cy + 1}); - q.push({cx, cy - 1}); + if (targetType == fillType || startX < 0 || startX >= MAP_GRID_W || startY < 0 || startY >= MAP_GRID_H) return; + std::array affected{}; + std::vector> cells; + std::queue> pending; + pending.push({startX, startY}); + while (!pending.empty()) { + auto [x, y] = pending.front(); pending.pop(); + if (x < 0 || x >= MAP_GRID_W || y < 0 || y >= MAP_GRID_H) continue; + int index = y * MAP_GRID_W + x; + if (affected[index] || map[y][x] != targetType) continue; + affected[index] = true; + cells.push_back({x, y}); + pending.push({x - 1, y}); pending.push({x + 1, y}); + pending.push({x, y - 1}); pending.push({x, y + 1}); } + // Preflight the entire operation; a limit failure must not half-fill a room. + if (fillType == CELL_PORTAL) { + size_t retained = 0; + for (const auto& t : transitions) if (!affected[t.triggerCellY * MAP_GRID_W + t.triggerCellX]) ++retained; + if (retained + cells.size() > MAX_LEVEL_TRANSITIONS) { + statusMessage = "Заливка отменена: на карте может быть не более 16 переходов."; + return; + } + } + for (const auto& [x, y] : cells) SetCell(x, y, fillType); } // ----------------------------------------------------------------------------- @@ -367,12 +1308,13 @@ void EditorApp::FloodFill(int startX, int startY, uint8_t targetType, uint8_t fi // ----------------------------------------------------------------------------- void EditorApp::HandleHotkeys() { ImGuiIO& io = ImGui::GetIO(); - if (io.WantCaptureKeyboard) return; // typing in an input field - + // Function keys remain available while ImGui owns navigation/text focus. + if (ImGui::IsKeyPressed(ImGuiKey_F6, false)) showCutsceneTimeline = !showCutsceneTimeline; if (ImGui::IsKeyPressed(ImGuiKey_F5, false)) { if (!isEngineRunning) LaunchPlaytest(); else StopPlaytest(); } + if (io.WantTextInput || ImGui::IsPopupOpen(nullptr, ImGuiPopupFlags_AnyPopupId)) return; if (io.KeyCtrl) { if (ImGui::IsKeyPressed(ImGuiKey_N, false)) { PushUndo(); InitDefaultLevel(); } @@ -393,6 +1335,10 @@ void EditorApp::HandleHotkeys() { return; // no single-letter tool hotkeys while Ctrl held } + if (ImGui::IsKeyPressed(ImGuiKey_F4, false)) { + showAssetManagerModal = !showAssetManagerModal; + } + if (ImGui::IsKeyPressed(ImGuiKey_B, false)) currentTool = TOOL_BRUSH; if (ImGui::IsKeyPressed(ImGuiKey_E, false)) currentTool = TOOL_ERASER; if (ImGui::IsKeyPressed(ImGuiKey_F, false)) currentTool = TOOL_FILL; @@ -404,11 +1350,21 @@ void EditorApp::HandleHotkeys() { // UI Rendering // ----------------------------------------------------------------------------- void EditorApp::RenderUI() { + AdvanceCutscenePreview(ImGui::GetIO().DeltaTime); CheckPlaytestProcess(); HandleHotkeys(); RenderMenuBar(); RenderToolbar(); + RenderAssetManagerModal(); + if (showPlaytestError) { ImGui::OpenPopup("Не удалось запустить игру"); showPlaytestError = false; } + if (ImGui::BeginPopupModal("Не удалось запустить игру", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::PushTextWrapPos(ImGui::GetCursorPosX()+520); + ImGui::TextUnformatted(statusMessage.c_str()); + ImGui::PopTextWrapPos(); + if (ImGui::Button("Понятно")) ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } // Main layout ImGuiViewport* vp = ImGui::GetMainViewport(); @@ -433,8 +1389,30 @@ void EditorApp::RenderUI() { ImGui::SameLine(); // Center Panel (Grid Canvas) - ImGui::BeginChild("CanvasPanel", ImVec2(canvasWidth, 0), true); - RenderGridCanvas(); + ImGui::BeginChild("CenterPanel", ImVec2(canvasWidth, 0), false); + float timelineHeight = showCutsceneTimeline ? (std::min)(340.0f, ImGui::GetContentRegionAvail().y * 0.48f) : 0.0f; + ImGui::BeginChild("CanvasPanel", ImVec2(0, showCutsceneTimeline ? -timelineHeight - 6 : 0), true); + if (ImGui::RadioButton("Рядом", viewportMode == 0)) viewportMode = 0; + ImGui::SameLine(); if (ImGui::RadioButton("Игровой вид", viewportMode == 1)) viewportMode = 1; + ImGui::SameLine(); if (ImGui::RadioButton("Карта", viewportMode == 2)) viewportMode = 2; + float sceneWidth = viewportMode == 0 ? ImGui::GetContentRegionAvail().x * 0.5f : 0; + if (viewportMode != 2) { + ImGui::BeginChild("SceneViewport", ImVec2(sceneWidth,0), true); + RenderSceneViewport(); + ImGui::EndChild(); + if (viewportMode == 0) ImGui::SameLine(); + } + if (viewportMode != 1) { + ImGui::BeginChild("MapViewport", ImVec2(0,0), false); + RenderGridCanvas(); + ImGui::EndChild(); + } + ImGui::EndChild(); + if (showCutsceneTimeline) { + ImGui::BeginChild("CutsceneTimeline", ImVec2(0, 0), true); + RenderCutsceneTimeline(); + ImGui::EndChild(); + } ImGui::EndChild(); ImGui::SameLine(); @@ -498,6 +1476,48 @@ void EditorApp::RenderMenuBar() { ImGui::EndMenu(); } + if (ImGui::BeginMenu("Ассеты")) { + if (ImGui::MenuItem("Менеджер ассетов...", "F4", showAssetManagerModal)) { + showAssetManagerModal = !showAssetManagerModal; + } + ImGui::Separator(); + + if (ImGui::BeginMenu("Импорт текстуры стены...")) { + for (int slot = 1; slot <= 9; ++slot) { + if (slot == 6) continue; // slot 6 is open door / empty + char label[64]; + snprintf(label, sizeof(label), "%s (Слот %d)", g_TexSlotNames[slot], slot); + if (ImGui::MenuItem(label)) { + ImportTextureImage(slot, false); + } + } + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Импорт спрайта...")) { + for (int slot = 10; slot <= 15; ++slot) { + char label[64]; + snprintf(label, sizeof(label), "%s (Слот %d)", g_TexSlotNames[slot], slot); + if (ImGui::MenuItem(label)) { + ImportTextureImage(slot, true); + } + } + ImGui::EndMenu(); + } + + ImGui::Separator(); + if (ImGui::MenuItem("Импорт аудио (WAV)...")) { + ImportSoundAudio(); + } + + ImGui::Separator(); + if (ImGui::MenuItem("Перезагрузить текстуры")) { + LoadAllTexturePreviews(); + statusMessage = "Все текстурные слоты перезагружены из texturepack.bin"; + } + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Движок")) { if (ImGui::MenuItem("Запустить (Playtest)", "F5", isEngineRunning)) { if (!isEngineRunning) LaunchPlaytest(); @@ -566,6 +1586,17 @@ void EditorApp::RenderToolbar() { ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); ImGui::SameLine(); + if (ImGui::Button("Кат-сцена (F6)")) showCutsceneTimeline = !showCutsceneTimeline; + ImGui::SameLine(); + + // Asset Manager button + if (ImGui::Button(" 🖼 Ассеты (F4) ")) { + showAssetManagerModal = !showAssetManagerModal; + } + ImGui::SameLine(); + ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); + ImGui::SameLine(); + if (ImGui::Button(" Сохранить (Ctrl+S) ")) { SaveLevel(currentFilePath); } @@ -618,6 +1649,7 @@ void EditorApp::RenderGridCanvas() { case CELL_PILLAR: return IM_COL32(65, 150, 160, 255); // Turquoise case CELL_GLASS: return IM_COL32(70, 130, 160, 255); // Glass blue case CELL_MARBLE: return IM_COL32(200, 195, 185, 255); // Cream marble + case CELL_PORTAL: return IM_COL32(160, 50, 225, 255); // Neon purple portal default: return IM_COL32(50, 50, 50, 255); } }; @@ -637,6 +1669,13 @@ void EditorApp::RenderGridCanvas() { ImU32 col = GetCellColor(map[y][x]); drawList->AddRectFilled(tileP0, tileP1, col); drawList->AddRect(tileP0, tileP1, IM_COL32(50, 50, 55, 120), 0.0f, 0, 1.0f); + + if (map[y][x] == CELL_PORTAL) { + float cx = tileP0.x + tileSize * 0.5f; + float cy = tileP0.y + tileSize * 0.5f; + drawList->AddCircle(ImVec2(cx, cy), tileSize * 0.35f, IM_COL32(255, 255, 255, 230), 0, 1.5f); + drawList->AddCircleFilled(ImVec2(cx, cy), tileSize * 0.15f, IM_COL32(255, 220, 100, 255)); + } } } @@ -703,8 +1742,10 @@ void EditorApp::RenderGridCanvas() { drawList->AddCircleFilled(dirTip, 3.5f, IM_COL32(255, 40, 40, 255)); } + DrawCutscenePath(drawList, gridOrigin.x, gridOrigin.y, tileSize); + // 4. Mouse Input Handling on Canvas - if (ImGui::IsWindowHovered()) { + if (ImGui::IsWindowHovered() && !cutscenePreviewPlaying) { int hoverGx = static_cast(std::floor((mousePos.x - gridOrigin.x) / tileSize)); int hoverGy = static_cast(std::floor((mousePos.y - gridOrigin.y) / tileSize)); bool inGrid = (hoverGx >= 0 && hoverGx < MAP_GRID_W && hoverGy >= 0 && hoverGy < MAP_GRID_H); @@ -716,14 +1757,39 @@ void EditorApp::RenderGridCanvas() { drawList->AddRect(hP0, hP1, IM_COL32(255, 255, 255, 200), 0.0f, 0, 2.0f); } + if (placeCameraPoint && inGrid && ImGui::IsMouseClicked(ImGuiMouseButton_Left) && + selectedCutsceneEvent >= 0 && selectedCutsceneEvent < static_cast(cutscene.events.size())) { + if (!IsWalkableCell(map[hoverGy][hoverGx])) { + statusMessage = "Выберите точку камеры вне стены."; + drawList->PopClipRect(); return; + } + PushUndo(); + auto& event = cutscene.events[selectedCutsceneEvent]; + event.paramA = hoverGx * 64 + 32; event.paramB = hoverGy * 64 + 32; + placeCameraPoint = false; + NormalizeCutscene(); ScrubCutscene(cutsceneCursor); + drawList->PopClipRect(); return; + } + if (placeCameraPoint) { drawList->PopClipRect(); return; } // Left Click: start action (drag sprite OR paint) if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { if (currentTool == TOOL_SPRITE_SPAWN && hoveredSprite >= 0) { // Start dragging existing sprite draggingSpriteIdx = hoveredSprite; selectedSpriteIdx = hoveredSprite; + selectedTransitionIdx = -1; PushUndo(); } else if (inGrid) { + // If clicking an existing portal tile, select it for inspection! + if (map[hoverGy][hoverGx] == CELL_PORTAL) { + for (size_t i = 0; i < transitions.size(); ++i) { + if (transitions[i].triggerCellX == hoverGx && transitions[i].triggerCellY == hoverGy) { + selectedTransitionIdx = static_cast(i); + selectedSpriteIdx = -1; + break; + } + } + } PushUndo(); // snapshot before paint stroke strokeSnapshotTaken = true; ApplyTool(hoverGx, hoverGy); @@ -748,13 +1814,14 @@ void EditorApp::RenderGridCanvas() { strokeSnapshotTaken = false; } - // Right Click: quick erase (one undo snapshot per stroke) + // Right-click erase follows the same portal lifecycle as every other tool. if (inGrid && ImGui::IsMouseClicked(ImGuiMouseButton_Right)) { PushUndo(); - map[hoverGy][hoverGx] = CELL_EMPTY; + SetCell(hoverGx, hoverGy, CELL_EMPTY); } else if (inGrid && ImGui::IsMouseDown(ImGuiMouseButton_Right)) { - map[hoverGy][hoverGx] = CELL_EMPTY; + SetCell(hoverGx, hoverGy, CELL_EMPTY); } + } else { // Mouse left canvas: end drag / stroke if (ImGui::IsMouseReleased(ImGuiMouseButton_Left)) { @@ -770,31 +1837,64 @@ void EditorApp::RenderTilePalette() { ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.2f, 1.0f), "ПАЛИТРА ТАЙЛОВ"); ImGui::Separator(); - auto PaletteButton = [&](const char* name, CellType type, ImVec4 col) { + auto PaletteButton = [&](const char* name, CellType type, ImVec4 col, int slot) { bool selected = (selectedPaletteCell == type && currentTool == TOOL_BRUSH); ImGui::PushStyleColor(ImGuiCol_Button, col); if (selected) { - ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 0.85f, 0.2f, 1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 2.0f); } - if (ImGui::Button(name, ImVec2(-1, 32))) { + ImGui::PushID(slot); + if (type != CELL_PORTAL && slot > 0 && slot < 16 && textureSRVs[slot]) { + ImGui::Image(reinterpret_cast(textureSRVs[slot]), ImVec2(24, 24)); + ImGui::SameLine(); + } + if (ImGui::Button(name, ImVec2(-1, 28))) { selectedPaletteCell = type; currentTool = TOOL_BRUSH; } - if (selected) ImGui::PopStyleColor(); + if (type != CELL_PORTAL && slot > 0 && slot < 16) { + if (ImGui::BeginPopupContextItem()) { + ImGui::Text("Текстура: %s (Слот %d)", g_TexSlotNames[slot], slot); + ImGui::Separator(); + if (ImGui::MenuItem("Заменить текстуру (PNG/JPG)...")) { + ImportTextureImage(slot, false); + } + if (ImGui::MenuItem("Экспорт текстуры в PNG...")) { + ExportTextureImage(slot); + } + if (ImGui::MenuItem("Сбросить к процедурной")) { + ResetTextureSlotToDefault(slot); + } + ImGui::Separator(); + if (ImGui::MenuItem("Открыть в Менеджере ассетов (F4)")) { + showAssetManagerModal = true; + } + ImGui::EndPopup(); + } + } + + ImGui::PopID(); + + if (selected) { + ImGui::PopStyleVar(); + ImGui::PopStyleColor(); + } ImGui::PopStyleColor(); }; - PaletteButton("1. Кирпичная стена", CELL_BRICK, ImVec4(0.65f, 0.20f, 0.20f, 1.0f)); - PaletteButton("2. Деревянная стена", CELL_WOOD, ImVec4(0.55f, 0.35f, 0.20f, 1.0f)); - PaletteButton("3. Каменная стена", CELL_STONE, ImVec4(0.40f, 0.40f, 0.45f, 1.0f)); - PaletteButton("4. Металлическая стена", CELL_METAL, ImVec4(0.35f, 0.45f, 0.55f, 1.0f)); - PaletteButton("5. Дверь (E: открыть)", CELL_DOOR, ImVec4(0.85f, 0.55f, 0.15f, 1.0f)); - PaletteButton("7. Колонна / Мозаика", CELL_PILLAR, ImVec4(0.25f, 0.60f, 0.65f, 1.0f)); - PaletteButton("8. Стекло", CELL_GLASS, ImVec4(0.28f, 0.50f, 0.65f, 1.0f)); - PaletteButton("9. Мрамор", CELL_MARBLE, ImVec4(0.80f, 0.77f, 0.73f, 1.0f)); - PaletteButton("0. Пустота (Пол)", CELL_EMPTY, ImVec4(0.15f, 0.15f, 0.15f, 1.0f)); + PaletteButton("1. Кирпичная стена", CELL_BRICK, ImVec4(0.65f, 0.20f, 0.20f, 1.0f), 1); + PaletteButton("2. Деревянная стена", CELL_WOOD, ImVec4(0.55f, 0.35f, 0.20f, 1.0f), 2); + PaletteButton("3. Каменная стена", CELL_STONE, ImVec4(0.40f, 0.40f, 0.45f, 1.0f), 3); + PaletteButton("4. Металлическая стена", CELL_METAL, ImVec4(0.35f, 0.45f, 0.55f, 1.0f), 4); + PaletteButton("5. Дверь (E: открыть)", CELL_DOOR, ImVec4(0.85f, 0.55f, 0.15f, 1.0f), 5); + PaletteButton("7. Колонна / Мозаика", CELL_PILLAR, ImVec4(0.25f, 0.60f, 0.65f, 1.0f), 7); + PaletteButton("8. Стекло", CELL_GLASS, ImVec4(0.28f, 0.50f, 0.65f, 1.0f), 8); + PaletteButton("9. Мрамор", CELL_MARBLE, ImVec4(0.80f, 0.77f, 0.73f, 1.0f), 9); + PaletteButton("10. Портал перехода", CELL_PORTAL, ImVec4(0.60f, 0.20f, 0.85f, 1.0f), 10); + PaletteButton("0. Пустота (Пол)", CELL_EMPTY, ImVec4(0.15f, 0.15f, 0.15f, 1.0f), 0); } void EditorApp::RenderHierarchy() { @@ -813,11 +1913,30 @@ void EditorApp::RenderHierarchy() { if (ImGui::Selectable(label, selectedSpriteIdx == static_cast(i))) { selectedSpriteIdx = static_cast(i); + selectedTransitionIdx = -1; + } + } + + ImGui::Separator(); + ImGui::Text("Порталы перехода (%zu / %d):", transitions.size(), MAX_LEVEL_TRANSITIONS); + for (size_t i = 0; i < transitions.size(); ++i) { + char label[96]; + snprintf(label, sizeof(label), "Портал #%zu (%d, %d) -> %s", + i + 1, transitions[i].triggerCellX, transitions[i].triggerCellY, + transitions[i].targetMap[0] ? transitions[i].targetMap : ""); + + if (ImGui::Selectable(label, selectedTransitionIdx == static_cast(i))) { + selectedTransitionIdx = static_cast(i); + selectedSpriteIdx = -1; } } } void EditorApp::RenderInspector() { + if (showCutsceneTimeline && selectedCutsceneEvent >= 0) { + RenderCutsceneInspector(); + ImGui::Separator(); + } ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.2f, 1.0f), "ИНСПЕКТОР СВОЙСТВ"); ImGui::Separator(); @@ -882,6 +2001,23 @@ void EditorApp::RenderInspector() { spr.textureId = static_cast(tid); } + if (tid >= 0 && tid < 16 && textureSRVs[tid]) { + ImGui::Text("Превью спрайта:"); + ImGui::Image(reinterpret_cast(textureSRVs[tid]), ImVec2(64, 64)); + ImGui::SameLine(); + ImGui::BeginGroup(); + if (ImGui::Button("Заменить PNG...")) { + ImportTextureImage(tid, true); + } + if (ImGui::Button("Экспорт PNG")) { + ExportTextureImage(tid); + } + if (ImGui::Button("Сброс")) { + ResetTextureSlotToDefault(tid); + } + ImGui::EndGroup(); + } + // Scale (16.16 fixed -> float for UI) float scaleF = spr.scale / 65536.0f; if (ImGui::SliderFloat("Масштаб", &scaleF, 0.25f, 4.0f, "%.2f")) { @@ -895,4 +2031,73 @@ void EditorApp::RenderInspector() { } } } + + if (selectedTransitionIdx >= 0 && selectedTransitionIdx < static_cast(transitions.size())) { + if (ImGui::CollapsingHeader("Свойства портала перехода", ImGuiTreeNodeFlags_DefaultOpen)) { + auto& trans = transitions[selectedTransitionIdx]; + + ImGui::TextColored(ImVec4(0.7f, 0.4f, 1.0f, 1.0f), "Триггер-ячейка: (%d, %d)", trans.triggerCellX, trans.triggerCellY); + ImGui::TextWrapped("Файл подуровня должен лежать рядом с текущей картой."); + + // Target map file + char mapBuf[32]; + strncpy_s(mapBuf, trans.targetMap, sizeof(mapBuf)); + if (ImGui::InputText("Файл карты (.dat)", mapBuf, sizeof(mapBuf))) { + strncpy_s(trans.targetMap, mapBuf, sizeof(trans.targetMap)); + } + + ImGui::SameLine(); + if (ImGui::Button("Обзор...")) { + std::string path = BrowseOpenFile(); + if (!path.empty()) { + size_t lastSlash = path.find_last_of("\\/"); + std::string fname = (lastSlash != std::string::npos) ? path.substr(lastSlash + 1) : path; + if (IsMapFilename(fname.c_str())) { + strcpy_s(trans.targetMap, fname.c_str()); + } else { + statusMessage = "Имя подуровня: ASCII, до 31 символа, расширение .dat."; + } + } + } + + // Target spawn coords + int spX = trans.targetSpawnX; + int spY = trans.targetSpawnY; + if (ImGui::SliderInt("Целевой Spawn X", &spX, 0, MAP_GRID_W - 1)) trans.targetSpawnX = static_cast(spX); + if (ImGui::SliderInt("Целевой Spawn Y", &spY, 0, MAP_GRID_H - 1)) trans.targetSpawnY = static_cast(spY); + + float targetDeg = (trans.targetAngle * 360.0f) / 512.0f; + if (ImGui::SliderFloat("Целевой угол (°)", &targetDeg, 0.0f, 360.0f, "%.0f°")) { + trans.targetAngle = static_cast(((int)((targetDeg * 512.0f) / 360.0f)) & 511); + } + + bool fadeB = (trans.fadeEffect != 0); + if (ImGui::Checkbox("Плавное затемнение экрана (Fade to Black)", &fadeB)) { + trans.fadeEffect = fadeB ? 1 : 0; + } + + ImGui::Separator(); + if (ImGui::Button("Перейти к подуровню в редакторе")) { + const auto directory = fs::path(currentFilePath).parent_path(); + std::string targetPath = (directory / trans.targetMap).string(); + if (SaveLevel(currentFilePath)) LoadLevel(targetPath); + } + + ImGui::SameLine(); + if (ImGui::Button("Удалить портал")) { + PushUndo(); + if (trans.triggerCellX < MAP_GRID_W && trans.triggerCellY < MAP_GRID_H) { + if (map[trans.triggerCellY][trans.triggerCellX] == CELL_PORTAL) { + map[trans.triggerCellY][trans.triggerCellX] = CELL_EMPTY; + } + } + RemoveCutsceneTransition(selectedTransitionIdx); + transitions.erase(transitions.begin() + selectedTransitionIdx); + selectedTransitionIdx = -1; + } + } + } } + +#include "editor_cutscene.inl" +#include "editor_viewport.inl" diff --git a/editor/src/editor_app.h b/editor/src/editor_app.h index 3829d8d..3fff893 100644 --- a/editor/src/editor_app.h +++ b/editor/src/editor_app.h @@ -1,5 +1,14 @@ #pragma once +#ifndef NOMINMAX +#define NOMINMAX +#endif +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif + #include "level_format.h" +#include "cutscene_preview.h" +#include "preview_protocol.h" #include #include #include @@ -13,12 +22,14 @@ enum ToolMode { TOOL_SPRITE_SPAWN }; -// Full level snapshot for undo/redo (grid + spawn + palette + sprites) +// Full level snapshot for undo/redo (grid + spawn + palette + sprites + transitions) struct LevelSnapshot { uint8_t map[MAP_GRID_H][MAP_GRID_W]; int playerStartX, playerStartY, playerStartAngle; uint32_t ceilingColor, floorColor; std::vector sprites; + std::vector transitions; + CutsceneTrack cutscene; }; class EditorApp { @@ -34,6 +45,28 @@ public: void StopPlaytest(); void CheckPlaytestProcess(); + void InitD3D(struct ID3D11Device* pDevice); + void ShutdownD3D(); + + // Asset Management + std::string GetTexturePackPath() const; + std::string GetSoundsDirectory() const; + bool ImportTextureImage(int slotIndex, bool isSprite, const std::string& explicitPath = ""); + bool ExportTextureImage(int slotIndex); + bool ResetTextureSlotToDefault(int slotIndex); + bool ImportSoundAudio(const std::string& explicitPath = ""); + void HandleDropFile(const std::string& droppedPath); + void ReloadTextureSlotSRV(int slotIndex); + void LoadAllTexturePreviews(); + void UpdateSoundManifest(); + std::vector GetSoundList() const; + void PlayAudioSound(const std::string& filename); + void StopAudioSound(); + + void RenderAssetManagerModal(); + bool showAssetManagerModal = false; + bool showCutsceneTimeline = false; + void RenderUI(); // Level state @@ -44,13 +77,16 @@ public: uint32_t ceilingColor = 0x00383838; uint32_t floorColor = 0x00222222; std::vector sprites; + std::vector transitions; + CutsceneTrack cutscene; // Editor state ToolMode currentTool = TOOL_BRUSH; CellType selectedPaletteCell = CELL_BRICK; int selectedSpriteIdx = -1; + int selectedTransitionIdx = -1; bool isEngineRunning = false; - std::string statusMessage = "Готов к работе. EblanStudio v1.1"; + std::string statusMessage = "Готов к работе. EblanStudio v1.2"; std::string currentFilePath = "..\\assets\\map.dat"; // Viewport pan & zoom @@ -58,7 +94,56 @@ public: float canvasPanX = 20.0f; float canvasPanY = 20.0f; + // Texture preview SRVs (DirectX 11) + struct ID3D11Device* pd3dDevice = nullptr; + struct ID3D11ShaderResourceView* textureSRVs[16] = { nullptr }; + private: + bool EnsureEnginePreview(); + void StopEnginePreview(); + void UpdateEnginePreview(); + void RenderSceneViewport(); + std::string FindEnginePath() const; + HANDLE previewMapping = nullptr; + PROCESS_INFORMATION previewProcess{}; + EnginePreviewPacket* previewPacket = nullptr; + struct ID3D11Texture2D* previewTexture = nullptr; + struct ID3D11ShaderResourceView* previewSRV = nullptr; + struct ID3D11SamplerState* previewSampler = nullptr; + std::vector previewPixels; + std::vector previewTextures; + std::string previewError; + bool previewTexturesDirty = true; + bool previewAttempted = false; + bool previewHasFrame = false; + bool previewSceneCamera = true; + int viewportMode = 0; // 0 split, 1 scene, 2 map + int previewX = 160, previewY = 160, previewAngle = 0; + double previewTurn = 0, previewMoveX = 0, previewMoveY = 0; + ULONGLONG previewRequestTime = 0; + bool showPlaytestError = false; + + void RenderCutsceneTimeline(); + void RenderCutsceneInspector(); + void DrawCutscenePath(void* drawList, float originX, float originY, float tileSize); + void AddCutsceneEvent(uint8_t op); + void NormalizeCutscene(); + void DeleteCutsceneEvent(); + void RemoveCutsceneTransition(int index); + void ScrubCutscene(int frame); + void StopCutscenePreview(); + void AdvanceCutscenePreview(float seconds); + int CutsceneEndTick() const; + int selectedCutsceneEvent = -1; + int cutsceneCursor = 0; + int dragEventOriginalTick = 0; + float cutsceneTimelineZoom = 60.0f; + bool placeCameraPoint = false; + bool cutscenePreviewPlaying = false; + bool cutscenePreviewSound = true; + double cutscenePreviewAccumulator = 0; + CutscenePreview cutscenePreview; + void RenderMenuBar(); void RenderToolbar(); void RenderGridCanvas(); @@ -67,6 +152,11 @@ private: void RenderHierarchy(); void HandleHotkeys(); + bool SaveLevelToFile(const std::string& filepath, bool updateCurrentPath); + bool PreparePlaytest(std::string& startMap, std::string& enginePath); + void CleanupPlaytest(); + bool WriteTextureSlot(int slotIndex, const std::vector& pixels); + bool SetCell(int gridX, int gridY, uint8_t value); void ApplyTool(int gridX, int gridY); void FloodFill(int startX, int startY, uint8_t targetType, uint8_t fillType); @@ -87,7 +177,11 @@ private: // File dialogs std::string BrowseOpenFile(); std::string BrowseSaveFile(); + std::string BrowseOpenImageFile(); + std::string BrowseOpenAudioFile(); + std::string BrowseSavePngFile(int slotIndex); + std::string playtestDirectory; HANDLE hEngineProcess = NULL; PROCESS_INFORMATION engineProcInfo{}; }; diff --git a/editor/src/editor_cutscene.inl b/editor/src/editor_cutscene.inl new file mode 100644 index 0000000..2756315 --- /dev/null +++ b/editor/src/editor_cutscene.inl @@ -0,0 +1,343 @@ +// Editor-only authoring and deterministic top-down preview of the ASM track. +static const char* const kSceneNames[] = { + "Конец", "Пауза", "Камера", "Поворот", "Субтитр", "Скрыть текст", "Звук", "Затемнение", "Переход" +}; + +int EditorApp::CutsceneEndTick() const { + return cutscene.events.empty() ? 0 : cutscene.events.back().tickTimestamp; +} + +void EditorApp::StopCutscenePreview() { + if (cutscenePreviewPlaying) PlaySoundA(nullptr, nullptr, 0); + cutscenePreviewPlaying = false; + cutscenePreviewAccumulator = 0; +} + +void EditorApp::ScrubCutscene(int frame) { + previewSceneCamera = true; + StopCutscenePreview(); + cutsceneCursor = (std::max)(0, (std::min)(frame, CutsceneEndTick())); + cutscenePreview.Start(playerStartX*64+32, playerStartY*64+32, playerStartAngle); + for (int i = 0; i <= cutsceneCursor && cutscenePreview.active; ++i) cutscenePreview.Step(cutscene); +} + +void EditorApp::AdvanceCutscenePreview(float seconds) { + if (!cutscenePreviewPlaying) return; + cutscenePreviewAccumulator += (std::min)(static_cast(seconds), 0.25) * 60.0; + auto audio = [&](int index, bool loop) { + if (!cutscenePreviewSound) return; + if (index < 0) { PlaySoundA(nullptr, nullptr, 0); return; } + const std::string path = GetSoundsDirectory() + cutscene.strings[index]; + if (!PlaySoundA(path.c_str(), nullptr, SND_FILENAME | SND_ASYNC | SND_NODEFAULT | (loop ? SND_LOOP : 0))) + statusMessage = "Не удалось воспроизвести WAV: " + path; + }; + while (cutscenePreviewAccumulator >= 1.0 && cutscenePreviewPlaying) { + cutscenePreviewAccumulator -= 1.0; + cutsceneCursor = cutscenePreview.tick; + cutscenePreview.Step(cutscene, audio); + if (!cutscenePreview.active) { + StopCutscenePreview(); + if (cutscenePreview.transition >= 0) + statusMessage = "Предпросмотр дошёл до перехода. F5 проверяет последовательность в игре."; + } + } +} + +void EditorApp::NormalizeCutscene() { + std::vector> sorted; + int endTick = 0; + bool selectedEnd = false; + for (int i = 0; i < static_cast(cutscene.events.size()); ++i) { + auto event = cutscene.events[i]; + if (event.opCode == OP_END) { + endTick = (std::max)(endTick, static_cast(event.tickTimestamp)); + selectedEnd |= i == selectedCutsceneEvent; + continue; + } + int duration = event.opCode == OP_MOVE_CAM_TO ? event.dataId : + (event.opCode == OP_PAN_CAM_TO || event.opCode == OP_FADE_SCREEN || event.opCode == OP_SHOW_SUBTITLE ? event.paramB : + event.opCode == OP_WAIT ? event.paramA : 1); + event.tickTimestamp = static_cast((std::min)(static_cast(event.tickTimestamp), 65535-duration)); + endTick = (std::max)(endTick, event.tickTimestamp + (std::max)(1,duration)); + sorted.push_back({event, i}); + } + std::stable_sort(sorted.begin(), sorted.end(), [](const auto& a, const auto& b) { return a.first.tickTimestamp < b.first.tickTimestamp; }); + const int previousSelection = selectedCutsceneEvent; + selectedCutsceneEvent = -1; + cutscene.events.clear(); + for (const auto& item : sorted) { + if (item.second == previousSelection) selectedCutsceneEvent = static_cast(cutscene.events.size()); + cutscene.events.push_back(item.first); + } + if (!sorted.empty() || selectedEnd) { + CutsceneEvent end{}; end.tickTimestamp = static_cast((std::min)(65535, endTick)); end.opCode = OP_END; + cutscene.events.push_back(end); + if (selectedEnd) selectedCutsceneEvent = static_cast(cutscene.events.size()) - 1; + } + StopCutscenePreview(); +} + +void EditorApp::AddCutsceneEvent(uint8_t op) { + if (cutscene.events.size() >= MAX_CUTSCENE_EVENTS || + (cutscene.events.empty() && MAX_CUTSCENE_EVENTS < 2)) { statusMessage = "Лимит: 128 команд кат-сцены."; return; } + if (op == OP_CHANGE_SUBLEVEL && transitions.empty()) { statusMessage = "Сначала создайте портал перехода на карте."; return; } + if ((op == OP_SHOW_SUBTITLE || op == OP_PLAY_SOUND) && cutscene.strings.size() >= MAX_CUTSCENE_STRINGS) { + statusMessage = "Лимит: 32 строки/звука в кат-сцене."; return; + } + PushUndo(); + CutsceneEvent event{}; event.opCode = op; + event.tickTimestamp = static_cast((std::min)(cutsceneCursor, 61935)); + switch (op) { + case OP_MOVE_CAM_TO: event.paramA = playerStartX*64+32; event.paramB = playerStartY*64+32; event.dataId = 120; break; + case OP_PAN_CAM_TO: event.paramA = playerStartAngle; event.paramB = 120; break; + case OP_SHOW_SUBTITLE: event.paramA = static_cast(cutscene.strings.size()); event.paramB = 180; + cutscene.strings.push_back("Текст кат-сцены"); break; + case OP_PLAY_SOUND: { + auto sounds = GetSoundList(); + event.paramA = static_cast(cutscene.strings.size()); + cutscene.strings.push_back(sounds.empty() ? "sound.wav" : sounds.front()); break; + } + case OP_CHANGE_SUBLEVEL: event.paramA = (std::max)(0, selectedTransitionIdx); break; + case OP_FADE_SCREEN: event.paramA = 16; event.paramB = 60; break; + case OP_WAIT: event.paramA = 60; break; + } + cutscene.events.push_back(event); + selectedCutsceneEvent = static_cast(cutscene.events.size()) - 1; + NormalizeCutscene(); + placeCameraPoint = op == OP_MOVE_CAM_TO; + ScrubCutscene(cutsceneCursor); +} + +void EditorApp::DeleteCutsceneEvent() { + if (selectedCutsceneEvent < 0 || selectedCutsceneEvent >= static_cast(cutscene.events.size())) return; + PushUndo(); + cutscene.events.erase(cutscene.events.begin() + selectedCutsceneEvent); + selectedCutsceneEvent = -1; placeCameraPoint = false; + std::vector strings; + std::vector remap(cutscene.strings.size(), -1); + for (auto& event : cutscene.events) { + if ((event.opCode == OP_SHOW_SUBTITLE || event.opCode == OP_PLAY_SOUND) && event.paramA >= 0) { + if (remap[event.paramA] < 0) { remap[event.paramA] = static_cast(strings.size()); strings.push_back(cutscene.strings[event.paramA]); } + event.paramA = remap[event.paramA]; + } + } + cutscene.strings.swap(strings); + NormalizeCutscene(); ScrubCutscene(cutsceneCursor); +} + +void EditorApp::RemoveCutsceneTransition(int index) { + cutscene.events.erase(std::remove_if(cutscene.events.begin(), cutscene.events.end(), [&](CutsceneEvent& event) { + if (event.opCode != OP_CHANGE_SUBLEVEL) return false; + if (event.paramA == index) return true; + if (event.paramA > index) --event.paramA; + return false; + }), cutscene.events.end()); + selectedCutsceneEvent = -1; + NormalizeCutscene(); ScrubCutscene(cutsceneCursor); +} + +void EditorApp::RenderCutsceneTimeline() { + ImGui::TextUnformatted("КАТ-СЦЕНА / 60 кадров в секунду"); + ImGui::SameLine(); + bool autoplay = (cutscene.flags & CUTSCENE_AUTOPLAY) != 0; + if (ImGui::Checkbox("При входе", &autoplay)) { PushUndo(); cutscene.flags = autoplay ? CUTSCENE_AUTOPLAY : 0; } + ImGui::SameLine(); + if (!cutscenePreviewPlaying) { + if (ImGui::Button("▶ Предпросмотр")) { + std::string error; + if (cutscene.events.empty()) statusMessage = "Добавьте команды кат-сцены."; + else if (!ValidateCutscene(cutscene, &map[0][0], transitions.size(), error)) statusMessage = error; + else { + cutscenePreview.Start(playerStartX*64+32, playerStartY*64+32, playerStartAngle); + previewSceneCamera = true; + cutsceneCursor = -1; cutscenePreviewPlaying = true; cutscenePreviewAccumulator = 1; + AdvanceCutscenePreview(0); + } + } + } else if (ImGui::Button("■ Стоп")) { StopCutscenePreview(); ScrubCutscene(0); } + ImGui::SameLine(); + if (ImGui::Checkbox("WAV", &cutscenePreviewSound) && !cutscenePreviewSound) PlaySoundA(nullptr, nullptr, 0); + if (ImGui::Button("+ Камера")) AddCutsceneEvent(OP_MOVE_CAM_TO); + ImGui::SameLine(); if (ImGui::Button("+ Поворот")) AddCutsceneEvent(OP_PAN_CAM_TO); + ImGui::SameLine(); if (ImGui::Button("+ Текст")) AddCutsceneEvent(OP_SHOW_SUBTITLE); + ImGui::SameLine(); if (ImGui::Button("+ Звук")) AddCutsceneEvent(OP_PLAY_SOUND); + ImGui::SameLine(); if (ImGui::Button("+ Переход")) AddCutsceneEvent(OP_CHANGE_SUBLEVEL); + if (ImGui::Button("+ Затемнение")) AddCutsceneEvent(OP_FADE_SCREEN); + ImGui::SameLine(); if (ImGui::Button("+ Пауза")) AddCutsceneEvent(OP_WAIT); + ImGui::SameLine(); if (ImGui::Button("+ Скрыть текст")) AddCutsceneEvent(OP_HIDE_SUBTITLE); + ImGui::SameLine(); if (ImGui::Button("Очистить")) { + PushUndo(); StopCutscenePreview(); cutscene = {}; selectedCutsceneEvent = -1; placeCameraPoint = false; ScrubCutscene(0); + } + const char* selectedName = selectedCutsceneEvent >= 0 && selectedCutsceneEvent < static_cast(cutscene.events.size()) ? kSceneNames[cutscene.events[selectedCutsceneEvent].opCode] : "Выберите команду"; + ImGui::SetNextItemWidth(210); + if (ImGui::BeginCombo("Команда",selectedName)) { + for (int i=0;i(cutscene.events.size());++i) { + char label[160]; snprintf(label,sizeof(label),"#%d %s — кадр %u",i+1,kSceneNames[cutscene.events[i].opCode],cutscene.events[i].tickTimestamp); + if (ImGui::Selectable(label,i==selectedCutsceneEvent)) { selectedCutsceneEvent=i; placeCameraPoint=false; ScrubCutscene(cutscene.events[i].tickTimestamp); } + } + ImGui::EndCombo(); + } + ImGui::SetNextItemWidth(160); + int frame = cutsceneCursor; + if (ImGui::SliderInt("Кадр", &frame, 0, (std::max)(1, CutsceneEndTick()))) ScrubCutscene(frame); + ImGui::SameLine(); ImGui::Text("%.2f с / %.2f с", cutsceneCursor/60.0f, CutsceneEndTick()/60.0f); + ImGui::SameLine(); ImGui::SetNextItemWidth(90); ImGui::SliderFloat("Масштаб", &cutsceneTimelineZoom, 20, 180, "%.0f"); + const float left = 82, pixels = cutsceneTimelineZoom/60.0f; + ImGui::BeginChild("TrackScroll", ImVec2(0, 130), true, ImGuiWindowFlags_HorizontalScrollbar); + ImVec2 origin = ImGui::GetCursorScreenPos(); + const float width = (std::max)(ImGui::GetContentRegionAvail().x, left+(CutsceneEndTick()+120)*pixels); + auto* draw = ImGui::GetWindowDrawList(); + static const char* rows[] = {"Камера", "Текст", "Звук", "Сцена"}; + for (int row = 0; row < 4; ++row) { + draw->AddRectFilled(ImVec2(origin.x,origin.y+20+row*22), ImVec2(origin.x+width,origin.y+42+row*22), row%2 ? IM_COL32(31,34,41,255) : IM_COL32(39,42,49,255)); + draw->AddText(ImVec2(origin.x+2,origin.y+23+row*22), IM_COL32(210,215,225,255), rows[row]); + } + for (int seconds = 0; seconds <= (CutsceneEndTick()+120)/60; ++seconds) { + float x = origin.x+left+seconds*cutsceneTimelineZoom; + char label[24]; snprintf(label,sizeof(label),"%ds",seconds); + draw->AddText(ImVec2(x,origin.y),IM_COL32(150,160,180,255),label); + draw->AddLine(ImVec2(x,origin.y+18),ImVec2(x,origin.y+108),IM_COL32(65,70,82,255)); + } + bool sortAfterDrag = false; + for (int i = 0; i < static_cast(cutscene.events.size()); ++i) { + auto& event = cutscene.events[i]; + int row = event.opCode == OP_MOVE_CAM_TO || event.opCode == OP_PAN_CAM_TO ? 0 : + event.opCode == OP_SHOW_SUBTITLE || event.opCode == OP_HIDE_SUBTITLE ? 1 : event.opCode == OP_PLAY_SOUND ? 2 : 3; + ImVec2 center(origin.x+left+event.tickTimestamp*pixels,origin.y+31+row*22); + ImGui::SetCursorScreenPos(ImVec2(center.x-7,center.y-7)); + ImGui::PushID(i); + ImGui::InvisibleButton("Key", ImVec2(14,14)); + if (ImGui::IsItemActivated()) { PushUndo(); selectedCutsceneEvent = i; dragEventOriginalTick = event.tickTimestamp; StopCutscenePreview(); } + if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) { + int value = dragEventOriginalTick + static_cast(ImGui::GetMouseDragDelta().x/pixels); + event.tickTimestamp = static_cast((std::max)(0,(std::min)(61935,value))); + cutsceneCursor = event.tickTimestamp; + } + if (ImGui::IsItemDeactivated()) sortAfterDrag = true; + if (ImGui::IsItemHovered()) ImGui::SetTooltip("%s: кадр %u (%.2f с)",kSceneNames[event.opCode],event.tickTimestamp,event.tickTimestamp/60.0f); + ImU32 color = selectedCutsceneEvent == i ? IM_COL32(255,220,90,255) : IM_COL32(80+row*35,190-row*20,235,255); + draw->AddQuadFilled(ImVec2(center.x,center.y-7),ImVec2(center.x+7,center.y),ImVec2(center.x,center.y+7),ImVec2(center.x-7,center.y),color); + ImGui::PopID(); + } + float cursor = origin.x+left+cutsceneCursor*pixels; + draw->AddLine(ImVec2(cursor,origin.y),ImVec2(cursor,origin.y+108),IM_COL32(255,90,90,255),2); + ImGui::SetCursorScreenPos(origin); + ImGui::Dummy(ImVec2(width,112)); + ImGui::EndChild(); + if (sortAfterDrag) { NormalizeCutscene(); ScrubCutscene(cutsceneCursor); } + if (placeCameraPoint) ImGui::TextWrapped("Выберите точку камеры на карте. Клетки уровня при этом не меняются."); + else ImGui::TextWrapped("Выберите ромб для редактирования. C — запуск в игре, Tab — пропуск. Предпросмотр камеры показан на карте."); +} + +void EditorApp::RenderCutsceneInspector() { + if (selectedCutsceneEvent >= static_cast(cutscene.events.size())) { selectedCutsceneEvent = -1; return; } + CutsceneEvent edited = cutscene.events[selectedCutsceneEvent]; + bool changed = false, activated = false; + auto activatedItem = [&]() { activated |= ImGui::IsItemActivated(); }; + ImGui::TextColored(ImVec4(1,0.8f,0.3f,1),"КАТ-СЦЕНА: %s",kSceneNames[edited.opCode]); + int frame = edited.tickTimestamp; + changed |= ImGui::InputInt("Кадр",&frame); activatedItem(); + edited.tickTimestamp = static_cast((std::max)(0,(std::min)(65535,frame))); + ImGui::Text("Время: %.2f с",edited.tickTimestamp/60.0f); + bool textChanged = false; + std::string newText; + switch (edited.opCode) { + case OP_MOVE_CAM_TO: { + float x = edited.paramA/64.0f, y = edited.paramB/64.0f; + if (ImGui::SliderFloat("Камера X",&x,0,31.99f,"%.2f")) { edited.paramA = static_cast(x*64); changed = true; } activatedItem(); + if (ImGui::SliderFloat("Камера Y",&y,0,31.99f,"%.2f")) { edited.paramB = static_cast(y*64); changed = true; } activatedItem(); + changed |= ImGui::InputInt("Длительность",&edited.dataId); activatedItem(); + edited.dataId = (std::max)(0,(std::min)(CUTSCENE_MAX_DURATION,edited.dataId)); + if (ImGui::Button("Указать на карте")) placeCameraPoint = true; + ImGui::TextWrapped("Линейный пролёт между точками; 0 кадров — мгновенно. Камера не сталкивается со стенами."); break; + } + case OP_PAN_CAM_TO: { + float angle = edited.paramA*360.0f/512; + if (ImGui::SliderFloat("Угол",&angle,0,359.3f,"%.1f°")) { edited.paramA = static_cast(angle*512/360)&511; changed = true; } activatedItem(); + changed |= ImGui::InputInt("Длительность",&edited.paramB); activatedItem(); + edited.paramB = (std::max)(0,(std::min)(CUTSCENE_MAX_DURATION,edited.paramB)); + ImGui::TextWrapped("Поворот идёт по кратчайшей дуге."); break; + } + case OP_SHOW_SUBTITLE: case OP_PLAY_SOUND: { + char buffer[384]{}; + if (edited.paramA >= 0 && edited.paramA < static_cast(cutscene.strings.size())) strcpy_s(buffer,cutscene.strings[edited.paramA].c_str()); + if (edited.opCode == OP_SHOW_SUBTITLE) { + textChanged = ImGui::InputTextMultiline("Текст",buffer,sizeof(buffer),ImVec2(-1,85)); activatedItem(); + changed |= ImGui::InputInt("Показывать кадров",&edited.paramB); activatedItem(); + edited.paramB = (std::max)(0,(std::min)(CUTSCENE_MAX_DURATION,edited.paramB)); + ImGui::TextWrapped("До 95 символов CP1251, на экране 3 строки по 38. 0 кадров — до команды скрытия или конца."); + } else { + textChanged = ImGui::InputText("WAV",buffer,sizeof(buffer)); activatedItem(); + auto sounds = GetSoundList(); + if (ImGui::BeginCombo("Из ассетов",buffer)) { + for (const auto& sound : sounds) if (ImGui::Selectable(sound.c_str())) { strcpy_s(buffer,sound.c_str()); textChanged = true; activated = true; } + ImGui::EndCombo(); + } + bool loop = (edited.param8&1)!=0; + if (ImGui::Checkbox("Повторять",&loop)) { edited.param8 = loop ? 1 : 0; changed = true; } activatedItem(); + if (ImGui::Button("Стоп звука в этой точке")) { edited.paramA = -1; changed = true; activated = true; } + ImGui::TextWrapped("Имя WAV из assets/sounds, ASCII, до 63 символов. Новый звук заменяет предыдущий."); + } + newText = buffer; + changed |= textChanged; + break; + } + case OP_FADE_SCREEN: + changed |= ImGui::SliderInt("Затемнение",&edited.paramA,0,16); activatedItem(); + changed |= ImGui::InputInt("Длительность",&edited.paramB); activatedItem(); + edited.paramB = (std::max)(0,(std::min)(CUTSCENE_MAX_DURATION,edited.paramB)); break; + case OP_WAIT: + changed |= ImGui::InputInt("Пауза кадров",&edited.paramA); activatedItem(); + edited.paramA = (std::max)(0,(std::min)(CUTSCENE_MAX_DURATION,edited.paramA)); + ImGui::TextWrapped("Пауза задерживает следующие команды; начатые движения продолжаются."); break; + case OP_CHANGE_SUBLEVEL: + if (ImGui::BeginCombo("Портал",edited.paramA >= 0 && edited.paramA < static_cast(transitions.size()) ? transitions[edited.paramA].targetMap : "Нет перехода")) { + for (int i=0;i(transitions.size());++i) { + ImGui::PushID(i); + if (ImGui::Selectable(transitions[i].targetMap,edited.paramA==i)) { edited.paramA=i; changed=true; activated=true; } + ImGui::PopID(); + } + ImGui::EndCombo(); + } break; + } + if (activated) PushUndo(); + if (changed) { + StopCutscenePreview(); + if (textChanged && edited.paramA < 0 && cutscene.strings.size() < MAX_CUTSCENE_STRINGS) { + edited.paramA = static_cast(cutscene.strings.size()); cutscene.strings.push_back(newText); + } + cutscene.events[selectedCutsceneEvent] = edited; + if (textChanged && edited.paramA >= 0) cutscene.strings[edited.paramA] = newText; + NormalizeCutscene(); ScrubCutscene(cutsceneCursor); + } + if (ImGui::Button("Удалить команду")) DeleteCutsceneEvent(); +} + +void EditorApp::DrawCutscenePath(void* list, float ox, float oy, float size) { + if (!showCutsceneTimeline) return; + auto* draw = static_cast(list); + ImVec2 previous(ox+(playerStartX+0.5f)*size,oy+(playerStartY+0.5f)*size); + for (int i=0;i(cutscene.events.size());++i) { + const auto& event=cutscene.events[i]; + if (event.opCode!=OP_MOVE_CAM_TO) continue; + ImVec2 point(ox+event.paramA/64.0f*size,oy+event.paramB/64.0f*size); + draw->AddLine(previous,point,IM_COL32(80,190,255,220),2); + draw->AddCircleFilled(point,i==selectedCutsceneEvent?6.0f:4.0f,IM_COL32(255,220,60,255)); + previous=point; + } + if (cutscene.events.empty()) return; + ImVec2 camera(ox+cutscenePreview.x/64.0f*size,oy+cutscenePreview.y/64.0f*size); + float angle=cutscenePreview.angle*3.14159265f/256; + draw->AddCircle(camera,size*0.3f,IM_COL32(255,255,255,255),0,2); + draw->AddLine(camera,ImVec2(camera.x+std::cos(angle)*size,camera.y+std::sin(angle)*size),IM_COL32(255,255,255,255),2); + if (cutscenePreview.subtitle>=0 && cutscenePreview.subtitle(cutscene.strings.size())) { + ImVec2 top=ImGui::GetWindowPos(), available=ImGui::GetWindowSize(); + ImVec2 p(top.x+8,top.y+available.y-66); + draw->AddRectFilled(p,ImVec2(top.x+available.x-8,top.y+available.y-8),IM_COL32(0,0,0,200)); + draw->AddText(nullptr,0,ImVec2(p.x+8,p.y+4),IM_COL32(255,255,255,255),cutscene.strings[cutscenePreview.subtitle].c_str(),nullptr,available.x-40); + } + if (cutscenePreview.fade) { + ImVec2 top=ImGui::GetWindowPos(), available=ImGui::GetWindowSize(); + draw->AddRectFilled(top,ImVec2(top.x+available.x,top.y+available.y),IM_COL32(0,0,0,cutscenePreview.fade*255/16)); + } +} diff --git a/editor/src/editor_viewport.inl b/editor/src/editor_viewport.inl new file mode 100644 index 0000000..fa356df --- /dev/null +++ b/editor/src/editor_viewport.inl @@ -0,0 +1,186 @@ +// The viewport displays frames produced by engine.exe itself, not a second raycaster. +std::string EditorApp::FindEnginePath() const { + char module[MAX_PATH]{}; GetModuleFileNameA(nullptr, module, MAX_PATH); + const auto directory = fs::path(module).parent_path(); + std::error_code ec; + for (const auto& candidate : {directory / "engine.exe", directory.parent_path() / "engine.exe", fs::absolute("../engine.exe", ec)}) { + ec.clear(); + if (fs::is_regular_file(candidate, ec)) return fs::absolute(candidate, ec).string(); + } + return {}; +} + +void EditorApp::StopEnginePreview() { + if (previewProcess.hProcess) { + if (previewPacket) InterlockedExchange(&previewPacket->state, 3); + if (WaitForSingleObject(previewProcess.hProcess, 300) == WAIT_TIMEOUT) { + TerminateProcess(previewProcess.hProcess, 0); + WaitForSingleObject(previewProcess.hProcess, 1000); + } + CloseHandle(previewProcess.hProcess); CloseHandle(previewProcess.hThread); + previewProcess = {}; + } + if (previewPacket) { UnmapViewOfFile(previewPacket); previewPacket = nullptr; } + if (previewMapping) { CloseHandle(previewMapping); previewMapping = nullptr; } + previewHasFrame = false; +} + +bool EditorApp::EnsureEnginePreview() { + if (previewPacket) return true; + if (previewAttempted) return false; + previewAttempted = true; + auto fail = [&](const std::string& reason) { + previewError = reason; StopEnginePreview(); return false; + }; + const auto engine = FindEnginePath(); + if (engine.empty()) return fail("Не найден engine.exe. Соберите движок через build.bat."); + const std::string name = "Local\\EblanPreview-" + std::to_string(GetCurrentProcessId()) + "-" + std::to_string(GetTickCount64()); + previewMapping = CreateFileMappingA(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, sizeof(EnginePreviewPacket), name.c_str()); + if (!previewMapping) return fail("Не удалось создать буфер игрового вида: " + std::to_string(GetLastError())); + previewPacket = static_cast(MapViewOfFile(previewMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(EnginePreviewPacket))); + if (!previewPacket) return fail("Не удалось открыть буфер игрового вида."); + // Initialize in place: no large packet on the thread's stack. + memset(previewPacket, 0, sizeof(*previewPacket)); + previewPacket->magic = 0x56504245; previewPacket->version = 1; previewPacket->parentPid = GetCurrentProcessId(); + std::string command = "\"" + engine + "\" \"--preview:" + name + "\""; + STARTUPINFOA si{}; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; + if (!CreateProcessA(engine.c_str(), command.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, + fs::path(engine).parent_path().string().c_str(), &si, &previewProcess)) + return fail("Не удалось запустить игровой вид: " + std::to_string(GetLastError())); + previewTexturesDirty = true; previewError.clear(); + return true; +} + +void EditorApp::UpdateEnginePreview() { + if (!EnsureEnginePreview()) return; + if (WaitForSingleObject(previewProcess.hProcess, 0) == WAIT_OBJECT_0) { + DWORD code = 0; GetExitCodeProcess(previewProcess.hProcess, &code); + previewError = "Игровой вид остановлен (код " + std::to_string(code) + "). Пересоберите engine.exe."; + StopEnginePreview(); return; + } + const LONG state = InterlockedCompareExchange(&previewPacket->state, 0, 0); + if (state == 1) { + if (GetTickCount64() - previewRequestTime > 5000) { + previewError = "Движок не ответил на запрос игрового вида."; StopEnginePreview(); + } + return; + } + if (state == 2) { + previewPixels.assign(std::begin(previewPacket->pixels), std::end(previewPacket->pixels)); + for (auto& pixel : previewPixels) pixel |= 0xFF000000; // DIB X -> opaque DX11 alpha + if (pd3dDevice) { + if (!previewTexture) { + D3D11_TEXTURE2D_DESC desc{}; + desc.Width = 320; desc.Height = 240; desc.MipLevels = desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + if (FAILED(pd3dDevice->CreateTexture2D(&desc,nullptr,&previewTexture)) || + FAILED(pd3dDevice->CreateShaderResourceView(previewTexture,nullptr,&previewSRV))) { + if (previewSRV) { previewSRV->Release(); previewSRV = nullptr; } + if (previewTexture) { previewTexture->Release(); previewTexture = nullptr; } + previewError = "Не удалось создать изображение игрового вида."; StopEnginePreview(); return; + } + } + ID3D11DeviceContext* context = nullptr; pd3dDevice->GetImmediateContext(&context); + context->UpdateSubresource(previewTexture,0,nullptr,previewPixels.data(),320*4,0); + context->Release(); + } + previewHasFrame = true; + } + if (previewTexturesDirty) { + if (!ReadTextureSlots(GetTexturePackPath(), previewTextures)) { + previewError = "Повреждён пакет текстур. Исправьте его и нажмите «Повторить»."; + StopEnginePreview(); return; + } + memcpy(previewPacket->textures,previewTextures.data(),previewTextures.size()); + ++previewPacket->textureRevision; previewTexturesDirty = false; + } + const bool scene = showCutsceneTimeline && !cutscene.events.empty() && previewSceneCamera; + previewPacket->x = scene ? cutscenePreview.x : previewSceneCamera ? playerStartX*64+32 : previewX; + previewPacket->y = scene ? cutscenePreview.y : previewSceneCamera ? playerStartY*64+32 : previewY; + previewPacket->angle = scene ? cutscenePreview.angle : previewSceneCamera ? playerStartAngle : previewAngle; + previewPacket->ceiling = ceilingColor; previewPacket->floor = floorColor; + previewPacket->spriteCount = static_cast((std::min)(sprites.size(),size_t(32))); + memcpy(previewPacket->cells,map,sizeof(map)); + if (!sprites.empty()) memcpy(previewPacket->sprites,sprites.data(),previewPacket->spriteCount*sizeof(SpriteEntry)); + previewPacket->cinematic = scene && cutscenePreview.active; + previewPacket->fade = scene ? cutscenePreview.fade : 0; + memset(previewPacket->subtitle,0,96); + if (scene && cutscenePreview.subtitle >= 0 && cutscenePreview.subtitle < static_cast(cutscene.strings.size())) { + std::string encoded; + if (CutsceneEncode(cutscene.strings[cutscenePreview.subtitle],encoded)) memcpy(previewPacket->subtitle,encoded.data(),encoded.size()); + } + previewRequestTime = GetTickCount64(); + InterlockedExchange(&previewPacket->state,1); +} + +static void ViewportPointSampler(const ImDrawList*, const ImDrawCmd* command) { + auto* sampler = static_cast(command->UserCallbackData); + ID3D11Device* device = nullptr; sampler->GetDevice(&device); + ID3D11DeviceContext* context = nullptr; device->GetImmediateContext(&context); + context->PSSetSamplers(0,1,&sampler); context->Release(); device->Release(); +} + +void EditorApp::RenderSceneViewport() { + ImGui::TextUnformatted("ИГРОВОЙ ВИД / ASM"); + if (ImGui::Button("К спавну")) { + previewSceneCamera = true; ScrubCutscene(0); + } + ImGui::SameLine(); + if (ImGui::Checkbox("Камера сцены",&previewSceneCamera) && !previewSceneCamera) { + previewX = cutscenePreview.x; previewY = cutscenePreview.y; previewAngle = cutscenePreview.angle; + } + if (!pd3dDevice) { ImGui::TextUnformatted("Игровой вид доступен в окне редактора."); return; } + UpdateEnginePreview(); + if (!previewError.empty()) { + ImGui::TextWrapped("%s",previewError.c_str()); + if (ImGui::Button("Повторить")) { StopEnginePreview(); previewAttempted = false; previewError.clear(); } + } + if (!previewHasFrame || !previewSRV) { ImGui::TextUnformatted("Подготовка кадра движка…"); return; } + const auto available = ImGui::GetContentRegionAvail(); + float width = (std::max)(1.0f,(std::min)(available.x,(available.y-48)*4/3)); + ImVec2 size(width,width*3/4); + if (!previewSampler) { + D3D11_SAMPLER_DESC desc{}; desc.Filter=D3D11_FILTER_MIN_MAG_MIP_POINT; + desc.AddressU=desc.AddressV=desc.AddressW=D3D11_TEXTURE_ADDRESS_CLAMP; desc.MaxLOD=D3D11_FLOAT32_MAX; + pd3dDevice->CreateSamplerState(&desc,&previewSampler); + } + if (previewSampler) ImGui::GetWindowDrawList()->AddCallback(ViewportPointSampler,previewSampler); + ImGui::Image(reinterpret_cast(previewSRV),size); + if (previewSampler) ImGui::GetWindowDrawList()->AddCallback(ImDrawCallback_ResetRenderState,nullptr); + const bool hovered = ImGui::IsItemHovered(); + if (hovered && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) ImGui::SetWindowFocus(); + // Free camera never writes to the player's spawn or to authored keyframes. + if (!cutscenePreviewPlaying && !ImGui::GetIO().WantTextInput && + ImGui::IsWindowFocused() && !ImGui::IsAnyItemActive() && !ImGui::IsPopupOpen(nullptr,ImGuiPopupFlags_AnyPopupId)) { + const auto held = [](ImGuiKey key) { return ImGui::IsKeyDown(key) ? 1 : 0; }; + const int forward = held(ImGuiKey_W)-held(ImGuiKey_S), strafe = held(ImGuiKey_D)-held(ImGuiKey_A); + const int turn = held(ImGuiKey_RightArrow)-held(ImGuiKey_LeftArrow); + const float dt = (std::min)(ImGui::GetIO().DeltaTime,0.1f); + if (forward || strafe || turn || (hovered && ImGui::IsMouseDragging(ImGuiMouseButton_Right))) { + if (previewSceneCamera) { + previewX = previewPacket ? previewPacket->x : playerStartX*64+32; + previewY = previewPacket ? previewPacket->y : playerStartY*64+32; + previewAngle = previewPacket ? previewPacket->angle : playerStartAngle; + previewSceneCamera = false; + } + previewTurn += turn*128*dt + (hovered && ImGui::IsMouseDown(ImGuiMouseButton_Right) ? ImGui::GetIO().MouseDelta.x*0.5 : 0); + int step=static_cast(previewTurn); previewTurn-=step; previewAngle=(previewAngle+step)&511; + const double a = previewAngle*3.141592653589793/256; + const double speed = (ImGui::GetIO().KeyShift ? 360 : 180)*dt; + previewMoveX += (forward*std::cos(a)-strafe*std::sin(a))*speed; + previewMoveY += (forward*std::sin(a)+strafe*std::cos(a))*speed; + int dx=static_cast(previewMoveX),dy=static_cast(previewMoveY); + previewMoveX-=dx; previewMoveY-=dy; + auto free = [&](int x,int y) { + for (int oy : {-12,12}) for (int ox : {-12,12}) { + if(x+ox<0 || x+ox>=2048 || y+oy<0 || y+oy>=2048 || !IsWalkableCell(map[(y+oy)/64][(x+ox)/64])) return false; + } + return true; + }; + if (free(previewX+dx,previewY)) previewX+=dx; + if (free(previewX,previewY+dy)) previewY+=dy; + } + } + ImGui::TextWrapped("Клик по виду: WASD, стрелки — осмотр. Shift — быстрее. Камера сцены — предпросмотр таймлайна."); +} diff --git a/editor/src/level_format.h b/editor/src/level_format.h index 5f35ba0..dd82884 100644 --- a/editor/src/level_format.h +++ b/editor/src/level_format.h @@ -6,7 +6,7 @@ // ============================================================================== constexpr uint32_t MAP_MAGIC = 0x4E4C4245; // 'EBLN' -constexpr uint16_t MAP_FORMAT_VERSION = 2; // v2: sprite x/y in raw world units (v1 was 16.16 fixed) +constexpr uint16_t MAP_FORMAT_VERSION = 4; // v4 adds a cutscene track and CP1251 string pool constexpr int MAP_GRID_W = 32; constexpr int MAP_GRID_H = 32; constexpr int MAP_TOTAL_CELLS = MAP_GRID_W * MAP_GRID_H; // 1024 bytes @@ -24,13 +24,37 @@ enum CellType : uint8_t { CELL_PILLAR = 7, CELL_GLASS = 8, CELL_MARBLE = 9, - CELL_COUNT = 10 + CELL_PORTAL = 10, + CELL_COUNT = 11 +}; + +constexpr int MAX_LEVEL_TRANSITIONS = 16; +constexpr int MAX_CUTSCENE_EVENTS = 128; +constexpr int MAX_CUTSCENE_STRINGS = 32; +constexpr int CUTSCENE_STRING_BYTES = 96; +constexpr int CUTSCENE_MAX_DURATION = 3600; +constexpr uint16_t CUTSCENE_AUTOPLAY = 1; + +enum CutsceneOpCode : uint8_t { + OP_END, OP_WAIT, OP_MOVE_CAM_TO, OP_PAN_CAM_TO, OP_SHOW_SUBTITLE, + OP_HIDE_SUBTITLE, OP_PLAY_SOUND, OP_FADE_SCREEN, OP_CHANGE_SUBLEVEL }; #pragma pack(push, 1) +struct LevelTransition { + uint8_t triggerCellX; // Trigger cell coordinate X (0..31) + uint8_t triggerCellY; // Trigger cell coordinate Y (0..31) + char targetMap[32]; // Target sublevel filename (e.g. "sublevel_02.dat") + uint16_t targetSpawnX; // Spawn cell X in destination map (0..31) + uint16_t targetSpawnY; // Spawn cell Y in destination map (0..31) + uint16_t targetAngle; // Player orientation (0..511) + uint8_t fadeEffect; // 1 = smooth fade to black, 0 = instant cut + uint8_t reserved; // Padding (total 42 bytes) +}; + struct MapHeader { uint32_t magic; // 'EBLN' - uint16_t version; // 1 + uint16_t version; // Current writer: 4; reader also accepts v1/v2/v3 uint16_t mapWidth; // 32 uint16_t mapHeight; // 32 uint16_t playerStartX; // Cell coordinate (0..31) @@ -39,7 +63,20 @@ struct MapHeader { uint16_t spriteCount; // Number of active sprites uint32_t ceilingColor; // 00RRGGBBh uint32_t floorColor; // 00RRGGBBh - uint8_t reserved[12]; // Reserved for future use + uint16_t transitionCount; // Number of sublevel transitions + uint16_t cutsceneCount; // v4 only; old versions ignore the remaining header fields + uint16_t cutsceneStringCount; + uint16_t cutsceneFlags; // bit 0 = start automatically after entering this map + uint8_t reserved[4]; // Total header remains 38 bytes +}; + +struct CutsceneEvent { + uint16_t tickTimestamp; // Absolute 60 Hz timeline timestamp, 0..65535 + uint8_t opCode; + uint8_t param8; // PLAY_SOUND bit 0 = loop; other operations require 0 + int32_t paramA; // X, angle, text/sound index, fade level or transition index + int32_t paramB; // Y, duration (PAN/FADE/SUBTITLE) or unused + int32_t dataId; // MOVE duration; never a serialized memory pointer }; // Engine world units: 1 cell = 64 units (raw integers, NOT fixed point). @@ -52,3 +89,8 @@ struct SpriteEntry { uint32_t flags; // Flags / type }; #pragma pack(pop) + +static_assert(sizeof(MapHeader) == 38, "EBLN header layout changed"); +static_assert(sizeof(SpriteEntry) == 24, "EBLN sprite layout changed"); +static_assert(sizeof(LevelTransition) == 42, "EBLN transition layout changed"); +static_assert(sizeof(CutsceneEvent) == 16, "EBLN cutscene event layout changed"); diff --git a/editor/src/level_io.h b/editor/src/level_io.h new file mode 100644 index 0000000..3f53229 --- /dev/null +++ b/editor/src/level_io.h @@ -0,0 +1,116 @@ +#pragma once +#include "level_format.h" +#include "cutscene_format.h" +#include +#include +#include +#include +#include + +// Parse into a separate value: a failed load must never partially replace a room. +struct BinaryLevel { + MapHeader header{}; + std::array cells{}; + std::vector sprites; + std::vector transitions; + CutsceneTrack cutscene; +}; + +inline bool IsMapFilename(const char* name) { + size_t length = 0; + for (; length < 32 && name[length]; ++length) { + unsigned char ch = static_cast(name[length]); + if (ch < 32 || ch >= 127 || std::strchr("\\/:*?\"<>|", ch)) return false; + } + if (length < 5 || length >= 32) return false; + const char* ext = name + length - 4; + return ext[0] == '.' && (ext[1] | 32) == 'd' && + (ext[2] | 32) == 'a' && (ext[3] | 32) == 't'; +} + +inline bool IsWalkableCell(uint8_t cell) { + return cell == CELL_EMPTY || cell == CELL_DOOR_OPEN || cell == CELL_PORTAL; +} + +inline bool ValidateLevel(const BinaryLevel& level, std::string& error) { + const auto& h = level.header; + auto fail = [&](const char* reason) { error = reason; return false; }; + if (h.magic != MAP_MAGIC || h.version < 1 || h.version > MAP_FORMAT_VERSION || + h.mapWidth != MAP_GRID_W || h.mapHeight != MAP_GRID_H) + return fail("Неверный формат или версия карты"); + if (level.sprites.size() > MAX_LEVEL_SPRITES || level.transitions.size() > MAX_LEVEL_TRANSITIONS) + return fail("Превышен лимит спрайтов или переходов"); + if (h.playerStartX >= MAP_GRID_W || h.playerStartY >= MAP_GRID_H || h.playerStartAngle > 511) + return fail("Неверные координаты или угол спавна"); + for (uint8_t cell : level.cells) if (cell > 15) return fail("Неверный тип клетки"); + if (!IsWalkableCell(level.cells[h.playerStartY * MAP_GRID_W + h.playerStartX])) + return fail("Спавн игрока находится внутри стены"); + for (const auto& sprite : level.sprites) { + if (sprite.x < 0 || sprite.x >= MAP_GRID_W * 64 || sprite.y < 0 || sprite.y >= MAP_GRID_H * 64 || + sprite.textureId >= 16 || sprite.scale < 0 || sprite.scale > 16 * 65536) + return fail("Неверные координаты, текстура или масштаб спрайта"); + } + std::array triggers{}; + for (const auto& transition : level.transitions) { + if (transition.triggerCellX >= MAP_GRID_W || transition.triggerCellY >= MAP_GRID_H || + transition.targetSpawnX >= MAP_GRID_W || transition.targetSpawnY >= MAP_GRID_H || + transition.targetAngle > 511 || transition.fadeEffect > 1 || !IsMapFilename(transition.targetMap)) + return fail("Неверные свойства перехода (имя файла: ASCII, до 31 символа, .dat)"); + size_t index = transition.triggerCellY * MAP_GRID_W + transition.triggerCellX; + if (triggers[index] || !IsWalkableCell(level.cells[index])) + return fail("Повторный переход или триггер внутри стены"); + triggers[index] = true; + } + for (size_t i = 0; i < level.cells.size(); ++i) + if (level.cells[i] == CELL_PORTAL && !triggers[i]) return fail("Портал не имеет настроенного перехода"); + return ValidateCutscene(level.cutscene, level.cells.data(), level.transitions.size(), error); +} + +inline bool ReadLevelFile(const std::string& path, BinaryLevel& result, std::string& error) { + std::ifstream in(path, std::ios::binary | std::ios::ate); + if (!in) { error = "Не удалось открыть карту: " + path; return false; } + const auto fileSize = in.tellg(); + in.seekg(0); + BinaryLevel candidate; + if (!in.read(reinterpret_cast(&candidate.header), sizeof(MapHeader))) { + error = "Обрезанный заголовок карты"; return false; + } + const auto& h = candidate.header; + const size_t transitionCount = h.version == 1 ? 0 : h.transitionCount; + if (h.spriteCount > MAX_LEVEL_SPRITES || transitionCount > MAX_LEVEL_TRANSITIONS) { + error = "Превышен лимит объектов карты"; return false; + } + const size_t eventCount = h.version >= 4 ? h.cutsceneCount : 0; + const size_t stringCount = h.version >= 4 ? h.cutsceneStringCount : 0; + if (eventCount > MAX_CUTSCENE_EVENTS || stringCount > MAX_CUTSCENE_STRINGS) { + error = "Превышен лимит событий или строк кат-сцены"; return false; + } + const size_t expected = sizeof(MapHeader) + MAP_TOTAL_CELLS + + h.spriteCount * sizeof(SpriteEntry) + transitionCount * sizeof(LevelTransition) + + eventCount * sizeof(CutsceneEvent) + stringCount * CUTSCENE_STRING_BYTES; + if (fileSize != static_cast(expected)) { + error = "Размер файла не соответствует заголовку карты"; return false; + } + candidate.sprites.resize(h.spriteCount); + candidate.transitions.resize(transitionCount); + in.read(reinterpret_cast(candidate.cells.data()), MAP_TOTAL_CELLS); + if (!candidate.sprites.empty()) + in.read(reinterpret_cast(candidate.sprites.data()), candidate.sprites.size() * sizeof(SpriteEntry)); + if (!candidate.transitions.empty()) + in.read(reinterpret_cast(candidate.transitions.data()), candidate.transitions.size() * sizeof(LevelTransition)); + candidate.cutscene.events.resize(eventCount); + if (eventCount) in.read(reinterpret_cast(candidate.cutscene.events.data()), eventCount * sizeof(CutsceneEvent)); + candidate.cutscene.flags = h.version >= 4 ? h.cutsceneFlags : 0; + for (size_t i = 0; i < stringCount; ++i) { + char bytes[CUTSCENE_STRING_BYTES]{}; + if (!in.read(bytes, sizeof(bytes))) { error = "Обрезанная строка кат-сцены"; return false; } + const char* end = static_cast(std::memchr(bytes, 0, sizeof(bytes))); + if (!end) { error = "Строка кат-сцены не имеет завершающего нуля"; return false; } + candidate.cutscene.strings.push_back(CutsceneDecode(bytes, static_cast(end - bytes))); + } + if (!in) { error = "Не удалось прочитать карту целиком"; return false; } + if (h.version == 1) for (auto& sprite : candidate.sprites) { sprite.x >>= 16; sprite.y >>= 16; } + if (!ValidateLevel(candidate, error)) return false; + result = std::move(candidate); + return true; +} diff --git a/editor/src/main.cpp b/editor/src/main.cpp index 53609fe..1cb101c 100644 --- a/editor/src/main.cpp +++ b/editor/src/main.cpp @@ -6,9 +6,14 @@ #include #include +#include + // Forward declare message handler from imgui_impl_win32.cpp extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); +// Global Application Instance (for Drag & Drop messages) +static EditorApp* g_pApp = nullptr; + // Global DirectX 11 Data static ID3D11Device* g_pd3dDevice = nullptr; static ID3D11DeviceContext* g_pd3dDeviceContext = nullptr; @@ -87,6 +92,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); + DragAcceptFiles(hWnd, TRUE); IMGUI_CHECKVERSION(); ImGui::CreateContext(); @@ -135,6 +141,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); EditorApp app; + app.LoadLevel(app.currentFilePath); + app.InitD3D(g_pd3dDevice); + g_pApp = &app; bool done = false; while (!done) { @@ -161,6 +170,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine g_pSwapChain->Present(1, 0); // V-Sync enabled for 60 FPS } + g_pApp = nullptr; + app.ShutdownD3D(); + ImGui_ImplDX11_Shutdown(); ImGui_ImplWin32_Shutdown(); ImGui::DestroyContext(); @@ -227,6 +239,15 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { return true; switch (msg) { + case WM_DROPFILES: { + HDROP hDrop = reinterpret_cast(wParam); + char filePath[MAX_PATH]; + if (DragQueryFileA(hDrop, 0, filePath, MAX_PATH)) { + if (g_pApp) g_pApp->HandleDropFile(filePath); + } + DragFinish(hDrop); + return 0; + } case WM_SIZE: if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) { CleanupRenderTarget(); diff --git a/editor/src/preview_protocol.h b/editor/src/preview_protocol.h new file mode 100644 index 0000000..ce474c3 --- /dev/null +++ b/editor/src/preview_protocol.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include "level_format.h" + +// Single producer/consumer mailbox, shared by the x64 editor and x86 engine. +// state: 0 ready, 1 request owned by engine, 2 result owned by editor, 3 quit. +// Never modify payload while state == 1. All fields have fixed wire widths. +struct EnginePreviewPacket { + uint32_t magic = 0x56504245; // EBPV + uint32_t version = 1; + volatile long state = 0; + uint32_t parentPid = 0; + int32_t x = 160, y = 160, angle = 0; + uint32_t ceiling = 0, floor = 0, spriteCount = 0; + uint32_t cinematic = 0, fade = 0, textureRevision = 0; + uint32_t reserved[19]{}; + uint8_t cells[1024]{}; + SpriteEntry sprites[32]{}; + char subtitle[96]{}; + uint32_t textures[16*128*128]{}; + uint32_t pixels[320*240]{}; +}; +static_assert(sizeof(long) == 4, "Preview protocol requires Windows LONG"); +static_assert(offsetof(EnginePreviewPacket, cells) == 128, "Preview header mismatch"); +static_assert(offsetof(EnginePreviewPacket, textures) == 2016, "Preview texture offset mismatch"); +static_assert(offsetof(EnginePreviewPacket, pixels) == 1050592, "Preview framebuffer offset mismatch"); +static_assert(sizeof(EnginePreviewPacket) == 1357792, "Preview mapping size mismatch"); diff --git a/editor/src/stb_image.h b/editor/src/stb_image.h new file mode 100644 index 0000000..9eedabe --- /dev/null +++ b/editor/src/stb_image.h @@ -0,0 +1,7988 @@ +/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.30 (2024-05-31) avoid erroneous gcc warning + 2.29 (2023-05-xx) optimizations + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two ints fits in a signed short, 0 on overflow. +static int stbi__mul2shorts_valid(int a, int b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) { + for (j=0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc) (i+1); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + stbi_uc x = stbi__get8(j->s); + while (x == 0xff) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); + } + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + int hit_zeof_once; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + if (!a->hit_zeof_once) { + // This is the first time we hit eof, insert 16 extra padding btis + // to allow us to keep going; if we actually consume any of them + // though, that is invalid data. This is caught later. + a->hit_zeof_once = 1; + a->num_bits += 16; // add 16 implicit zero bits + } else { + // We already inserted our extra 16 padding bits and are again + // out, this stream is actually prematurely terminated. + return -1; + } + } else { + stbi__fill_bits(a); + } + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + if (a->hit_zeof_once && a->num_bits < 16) { + // The first time we hit zeof, we inserted 16 extra zero bits into our bit + // buffer so the decoder can just do its speculative decoding. But if we + // actually consumed any of those bits (which is the case when num_bits < 16), + // the stream actually read past the end so it is malformed. + return stbi__err("unexpected end","Corrupt PNG"); + } + return 1; + } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (len > a->zout_end - zout) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + a->hit_zeof_once = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filter used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub +}; + +static int stbi__paeth(int a, int b, int c) +{ + // This formulation looks very different from the reference in the PNG spec, but is + // actually equivalent and has favorable data dependencies and admits straightforward + // generation of branch-free code, which helps performance significantly. + int thresh = c*3 - (a + b); + int lo = a < b ? a : b; + int hi = a < b ? b : a; + int t0 = (hi <= thresh) ? lo : c; + int t1 = (thresh <= lo) ? hi : t0; + return t1; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// adds an extra all-255 alpha channel +// dest == src is legal +// img_n must be 1 or 3 +static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) +{ + int i; + // must process data backwards since we allow dest==src + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + dest[i*2+1] = 255; + dest[i*2+0] = src[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + dest[i*4+3] = 255; + dest[i*4+2] = src[i*3+2]; + dest[i*4+1] = src[i*3+1]; + dest[i*4+0] = src[i*3+0]; + } + } +} + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16 ? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + stbi_uc *filter_buf; + int all_ok = 1; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + // note: error exits here don't need to clean up a->out individually, + // stbi__do_png always does on error. + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + // Allocate two scan lines worth of filter workspace buffer. + filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); + if (!filter_buf) return stbi__err("outofmem", "Out of memory"); + + // Filtering for low-bit-depth images + if (depth < 8) { + filter_bytes = 1; + width = img_width_bytes; + } + + for (j=0; j < y; ++j) { + // cur/prior filter buffers alternate + stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; + stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; + stbi_uc *dest = a->out + stride*j; + int nk = width * filter_bytes; + int filter = *raw++; + + // check filter type + if (filter > 4) { + all_ok = stbi__err("invalid filter","Corrupt PNG"); + break; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // perform actual filtering + switch (filter) { + case STBI__F_none: + memcpy(cur, raw, nk); + break; + case STBI__F_sub: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); + break; + case STBI__F_up: + for (k = 0; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); + break; + case STBI__F_paeth: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); + break; + case STBI__F_avg_first: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); + break; + } + + raw += nk; + + // expand decoded bits in cur to dest, also adding an extra alpha channel if desired + if (depth < 8) { + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + stbi_uc *in = cur; + stbi_uc *out = dest; + stbi_uc inb = 0; + stbi__uint32 nsmp = x*img_n; + + // expand bits to bytes first + if (depth == 4) { + for (i=0; i < nsmp; ++i) { + if ((i & 1) == 0) inb = *in++; + *out++ = scale * (inb >> 4); + inb <<= 4; + } + } else if (depth == 2) { + for (i=0; i < nsmp; ++i) { + if ((i & 3) == 0) inb = *in++; + *out++ = scale * (inb >> 6); + inb <<= 2; + } + } else { + STBI_ASSERT(depth == 1); + for (i=0; i < nsmp; ++i) { + if ((i & 7) == 0) inb = *in++; + *out++ = scale * (inb >> 7); + inb <<= 1; + } + } + + // insert alpha=255 values if desired + if (img_n != out_n) + stbi__create_png_alpha_expand8(dest, dest, x, img_n); + } else if (depth == 8) { + if (img_n == out_n) + memcpy(dest, cur, x*img_n); + else + stbi__create_png_alpha_expand8(dest, cur, x, img_n); + } else if (depth == 16) { + // convert the image data from big-endian to platform-native + stbi__uint16 *dest16 = (stbi__uint16*)dest; + stbi__uint32 nsmp = x*img_n; + + if (img_n == out_n) { + for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) + *dest16 = (cur[0] << 8) | cur[1]; + } else { + STBI_ASSERT(img_n+1 == out_n); + if (img_n == 1) { + for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = 0xffff; + } + } else { + STBI_ASSERT(img_n == 3); + for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = (cur[2] << 8) | cur[3]; + dest16[2] = (cur[4] << 8) | cur[5]; + dest16[3] = 0xffff; + } + } + } + } + } + + STBI_FREE(filter_buf); + if (!all_ok) return 0; + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } + if (z->depth == 16) { + for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning + tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n && k < 3; ++k) + tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/editor/src/stb_image_write.h b/editor/src/stb_image_write.h new file mode 100644 index 0000000..e4b32ed --- /dev/null +++ b/editor/src/stb_image_write.h @@ -0,0 +1,1724 @@ +/* stb_image_write - v1.16 - public domain - http://nothings.org/stb + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk + + Before #including, + + #define STB_IMAGE_WRITE_IMPLEMENTATION + + in the file that you want to have the implementation. + + Will probably not work correctly with strict-aliasing optimizations. + +ABOUT: + + This header file is a library for writing images to C stdio or a callback. + + The PNG output is not optimal; it is 20-50% larger than the file + written by a decent optimizing implementation; though providing a custom + zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. + +BUILDING: + + You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. + You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace + malloc,realloc,free. + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), + +UNICODE: + + If compiling for Windows and you wish to use Unicode filenames, compile + with + #define STBIW_WINDOWS_UTF8 + and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert + Windows wchar_t filenames to utf8. + +USAGE: + + There are five functions, one for each image file format: + + int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically + + There are also five equivalent functions that use an arbitrary write function. You are + expected to open/close your file-equivalent before and after calling these: + + int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); + int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + + where the callback is: + void stbi_write_func(void *context, void *data, int size); + + You can configure it with these global variables: + int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE + int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression + int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. + + Each function returns 0 on failure and non-0 on success. + + The functions create an image file defined by the parameters. The image + is a rectangle of pixels stored from left-to-right, top-to-bottom. + Each pixel contains 'comp' channels of data stored interleaved with 8-bits + per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is + monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. + The *data pointer points to the first byte of the top-left-most pixel. + For PNG, "stride_in_bytes" is the distance in bytes from the first byte of + a row of pixels to the first byte of the next row of pixels. + + PNG creates output files with the same number of components as the input. + The BMP format expands Y to RGB in the file format and does not + output alpha. + + PNG supports writing rectangles of data even when the bytes storing rows of + data are not consecutive in memory (e.g. sub-rectangles of a larger image), + by supplying the stride between the beginning of adjacent rows. The other + formats do not. (Thus you cannot write a native-format BMP through the BMP + writer, both because it is in BGR order and because it may have padding + at the end of the line.) + + PNG allows you to set the deflate compression level by setting the global + variable 'stbi_write_png_compression_level' (it defaults to 8). + + HDR expects linear float data. Since the format is always 32-bit rgb(e) + data, alpha (if provided) is discarded, and for monochrome data it is + replicated across all three channels. + + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + JPEG does ignore alpha channels in input data; quality is between 1 and 100. + Higher quality looks better but results in a bigger image. + JPEG baseline (no JPEG progressive). + +CREDITS: + + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + + bugfixes: + github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + Andrew Kensler + +LICENSE + + See end of file for license information. + +*/ + +#ifndef INCLUDE_STB_IMAGE_WRITE_H +#define INCLUDE_STB_IMAGE_WRITE_H + +#include + +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else +#ifdef __cplusplus +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif +#endif + +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +STBIWDEF int stbi_write_tga_with_rle; +STBIWDEF int stbi_write_png_compression_level; +STBIWDEF int stbi_write_force_png_filter; +#endif + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); + +#ifdef STBIW_WINDOWS_UTF8 +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif +#endif + +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + +#endif//INCLUDE_STB_IMAGE_WRITE_H + +#ifdef STB_IMAGE_WRITE_IMPLEMENTATION + +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + +#include +#include +#include +#include + +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) +// ok +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." +#endif + +#ifndef STBIW_MALLOC +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#endif + + +#ifndef STBIW_MEMMOVE +#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) +#endif + + +#ifndef STBIW_ASSERT +#include +#define STBIW_ASSERT(x) assert(x) +#endif + +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +static int stbi__flip_vertically_on_write = 0; + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; + unsigned char buffer[64]; + int buf_used; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) +#ifdef __cplusplus +#define STBIW_EXTERN extern "C" +#else +#define STBIW_EXTERN extern +#endif +STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); + +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbiw__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f = stbiw__fopen(filename, "wb"); + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } + default: + STBIW_ASSERT(0); + return; + } + } +} + +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__write_flush(stbi__write_context *s) +{ + if (s->buf_used) { + s->func(s->context, &s->buffer, s->buf_used); + s->buf_used = 0; + } +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write1(stbi__write_context *s, unsigned char a) +{ + if ((size_t)s->buf_used + 1 > sizeof(s->buffer)) + stbiw__write_flush(s); + s->buffer[s->buf_used++] = a; +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) +{ + int n; + if ((size_t)s->buf_used + 3 > sizeof(s->buffer)) + stbiw__write_flush(s); + n = s->buf_used; + s->buf_used = n+3; + s->buffer[n+0] = a; + s->buffer[n+1] = b; + s->buffer[n+2] = c; +} + +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + stbiw__write1(s, d[comp - 1]); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + stbiw__write1(s, d[0]); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + stbiw__write1(s, d[comp - 1]); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ + stbiw_uint32 zero = 0; + int i,j, j_end; + + if (y <= 0) + return; + + if (stbi__flip_vertically_on_write) + vdir *= -1; + + if (vdir < 0) { + j_end = -1; j = y-1; + } else { + j_end = y; j = 0; + } + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); + } + stbiw__write_flush(s); + s->func(s->context, &zero, scanline_pad); + } +} + +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +{ + if (y < 0 || x < 0) { + return 0; + } else { + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; + } +} + +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) +{ + if (comp != 4) { + // write RGB bitmap + int pad = (-x*3) & 3; + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header + } else { + // RGBA bitmaps need a v4 header + // use BI_BITFIELDS mode with 32bpp and alpha mask + // (straight BI_RGB with alpha mask doesn't work in most readers) + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0, + "11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444", + 'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header + 108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header + } +} + +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) +{ + int has_alpha = (comp == 2 || comp == 4); + int colorbytes = has_alpha ? comp-1 : comp; + int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + stbiw__write1(s, header); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + stbiw__write1(s, header); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + stbiw__write_flush(s); + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR writer +// by Baldur Karlsson + +#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) + +#ifndef STBI_WRITE_NO_STDIO + +static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) +{ + int exponent; + float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); + + if (maxcomp < 1e-32f) { + rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; + } else { + float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; + + rgbe[0] = (unsigned char)(linear[0] * normalize); + rgbe[1] = (unsigned char)(linear[1] * normalize); + rgbe[2] = (unsigned char)(linear[2] * normalize); + rgbe[3] = (unsigned char)(exponent + 128); + } +} + +static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) +{ + unsigned char lengthbyte = STBIW_UCHAR(length+128); + STBIW_ASSERT(length+128 <= 255); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); +} + +static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) +{ + unsigned char lengthbyte = STBIW_UCHAR(length); + STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); +} + +static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) +{ + unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; + unsigned char rgbe[4]; + float linear[3]; + int x; + + scanlineheader[2] = (width&0xff00)>>8; + scanlineheader[3] = (width&0x00ff); + + /* skip RLE for images too small or large */ + if (width < 8 || width >= 32768) { + for (x=0; x < width; x++) { + switch (ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + s->func(s->context, rgbe, 4); + } + } else { + int c,r; + /* encode into scratch buffer */ + for (x=0; x < width; x++) { + switch(ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + scratch[x + width*0] = rgbe[0]; + scratch[x + width*1] = rgbe[1]; + scratch[x + width*2] = rgbe[2]; + scratch[x + width*3] = rgbe[3]; + } + + s->func(s->context, scanlineheader, 4); + + /* RLE each component separately */ + for (c=0; c < 4; c++) { + unsigned char *comp = &scratch[width*c]; + + x = 0; + while (x < width) { + // find first run + r = x; + while (r+2 < width) { + if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) + break; + ++r; + } + if (r+2 >= width) + r = width; + // dump up to first run + while (x < r) { + int len = r-x; + if (len > 128) len = 128; + stbiw__write_dump_data(s, len, &comp[x]); + x += len; + } + // if there's a run, output it + if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd + // find next byte after run + while (r < width && comp[r] == comp[x]) + ++r; + // output run up to r + while (x < r) { + int len = r-x; + if (len > 127) len = 127; + stbiw__write_run_data(s, len, comp[x]); + x += len; + } + } + } + } + } +} + +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) +{ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. + unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef __STDC_LIB_EXT1__ + len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + + for(i=0; i < y; i++) + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); + STBIW_FREE(scratch); + return 1; + } +} + +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS +// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() +#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) +#define stbiw__sbm(a) stbiw__sbraw(a)[0] +#define stbiw__sbn(a) stbiw__sbraw(a)[1] + +#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) +#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) +#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) +#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) +#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) + +static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) +#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) +// default huffman tables +#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) +#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) +#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) +#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) +#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) +#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) + +#define stbiw__ZHASH 16384 + +#endif // STBIW_ZLIB_COMPRESS + +STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw__sbpush(out, 0x78); // DEFLATE 32K window + stbiw__sbpush(out, 0x5e); // FLEVEL = 1 + stbiw__zlib_add(1,1); // BFINAL = 1 + stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbiw__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) { best=d; bestloc=hlist[j]; } + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw__sbn(hash_table[h]) = quality; + } + stbiw__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); + hlist = hash_table[h]; + n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); // distance back + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw__zlib_huff(j+257); + if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); + if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbiw__zlib_huffb(data[i]); + stbiw__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbiw__zlib_add(0,1); + + for (i=0; i < stbiw__ZHASH; ++i) + (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + // store uncompressed instead if compression was worse + if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) { + stbiw__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1 + for (j = 0; j < data_len;) { + int blocklen = data_len - j; + if (blocklen > 32767) blocklen = 32767; + stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression + stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN + stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN + stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8)); + memcpy(out+stbiw__sbn(out), data+j, blocklen); + stbiw__sbn(out) += blocklen; + j += blocklen; + } + } + + { + // compute adler32 on input + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } + s1 %= 65521; s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw__sbn(out); + // make returned pointer freeable + STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); + return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ +#ifdef STBIW_CRC32 + return STBIW_CRC32(buffer, len); +#else + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +#endif +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + + if (type==0) { + memcpy(line_buffer, z, width*n); + return; + } + + // first loop isn't optimized since it's just one pixel + for (i = 0; i < n; ++i) { + switch (type) { + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + switch (type) { + case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; + case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } +} + +STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = stbi_write_force_png_filter; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); + STBIW_FREE(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); // header length + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + + f = stbiw__fopen(filename, "wb"); + if (!f) { STBIW_FREE(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + STBIW_FREE(png); + return 1; +} +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k, subsample; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + subsample = quality <= 90 ? 1 : 0; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + const unsigned char *dataR = (const unsigned char *)data; + const unsigned char *dataG = dataR + ofsG; + const unsigned char *dataB = dataR + ofsB; + int x, y, pos; + if(subsample) { + for(y = 0; y < height; y += 16) { + for(x = 0; x < width; x += 16) { + float Y[256], U[256], V[256]; + for(row = y, pos = 0; row < y+16; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+16; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + + // subsample U,V + { + float subU[64], subV[64]; + int yy, xx; + for(yy = 0, pos = 0; yy < 8; ++yy) { + for(xx = 0; xx < 8; ++xx, ++pos) { + int j = yy*32+xx*2; + subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; + subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; + } + } + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + } else { + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float Y[64], U[64], V[64]; + for(row = y, pos = 0; row < y+8; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+8; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + 1.16 (2021-07-11) + make Deflate code emit uncompressed blocks when it would otherwise expand + support writing BMPs with alpha channel + 1.15 (2020-07-13) unknown + 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels + 1.13 + 1.12 + 1.11 (2019-08-11) + + 1.10 (2019-02-07) + support utf8 filenames in Windows; fix warnings and platform ifdefs + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support + 0.98 (2015-04-08) + added STBIW_MALLOC, STBIW_ASSERT etc + 0.97 (2015-01-18) + fixed HDR asserts, rewrote HDR rle logic + 0.96 (2015-01-17) + add HDR output + fix monochrome BMP + 0.95 (2014-08-17) + add monochrome TGA output + 0.94 (2014-05-31) + rename private functions to avoid conflicts with stb_image.h + 0.93 (2014-05-27) + warning fixes + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/engine.exe b/engine.exe index 1ffc223f4c0edfeaf2b2d54bc520f66fb2ba45e8..a4ffc6093d87d8e4d32aedd847624fceb2fd24a5 100644 GIT binary patch literal 20480 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%0DS`o<`kf-#xKeyU8N6Wt_JX=n`Wq4dr1)+5@9 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 X@;rjQ?BZb}0{$Ml{shB+%*6i&U(pa{ literal 12288 zcmeHNe{@vUoxhXGgb@QXB510pPY!4_h%-qblbJ*(Ft>!2afkd6L?Q`fbP__6lgwze zGmto>C)39->1nGy)+GyFspV95m)hXrY$qX-VB^_9sheu*i8iZGlb*&UTLzdq`}yAY zCW#fbyMOHVob82oe|+!vet+HX_rC9a6ZgjbOwSlg#gj-d)`gaeQ`BEx4PtukZLiH` z$FF(w_AcGpH*YWV)ig_uO%0DXRc)8HR@K)x_@ymgsVPt|)znL_zb%!vH&lC<&6zWM zu}1pdT+8sb@<;b2pLypu@7*HCoA))Nz4UIy-dfRa5^YJ%Rv+Phkz^ju*jimGyUB94 zHiCs<%e@PZ7m&e1sanHK-CrGM@JO1mjx83of<)JlB_UkJ{bK20pvv5yG8fVjkPhG62 z?GkNu@XgH+Z#Z)bRMwS*Lq^?>C7p+hovbFh{lU{khI}~KAsTlp=A3gE14g-LlcU(AaIDmmcOoT7Z^`~oVU%;Xipk(a$ z=(HgnD6>u*OlmX7%vtJb!;NY)hz4`#)n?CipnTe}S8ev8F`PE+S4YoM(`PsW6CQ*Z zeTJh`y<_N6=`$FyMO3g8v=OjLIL3mD!Z9gyi(H-_zRZFP!k49xx%+*Ce$e#lGo+-j zC8?&_Tw5j4s++Y{*VC%GV%4{}xkFo*PFtj+`{#yZY5r@vR64Y+w7HlL_r^-sm2{Gf zOA?rs7q*iJZF{Gn`-)kA3+dB+B`s1Bm($xj;7!}k6m(xQ>*tVq-IvlL?pPv#|8Zq0 zwmTd%1m@MIX%G(}8y|k;%qg%A%&9eK;QS<5a328oht}6JUn?}M)z`9Goe#ZM-><+x zNx2c8&g0=wJYm{Z3Gr v<`5-m!fnz(Y*w=z#Z-$Nef4%L!>!|?`lKR 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 Zv%BnnWB1q}vTw3)vHR@x_Wzj!{THg!b>08~ diff --git a/examples/cutscene_demo/README.md b/examples/cutscene_demo/README.md new file mode 100644 index 0000000..036e4e3 --- /dev/null +++ b/examples/cutscene_demo/README.md @@ -0,0 +1,15 @@ +# Пример кат-сцены + +Запустите `run_demo.bat` после сборки движка. Вступление длится около 10 секунд: +камера проходит три отрезка, поворачивается, показывает русские субтитры, +проигрывает WAV и с затемнением переходит во вторую комнату. Tab пропускает сцену, +C запускает её повторно на карте, где она есть. Во второй комнате работает обычное управление. + +Для редактирования откройте `assets/map.dat` этой папки в EblanStudio (Ctrl+O), +затем откройте таймлайн клавишей F6. Выберите команду в списке или ромб на дорожке. +F5 использует временную копию карт и звуков. Исходные карты основного проекта этот пример не меняет. + +Файлы примера можно восстановить командой `python tools/make_cutscene_demo.py` +из корня репозитория. Предпросмотр в редакторе показывает сцену глазами камеры +в игровом виде, а на карте — её траекторию. Ползунок кадра перематывает изображение. +F5 запускает полную последовательность со сменой комнаты. diff --git a/examples/cutscene_demo/assets/map.dat b/examples/cutscene_demo/assets/map.dat new file mode 100644 index 0000000000000000000000000000000000000000..8fb5a90e2c2566cf681acf07c7bc054a2a99bba2 GIT binary patch literal 1664 zcmZ>D^6_I~Pyj+^AY@=*V(_pqV31JIU|?k61Bx&L#TXbE2?4Mw1OYM$2{1xTL5R>! zo*irncJm=}AO+aviFO|sIrgPn!Q%@3Fu7(jAdXyW`F#i_~pc`5Nl`T4neDTyU0-T`qSr47g=b_M|ySx7#y zfs3(0%OIEl6N3WCRv>o^5Q{LdfF*jsBuI>zp#jK_g7YEjL3%*yKLFJOnGCC-@)?Yf zyaZF9!3b0j6oRQg#K;O&387?|Ant{^FM^2!MLrT_I1)JZ;FIphZ%^Mouu^#S;LXzy z4|EhhJ$?1@lfnyy=Z`+WLQ+W{GdUwOH&w4Zv5Y+J1a*ZZCMir;c>m$u`_CUgz4-J; pPvQK#kFTGCL|*Us^Z+RLdiUn-gHI3i2%3nh007_dR#yN3 literal 0 HcmV?d00001 diff --git a/examples/cutscene_demo/assets/second_room.dat b/examples/cutscene_demo/assets/second_room.dat new file mode 100644 index 0000000000000000000000000000000000000000..8940b4464c90224fa6115f33b3c94f6b0cb15c3f GIT binary patch literal 1152 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' + je cs_sound_invalid + cmp al, '|' + je cs_sound_invalid + inc ecx + cmp ecx, 64 + jb cs_sound_character +cs_sound_invalid: + xor eax, eax + ret +cs_sound_end: + cmp ecx, 5 + jb cs_sound_invalid + mov eax, [esi+ecx-4] + or eax, 20202000h + cmp eax, 7661772Eh + jne cs_sound_invalid + mov eax, 1 + ret +ValidateSoundFilename ENDP + +ValidateStagedCutscene PROC uses ebx ecx edx esi edi, eventCount:DWORD, stringCount:DWORD, flags:DWORD, cells:DWORD, transitions:DWORD + LOCAL previous:DWORD, eventIndex:DWORD + cmp eventCount, MAX_CUTSCENE_EVENTS + ja csv_invalid + cmp stringCount, MAX_CUTSCENE_STRINGS + ja csv_invalid + mov eax, flags + and eax, 0FFFFFFFEh + jnz csv_invalid + mov esi, OFFSET stagedCutsceneStrings + mov edx, stringCount +csv_next_string: + test edx, edx + jz csv_events + xor ecx, ecx +csv_string_char: + mov al, [esi+ecx] + test al, al + jz csv_string_end + cmp al, 10 + je csv_string_advance + cmp al, 32 + jb csv_invalid +csv_string_advance: + inc ecx + cmp ecx, CUTSCENE_STRING_BYTES + jb csv_string_char + jmp csv_invalid +csv_string_end: + add esi, CUTSCENE_STRING_BYTES + dec edx + jmp csv_next_string +csv_events: + mov esi, OFFSET stagedCutsceneEvents + mov previous, 0 + mov eventIndex, 0 +csv_event: + mov eax, eventIndex + cmp eax, eventCount + jae csv_finished + movzx eax, [esi].CutsceneEvent.tickTimestamp + cmp eax, previous + jb csv_invalid + mov previous, eax + movzx eax, [esi].CutsceneEvent.opCode + cmp eax, OP_CHANGE_SUBLEVEL + ja csv_invalid + movzx edx, [esi].CutsceneEvent.param8 + cmp eax, OP_PLAY_SOUND + je csv_sound_flags + test edx, edx + jnz csv_invalid + jmp csv_dispatch +csv_sound_flags: + cmp edx, 1 + ja csv_invalid +csv_dispatch: + cmp eax, OP_END + je csv_end + cmp eax, OP_WAIT + je csv_wait + cmp eax, OP_MOVE_CAM_TO + je csv_move + cmp eax, OP_PAN_CAM_TO + je csv_pan + cmp eax, OP_FADE_SCREEN + je csv_fade + cmp eax, OP_SHOW_SUBTITLE + je csv_text + cmp eax, OP_PLAY_SOUND + je csv_sound + cmp eax, OP_CHANGE_SUBLEVEL + je csv_transition + jmp csv_next +csv_end: + mov eax, eventIndex + inc eax + cmp eax, eventCount + jne csv_invalid + jmp csv_next +csv_wait: + mov eax, [esi].CutsceneEvent.paramA + cmp eax, CUTSCENE_MAX_DURATION + ja csv_invalid + jmp csv_next +csv_move: + mov eax, [esi].CutsceneEvent.paramA + cmp eax, MAP_W*CELL_SIZE + jae csv_invalid + mov ebx, [esi].CutsceneEvent.paramB + cmp ebx, MAP_H*CELL_SIZE + jae csv_invalid + shr eax, CELL_SHIFT + shr ebx, CELL_SHIFT + shl ebx, 5 + add ebx, eax + add ebx, cells + mov al, [ebx] + cmp al, CELL_EMPTY + je csv_move_duration + cmp al, CELL_DOOR_OPEN + je csv_move_duration + cmp al, CELL_PORTAL + jne csv_invalid +csv_move_duration: + mov eax, [esi].CutsceneEvent.dataId + cmp eax, CUTSCENE_MAX_DURATION + ja csv_invalid + jmp csv_next +csv_pan: + cmp [esi].CutsceneEvent.paramA, ANGLE_MASK + ja csv_invalid + jmp csv_duration +csv_fade: + cmp [esi].CutsceneEvent.paramA, 16 + ja csv_invalid + jmp csv_duration +csv_text: + mov eax, [esi].CutsceneEvent.paramA + cmp eax, stringCount + jae csv_invalid +csv_duration: + cmp [esi].CutsceneEvent.paramB, CUTSCENE_MAX_DURATION + ja csv_invalid + jmp csv_next +csv_sound: + mov eax, [esi].CutsceneEvent.paramA + cmp eax, -1 + je csv_next + cmp eax, stringCount + jae csv_invalid + imul eax, CUTSCENE_STRING_BYTES + add eax, OFFSET stagedCutsceneStrings + invoke ValidateSoundFilename, eax + test eax, eax + jz csv_invalid + jmp csv_next +csv_transition: + mov eax, [esi].CutsceneEvent.paramA + cmp eax, transitions + jae csv_invalid +csv_next: + movzx eax, [esi].CutsceneEvent.opCode + xor ebx, ebx + cmp eax, OP_MOVE_CAM_TO + jne csv_span_not_move + mov ebx, [esi].CutsceneEvent.dataId + jmp csv_check_span +csv_span_not_move: + cmp eax, OP_WAIT + jne csv_span_not_wait + mov ebx, [esi].CutsceneEvent.paramA + jmp csv_check_span +csv_span_not_wait: + cmp eax, OP_PAN_CAM_TO + je csv_span_param_b + cmp eax, OP_FADE_SCREEN + je csv_span_param_b + cmp eax, OP_SHOW_SUBTITLE + jne csv_check_span +csv_span_param_b: + mov ebx, [esi].CutsceneEvent.paramB +csv_check_span: + movzx eax, [esi].CutsceneEvent.tickTimestamp + add eax, ebx + cmp eax, 65535 + ja csv_invalid + add esi, sizeof CutsceneEvent + inc eventIndex + jmp csv_event +csv_finished: + cmp eventCount, 0 + je csv_valid + cmp BYTE PTR [esi-sizeof CutsceneEvent+CutsceneEvent.opCode], OP_END + jne csv_invalid +csv_valid: + mov eax, 1 + ret +csv_invalid: + xor eax, eax + ret +ValidateStagedCutscene ENDP + +StopCutscene PROC uses eax ebx + mov isCutsceneActive, 0 + mov cutscenePending, 0 + mov cutsceneSubtitle, -1 + mov cutsceneSubtitleUntil, 0 + mov cutsceneFade, 0 + mov csMoveDuration, 0 + mov csAngleDuration, 0 + mov csFadeDuration, 0 + mov cutsceneWait, 0 + mov eax, playerY + sar eax, CELL_SHIFT + shl eax, 5 + mov ebx, playerX + sar ebx, CELL_SHIFT + add eax, ebx + mov portalLatchCell, eax + invoke PlaySoundA, 0, 0, 0 + ret +StopCutscene ENDP + +StartCutscene PROC + mov cutscenePending, 0 + cmp cutsceneCount, 0 + je cs_start_empty + call StopCutscene + mov cutsceneTick, 0 + mov cutsceneIndex, 0 + mov isCutsceneActive, 1 + mov eax, 1 + ret +cs_start_empty: + xor eax, eax + ret +StartCutscene ENDP + +UpdateCutscene PROC uses ebx ecx edx esi edi + LOCAL transitionFade:DWORD + cmp isCutsceneActive, 0 + je cs_update_done + cmp csMoveDuration, 0 + je cs_step_angle + inc csMoveElapsed + mov eax, csMoveToX + sub eax, csMoveFromX + imul csMoveElapsed + idiv csMoveDuration + add eax, csMoveFromX + mov playerX, eax + mov eax, csMoveToY + sub eax, csMoveFromY + imul csMoveElapsed + idiv csMoveDuration + add eax, csMoveFromY + mov playerY, eax + mov eax, csMoveElapsed + cmp eax, csMoveDuration + jb cs_step_angle + mov csMoveDuration, 0 +cs_step_angle: + cmp csAngleDuration, 0 + je cs_step_fade + inc csAngleElapsed + mov eax, csAngleDelta + imul csAngleElapsed + idiv csAngleDuration + add eax, csAngleFrom + and eax, ANGLE_MASK + mov playerAngle, eax + mov eax, csAngleElapsed + cmp eax, csAngleDuration + jb cs_step_fade + mov csAngleDuration, 0 +cs_step_fade: + cmp csFadeDuration, 0 + je cs_subtitle_expiry + inc csFadeElapsed + mov eax, csFadeTo + sub eax, csFadeFrom + imul csFadeElapsed + idiv csFadeDuration + add eax, csFadeFrom + mov cutsceneFade, eax + mov eax, csFadeElapsed + cmp eax, csFadeDuration + jb cs_subtitle_expiry + mov csFadeDuration, 0 +cs_subtitle_expiry: + cmp cutsceneSubtitleUntil, 0 + je cs_step_wait + mov eax, cutsceneTick + cmp eax, cutsceneSubtitleUntil + jb cs_step_wait + mov cutsceneSubtitle, -1 + mov cutsceneSubtitleUntil, 0 +cs_step_wait: + cmp cutsceneWait, 0 + je cs_dispatch + dec cutsceneWait + jnz cs_advance_tick +cs_dispatch: + mov eax, cutsceneIndex + cmp eax, cutsceneCount + jae cs_advance_tick + shl eax, 4 + add eax, OFFSET cutsceneEvents + mov esi, eax + movzx eax, [esi].CutsceneEvent.tickTimestamp + cmp eax, cutsceneTick + ja cs_advance_tick + inc cutsceneIndex + movzx eax, [esi].CutsceneEvent.opCode + cmp eax, OP_END + je cs_end + cmp eax, OP_WAIT + je cs_wait + cmp eax, OP_MOVE_CAM_TO + je cs_move + cmp eax, OP_PAN_CAM_TO + je cs_pan + cmp eax, OP_SHOW_SUBTITLE + je cs_text + cmp eax, OP_HIDE_SUBTITLE + je cs_hide_text + cmp eax, OP_PLAY_SOUND + je cs_play_sound + cmp eax, OP_FADE_SCREEN + je cs_fade + cmp eax, OP_CHANGE_SUBLEVEL + je cs_change_level + jmp cs_end +cs_wait: + mov eax, [esi].CutsceneEvent.paramA + mov cutsceneWait, eax + test eax, eax + jnz cs_advance_tick + jmp cs_dispatch +cs_move: + mov eax, playerX + mov csMoveFromX, eax + mov eax, playerY + mov csMoveFromY, eax + mov eax, [esi].CutsceneEvent.paramA + mov csMoveToX, eax + mov eax, [esi].CutsceneEvent.paramB + mov csMoveToY, eax + mov eax, [esi].CutsceneEvent.dataId + mov csMoveDuration, eax + mov csMoveElapsed, 0 + test eax, eax + jnz cs_dispatch + mov eax, csMoveToX + mov playerX, eax + mov eax, csMoveToY + mov playerY, eax + jmp cs_dispatch +cs_pan: + mov eax, playerAngle + mov csAngleFrom, eax + mov ebx, [esi].CutsceneEvent.paramA + sub ebx, eax + add ebx, 256 + and ebx, ANGLE_MASK + sub ebx, 256 + mov csAngleDelta, ebx + mov csAngleElapsed, 0 + mov eax, [esi].CutsceneEvent.paramB + mov csAngleDuration, eax + test eax, eax + jnz cs_dispatch + mov eax, [esi].CutsceneEvent.paramA + mov playerAngle, eax + jmp cs_dispatch +cs_text: + mov eax, [esi].CutsceneEvent.paramA + mov cutsceneSubtitle, eax + mov eax, [esi].CutsceneEvent.paramB + test eax, eax + jz cs_text_expiry_ready + add eax, cutsceneTick +cs_text_expiry_ready: + mov cutsceneSubtitleUntil, eax + jmp cs_dispatch +cs_hide_text: + mov cutsceneSubtitle, -1 + mov cutsceneSubtitleUntil, 0 + jmp cs_dispatch +cs_play_sound: + mov eax, [esi].CutsceneEvent.paramA + cmp eax, -1 + jne cs_sound_start + invoke PlaySoundA, 0, 0, 0 + jmp cs_dispatch +cs_sound_start: + imul eax, CUTSCENE_STRING_BYTES + add eax, OFFSET cutsceneStrings + push esi + mov esi, OFFSET csSoundPrefix + mov edi, OFFSET csSoundPath +cs_copy_sound_prefix: + lodsb + stosb + test al, al + jnz cs_copy_sound_prefix + dec edi + pop esi + mov eax, [esi].CutsceneEvent.paramA + imul eax, CUTSCENE_STRING_BYTES + add eax, OFFSET cutsceneStrings + mov ebx, esi + mov esi, eax +cs_copy_sound_name: + lodsb + stosb + test al, al + jnz cs_copy_sound_name + movzx eax, [ebx].CutsceneEvent.param8 + shl eax, 3 + or eax, 00020003h ; SND_FILENAME | SND_ASYNC | SND_NODEFAULT (+ SND_LOOP) + invoke PlaySoundA, OFFSET csSoundPath, 0, eax + jmp cs_dispatch +cs_fade: + mov eax, cutsceneFade + mov csFadeFrom, eax + mov eax, [esi].CutsceneEvent.paramA + mov csFadeTo, eax + mov eax, [esi].CutsceneEvent.paramB + mov csFadeDuration, eax + mov csFadeElapsed, 0 + test eax, eax + jnz cs_dispatch + mov eax, csFadeTo + mov cutsceneFade, eax + jmp cs_dispatch +cs_change_level: + mov eax, cutsceneFade + mov transitionFade, eax + mov ebx, [esi].CutsceneEvent.paramA + imul ebx, sizeof LevelTransition + add ebx, OFFSET transitionList + call StopCutscene + movzx eax, [ebx].LevelTransition.targetSpawnX + movzx ecx, [ebx].LevelTransition.targetSpawnY + movzx edx, [ebx].LevelTransition.targetAngle + movzx esi, [ebx].LevelTransition.fadeEffect + lea edi, [ebx].LevelTransition.targetMap + invoke SwitchSublevel, edi, eax, ecx, edx, esi + cmp fadeState, 1 + jne cs_transition_ready + mov eax, transitionFade + cmp eax, fadeLevel + jbe cs_transition_ready + mov fadeLevel, eax ; continue from the cinematic fade without flashing bright +cs_transition_ready: + ret +cs_end: + call StopCutscene + ret +cs_advance_tick: + inc cutsceneTick +cs_update_done: + ret +UpdateCutscene ENDP + +; Letterbox (320 / 2.35 -> 136-pixel picture) and up to three wrapped lines. +RenderCutsceneOverlay PROC uses ebx ecx edx esi edi + LOCAL row:DWORD, count:DWORD, pixelY:DWORD + invoke DrawRect, 0, 0, SCREEN_W, 52, COLOR_BLACK + invoke DrawRect, 0, 188, SCREEN_W, 52, COLOR_BLACK + invoke DrawString8x8, 232, 10, OFFSET strSkipScene, COLOR_GRAY + mov eax, cutsceneSubtitle + cmp eax, -1 + je cs_overlay_done + cmp eax, cutsceneStringCount + jae cs_overlay_done + imul eax, CUTSCENE_STRING_BYTES + add eax, OFFSET cutsceneStrings + mov esi, eax + ; Semitransparent subtitle panel over the bottom of the picture. + mov edi, OFFSET screenBuffer + 158*SCREEN_PITCH + mov ecx, 30*SCREEN_W +cs_subtitle_dim: + mov eax, [edi] + and eax, 00FEFEFEh + shr eax, 1 + stosd + loop cs_subtitle_dim + mov row, 0 +cs_subtitle_line: + mov edi, OFFSET csLineBuffer + mov count, 0 +cs_subtitle_char: + lodsb + test al, al + jz cs_subtitle_string_end + cmp al, 10 + je cs_subtitle_emit + stosb + inc count + cmp count, 38 + jb cs_subtitle_char + jmp cs_subtitle_emit +cs_subtitle_string_end: + dec esi +cs_subtitle_emit: + mov byte ptr [edi], 0 + mov eax, count + shl eax, 2 + mov ebx, SCREEN_HALF_W + sub ebx, eax + mov eax, row + imul eax, 10 + add eax, 160 + invoke DrawString8x8, ebx, eax, OFFSET csLineBuffer, COLOR_WHITE + cmp byte ptr [esi], 0 + je cs_overlay_done + inc row + cmp row, 3 + jb cs_subtitle_line +cs_overlay_done: + ret +RenderCutsceneOverlay ENDP + +ApplyCutsceneFade PROC uses ebx ecx edx esi edi + mov ebx, 16 + sub ebx, cutsceneFade + cmp ebx, 16 + jae cs_fade_done + mov edi, OFFSET screenBuffer + mov ecx, SCREEN_W*SCREEN_H +cs_fade_pixel: + mov eax, [edi] + movzx edx, al + imul edx, ebx + shr edx, 4 + movzx eax, ah + imul eax, ebx + shr eax, 4 + shl eax, 8 + or edx, eax + mov eax, [edi] + shr eax, 16 + imul eax, ebx + shr eax, 4 + shl eax, 16 + or eax, edx + stosd + loop cs_fade_pixel +cs_fade_done: + ret +ApplyCutsceneFade ENDP diff --git a/include/engine_data.inc b/include/engine_data.inc index 0e1303c..6f055bf 100644 --- a/include/engine_data.inc +++ b/include/engine_data.inc @@ -1,3 +1,8 @@ + +COMM screenBuffer:BYTE:FRAME_BUFFER_SIZE +COMM textureBuffer:BYTE:MAX_TEXTURES * TEX_SIZE_BYTES +COMM portalTextureBuffer:BYTE:TEX_SIZE_BYTES +COMM texturePackStaging:BYTE:MAX_TEXTURES * TEX_SIZE_BYTES ; ============================================================================== ; EBLAN ENGINE - Global State and Data Structures ; ============================================================================== @@ -47,11 +52,34 @@ keyAction db 0 keyRun db 0 keyShowMap db 1 ; minimap toggle keyScreenshot db 0 ; F12 screenshot request +keyActionHeld db 0 +keyMapHeld db 0 +keyShotHeld db 0 +keyCutscene db 0 +keySkipScene db 0 +keySceneHeld db 0 +keySkipHeld db 0 ; Map palette (overridable by map.dat header) mapCeilingColor dd COLOR_CEILING mapFloorColor dd COLOR_FLOOR szMapFilePath db "assets\map.dat",0 +szAssetsPrefix db "assets\",0 +startupMapPath db MAX_PATH_BYTES dup(0) +portalLatchCell dd -1 ; suppress repeated entry until the player leaves the cell +mapErrorFrames dd 0 + +; Sector Streaming & Portals +transitionCount dd 0 +pendingMapPath db 64 dup(0) +szSublevelFullPath db 80 dup(0) +pendingSpawnX dd 0 +pendingSpawnY dd 0 +pendingSpawnAngle dd 0 + +; Screen Fade Transition State Machine +fadeState dd 0 ; 0 = None, 1 = Fading Out, 2 = Black / Switching, 3 = Fading In +fadeLevel dd 0 ; 0..16 (0 = visible, 16 = black) ; Texture pack (optional; falls back to procedural textures) szTexPackPath db "assets\textures\texturepack.bin",0 @@ -63,9 +91,40 @@ spriteCount dd 0 ; Engine HUD & Strings strControls1 db "WASD: Move / Strafe | Shift: Run",0 strControls2 db "Arrows: Turn Camera",0 -strControls3 db "E: Door | M: Minimap | F12: Shot | Esc: Exit",0 +strControls3 db "E:Use C:Scene M:Map F12:Shot Esc:Exit",0 strEngineName db "EBLAN ENGINE 3D (x86 MASM)",0 strDoorHint db "[E] - Door",0 +strPortalHint db "[E] - Enter Portal",0 +strMapLoadError db "Cannot load destination level",0 +strSkipScene db "[Tab] Skip",0 +cutsceneCount dd 0 +cutsceneStringCount dd 0 +cutsceneFlags dd 0 +isCutsceneActive dd 0 +cutscenePending dd 0 +cutsceneTick dd 0 +cutsceneIndex dd 0 +cutsceneWait dd 0 +cutsceneSubtitle dd -1 +cutsceneSubtitleUntil dd 0 +cutsceneFade dd 0 +csMoveFromX dd 0 +csMoveFromY dd 0 +csMoveToX dd 0 +csMoveToY dd 0 +csMoveDuration dd 0 +csMoveElapsed dd 0 +csAngleFrom dd 0 +csAngleDelta dd 0 +csAngleDuration dd 0 +csAngleElapsed dd 0 +csFadeFrom dd 0 +csFadeTo dd 0 +csFadeDuration dd 0 +csFadeElapsed dd 0 +csSoundPrefix db "assets\sounds\",0 +csSoundPath db 128 dup(0) +csLineBuffer db 40 dup(0) ; Screenshot (F12): writes 32-bit top-down BMP of screenBuffer szScreenshotPath db "screenshot.bmp",0 @@ -88,22 +147,50 @@ screenshotHeader db 'B','M' ; ------------------------------------------------------------------------------ .data? ALIGN 4 -screenBuffer db FRAME_BUFFER_SIZE dup(?) +; (moved to COMM) + ALIGN 4 depthBuffer dd SCREEN_W dup(?) +; Glass (Transparent Wall) per-column buffers +ALIGN 4 +glassDistBuffer dd SCREEN_W dup(?) +glassDrawStartBuf dd SCREEN_W dup(?) +glassDrawEndBuf dd SCREEN_W dup(?) +glassLineHeightBuf dd SCREEN_W dup(?) +glassTexXBuf dd SCREEN_W dup(?) +glassSideHitBuf dd SCREEN_W dup(?) + ; Fixed-point Math Lookup Tables (512 angles, 16.16 signed fixed point) ALIGN 4 tableSin dd ANGLE_512 dup(?) tableCos dd ANGLE_512 dup(?) +ALIGN 4 +tableRayAngleOffset dd SCREEN_W dup(?) +ALIGN 4 +tableRayCos dd SCREEN_W dup(?) ; Game Map Grid (32x32 = 1024 bytes) gameMap db MAP_SIZE dup(?) ; Texture Memory (16 slots of 128x128 32-bit BGRA = 1 MB) ALIGN 4 -textureBuffer db MAX_TEXTURES * TEX_SIZE_BYTES dup(?) +; (moved to COMM) + +; (moved to COMM) + +; (moved to COMM) + ALIGN 4 spriteList db MAX_SPRITES * (sizeof SpriteStruct) dup(?) spriteOrder dd MAX_SPRITES dup(?) ; sprite indices sorted far-to-near + +ALIGN 4 +transitionList db MAX_TRANSITIONS * (sizeof LevelTransition) dup(?) + +ALIGN 4 +cutsceneEvents db MAX_CUTSCENE_EVENTS * (sizeof CutsceneEvent) dup(?) +cutsceneStrings db MAX_CUTSCENE_STRINGS * CUTSCENE_STRING_BYTES dup(?) +stagedCutsceneEvents db MAX_CUTSCENE_EVENTS * (sizeof CutsceneEvent) dup(?) +stagedCutsceneStrings db MAX_CUTSCENE_STRINGS * CUTSCENE_STRING_BYTES dup(?) diff --git a/include/engine_defs.inc b/include/engine_defs.inc index ba84c32..1f13d49 100644 --- a/include/engine_defs.inc +++ b/include/engine_defs.inc @@ -62,6 +62,8 @@ VK_KEY_UP equ 26h VK_KEY_RIGHT equ 27h VK_KEY_DOWN equ 28h VK_KEY_F12 equ 7Bh +VK_KEY_C equ 43h +VK_KEY_TAB equ 9 ; Colors (32-bit 00RRGGBBh; in memory a DIB stores bytes B,G,R,0 little-endian) COLOR_BLACK equ 00000000h @@ -89,6 +91,24 @@ CELL_DOOR_OPEN equ 6 CELL_PILLAR equ 7 CELL_GLASS equ 8 CELL_MARBLE equ 9 +CELL_PORTAL equ 10 ; Sector transition portal +CELL_COUNT equ 11 + +; Sector Transition Portals +MAX_TRANSITIONS equ 16 +MAX_PATH_BYTES equ 260 +MAP_FORMAT_VERSION equ 4 + +LevelTransition STRUCT ; sizeof = 42 bytes (packed) + triggerCellX db 0 ; 1 byte + triggerCellY db 0 ; 1 byte + targetMap db 32 dup(0); 32 bytes ASCII + targetSpawnX dw 0 ; 2 bytes + targetSpawnY dw 0 ; 2 bytes + targetAngle dw 0 ; 2 bytes + fadeEffect db 0 ; 1 byte (0=instant, 1=fade to black) + reserved db 0 ; 1 byte padding +LevelTransition ENDS ; Sprite Types & Struct MAX_SPRITES equ 32 @@ -118,7 +138,7 @@ MAP_MAGIC equ 4E4C4245h ; 'EBLN' MapHeader STRUCT ; sizeof = 38 bytes (packed) magic dd 0 ; 'EBLN' - version dw 0 ; 1 = sprite coords 16.16 fixed, 2 = raw world units + version dw 0 ; 1 = fixed coords, 2/3 = transitions, 4 = cutscenes mapWidth dw 0 ; 32 mapHeight dw 0 ; 32 playerStartX dw 0 ; cell X @@ -127,5 +147,32 @@ MapHeader STRUCT ; sizeof = 38 bytes (packed) spriteCount dw 0 ; number of sprites ceilingColor dd 0 ; 00RRGGBBh floorColor dd 0 ; 00RRGGBBh - reserved db 12 dup(0) + transitionCount dw 0 ; number of transitions in file + cutsceneCount dw 0 + cutsceneStringCount dw 0 + cutsceneFlags dw 0 + reserved db 4 dup(0) MapHeader ENDS + +MAX_CUTSCENE_EVENTS equ 128 +MAX_CUTSCENE_STRINGS equ 32 +CUTSCENE_STRING_BYTES equ 96 +CUTSCENE_MAX_DURATION equ 3600 +CUTSCENE_AUTOPLAY equ 1 +OP_END equ 0 +OP_WAIT equ 1 +OP_MOVE_CAM_TO equ 2 +OP_PAN_CAM_TO equ 3 +OP_SHOW_SUBTITLE equ 4 +OP_HIDE_SUBTITLE equ 5 +OP_PLAY_SOUND equ 6 +OP_FADE_SCREEN equ 7 +OP_CHANGE_SUBLEVEL equ 8 +CutsceneEvent STRUCT + tickTimestamp dw 0 + opCode db 0 + param8 db 0 + paramA dd 0 + paramB dd 0 + dataId dd 0 +CutsceneEvent ENDS diff --git a/include/engine_input.inc b/include/engine_input.inc index 4bfc5a9..d61853c 100644 --- a/include/engine_input.inc +++ b/include/engine_input.inc @@ -8,6 +8,27 @@ ; PollInput: Reads keyboard state and updates movement & action flags ; ------------------------------------------------------------------------------ PollInput PROC uses eax ebx + mov keyForward, 0 + mov keyBackward, 0 + mov keyStrafeLeft, 0 + mov keyStrafeRight, 0 + mov keyTurnLeft, 0 + mov keyTurnRight, 0 + mov keyRun, 0 + mov keyAction, 0 + mov keyScreenshot, 0 + mov keyCutscene, 0 + mov keySkipScene, 0 + invoke GetForegroundWindow + cmp eax, hEngineWnd + je input_has_focus + mov keyActionHeld, 0 + mov keyMapHeld, 0 + mov keyShotHeld, 0 + mov keySceneHeld, 0 + mov keySkipHeld, 0 + ret +input_has_focus: ; 1. Forward (W / Up Arrow) invoke GetAsyncKeyState, VK_KEY_W @@ -15,7 +36,9 @@ PollInput PROC uses eax ebx invoke GetAsyncKeyState, VK_KEY_UP or bx, ax test bx, 8000h - setnz keyForward + jz @F + mov keyForward, 1 +@@: ; 2. Backward (S / Down Arrow) invoke GetAsyncKeyState, VK_KEY_S @@ -23,55 +46,117 @@ PollInput PROC uses eax ebx invoke GetAsyncKeyState, VK_KEY_DOWN or bx, ax test bx, 8000h - setnz keyBackward + jz @F + mov keyBackward, 1 +@@: ; 3. Strafe Left (A) invoke GetAsyncKeyState, VK_KEY_A test ax, 8000h - setnz keyStrafeLeft + jz @F + mov keyStrafeLeft, 1 +@@: ; 4. Strafe Right (D) invoke GetAsyncKeyState, VK_KEY_D test ax, 8000h - setnz keyStrafeRight + jz @F + mov keyStrafeRight, 1 +@@: ; 5. Turn Left (Left Arrow) invoke GetAsyncKeyState, VK_KEY_LEFT test ax, 8000h - setnz keyTurnLeft + jz @F + mov keyTurnLeft, 1 +@@: ; 6. Turn Right (Right Arrow) invoke GetAsyncKeyState, VK_KEY_RIGHT test ax, 8000h - setnz keyTurnRight + jz @F + mov keyTurnRight, 1 +@@: - ; 7. Action / Open Door (E / Space) + ; Actions are emitted once per physical press (also for E + Space). invoke GetAsyncKeyState, VK_KEY_E mov bx, ax invoke GetAsyncKeyState, VK_KEY_SPACE or bx, ax test bx, 8000h - setnz keyAction + jz action_released + cmp keyActionHeld, 0 + jne action_sampled + mov keyAction, 1 + mov keyActionHeld, 1 + jmp action_sampled +action_released: + mov keyActionHeld, 0 +action_sampled: ; 8. Run / Sprint (Shift) invoke GetAsyncKeyState, VK_KEY_SHIFT test ax, 8000h - setnz keyRun + jz @F + mov keyRun, 1 +@@: - ; 9. Toggle Minimap (M - single press trigger) invoke GetAsyncKeyState, VK_KEY_M - test ax, 0001h ; Check if key was pressed since last call - jz @F + test ax, 8000h + jz map_key_released + cmp keyMapHeld, 0 + jne map_key_sampled xor keyShowMap, 1 -@@: - - ; 10. Screenshot (F12 - single press trigger) + mov keyMapHeld, 1 + jmp map_key_sampled +map_key_released: + mov keyMapHeld, 0 +map_key_sampled: invoke GetAsyncKeyState, VK_KEY_F12 - test ax, 0001h - jz @F + test ax, 8000h + jz shot_key_released + cmp keyShotHeld, 0 + jne shot_key_sampled mov keyScreenshot, 1 -@@: + mov keyShotHeld, 1 + jmp shot_key_sampled +shot_key_released: + mov keyShotHeld, 0 +shot_key_sampled: + invoke GetAsyncKeyState, VK_KEY_C + test ax, 8000h + jz scene_key_released + cmp keySceneHeld, 0 + jne scene_key_sampled + mov keyCutscene, 1 + mov keySceneHeld, 1 + jmp scene_key_sampled +scene_key_released: + mov keySceneHeld, 0 +scene_key_sampled: + invoke GetAsyncKeyState, VK_KEY_TAB + test ax, 8000h + jz skip_key_released + cmp keySkipHeld, 0 + jne skip_key_sampled + mov keySkipScene, 1 + mov keySkipHeld, 1 + jmp skip_key_sampled +skip_key_released: + mov keySkipHeld, 0 +skip_key_sampled: + cmp isCutsceneActive, 0 + je normal_keys_enabled + mov keyForward, 0 + mov keyBackward, 0 + mov keyStrafeLeft, 0 + mov keyStrafeRight, 0 + mov keyTurnLeft, 0 + mov keyTurnRight, 0 + mov keyRun, 0 + mov keyAction, 0 +normal_keys_enabled: ; 11. Escape - Exit application invoke GetAsyncKeyState, VK_KEY_ESCAPE test ax, 8000h diff --git a/include/engine_map.inc b/include/engine_map.inc index eaafe9f..bda1a1b 100644 --- a/include/engine_map.inc +++ b/include/engine_map.inc @@ -4,6 +4,15 @@ .code +; Forward prototypes for map & sublevel transition procedures +SwitchSublevel PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD +LoadSublevelBinary PROTO :DWORD, :DWORD, :DWORD, :DWORD +DoSublevelTransition PROTO +ApplyScreenFade PROTO +ValidateMapFilename PROTO :DWORD +ValidateStagedCutscene PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD +CheckPortalTriggers PROTO + ; ------------------------------------------------------------------------------ ; InitMap: Creates a rich test level with rooms, hallways, pillars & doors ; ------------------------------------------------------------------------------ @@ -80,8 +89,16 @@ loop_wall2: mov playerX, 160 mov playerY, 160 mov playerAngle, 0 + call StopCutscene + mov cutsceneCount, 0 + mov cutsceneStringCount, 0 + mov cutsceneFlags, 0 + mov cutscenePending, 0 mov spriteCount, 0 - + mov transitionCount, 0 + mov portalLatchCell, -1 + mov mapCeilingColor, COLOR_CEILING + mov mapFloorColor, COLOR_FLOOR ret InitMap ENDP @@ -145,7 +162,7 @@ IsSolidCell PROC cellType:DWORD cmp eax, CELL_DOOR_OPEN je not_solid - mov eax, 1 ; Solid wall or closed door + mov eax, 1 ; Solid wall, closed door, or portal wall ret not_solid: @@ -154,9 +171,9 @@ not_solid: IsSolidCell ENDP ; ------------------------------------------------------------------------------ -; InteractDoor: Checks if player is facing a door and toggles open/close +; InteractDoor: Checks if player is facing a door or portal and handles interaction ; ------------------------------------------------------------------------------ -InteractDoor PROC uses ebx ecx edx +InteractDoor PROC uses ebx ecx edx esi edi LOCAL targetX:DWORD, targetY:DWORD ; Compute point 60 units in front of player @@ -189,17 +206,49 @@ InteractDoor PROC uses ebx ecx edx check_door_close: cmp eax, CELL_DOOR_OPEN - jne no_door + jne check_portal_interact ; Close the door! invoke SetMapCell, targetX, targetY, CELL_DOOR + ret + +check_portal_interact: + ; Check if facing a transition trigger or CELL_PORTAL + cmp transitionCount, 0 + je no_door + + mov esi, OFFSET transitionList + mov edx, 0 +portal_find_loop: + cmp edx, transitionCount + jge no_door + movzx eax, [esi].LevelTransition.triggerCellX + cmp eax, targetX + jne portal_find_next + movzx eax, [esi].LevelTransition.triggerCellY + cmp eax, targetY + jne portal_find_next + + ; Found transition! + movzx eax, [esi].LevelTransition.targetSpawnX + movzx ebx, [esi].LevelTransition.targetSpawnY + movzx ecx, [esi].LevelTransition.targetAngle + movzx edx, [esi].LevelTransition.fadeEffect + lea edi, [esi].LevelTransition.targetMap + invoke SwitchSublevel, edi, eax, ebx, ecx, edx + ret + +portal_find_next: + add esi, sizeof LevelTransition + inc edx + jmp portal_find_loop no_door: ret InteractDoor ENDP ; ------------------------------------------------------------------------------ -; CheckDoorHint: Returns eax=1 if player is facing a door (for HUD hint) +; CheckDoorHint: Returns 1 for Door, 2 for Portal, 0 for none (for HUD hint) ; ------------------------------------------------------------------------------ CheckDoorHint PROC uses ebx ecx edx LOCAL targetX:DWORD, targetY:DWORD @@ -224,144 +273,697 @@ CheckDoorHint PROC uses ebx ecx edx invoke GetMapCell, targetX, targetY cmp eax, CELL_DOOR - je hint_yes + je hint_door cmp eax, CELL_DOOR_OPEN - je hint_yes + je hint_door + cmp eax, CELL_PORTAL + je hint_portal + + ; Check if target is a trigger in transitionList + cmp transitionCount, 0 + je hint_none + mov edx, 0 + mov eax, OFFSET transitionList +hint_check_loop: + cmp edx, transitionCount + jge hint_none + movzx ebx, [eax].LevelTransition.triggerCellX + cmp ebx, targetX + jne hint_check_next + movzx ebx, [eax].LevelTransition.triggerCellY + cmp ebx, targetY + je hint_portal +hint_check_next: + add eax, sizeof LevelTransition + inc edx + jmp hint_check_loop + +hint_none: xor eax, eax ret -hint_yes: + +hint_door: mov eax, 1 ret + +hint_portal: + mov eax, 2 + ret CheckDoorHint ENDP ; ------------------------------------------------------------------------------ -; LoadMapBinary: Checks if assets/map.dat exists and loads custom map, -; player spawn position, angle, ceiling/floor colors, and sprites. -; Returns: eax = 1 if custom map loaded, 0 if fallback to procedural map +; CheckPortalTriggers: Checks if player stepped onto/into a transition trigger cell ; ------------------------------------------------------------------------------ -LoadMapBinary PROC uses ebx ecx edx esi edi - LOCAL hFile:DWORD - LOCAL bytesRead:DWORD - LOCAL header:MapHeader - LOCAL count:DWORD +CheckPortalTriggers PROC uses ebx ecx edx esi edi + cmp fadeState, 0 + jne cpt_done + cmp transitionCount, 0 + je cpt_done - ; Try to open assets/map.dat - invoke CreateFileA, OFFSET szMapFilePath, GENERIC_READ, FILE_SHARE_READ,\ - 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 + ; Current player cell X and Y + mov eax, playerX + sar eax, 6 + mov ebx, eax + + mov eax, playerY + sar eax, 6 + mov ecx, eax + shl eax, 5 + add eax, ebx + cmp eax, portalLatchCell + je cpt_done + mov portalLatchCell, eax + + mov esi, OFFSET transitionList + mov edx, 0 + +cpt_loop: + cmp edx, transitionCount + jge cpt_done + + movzx eax, [esi].LevelTransition.triggerCellX + cmp eax, ebx + jne cpt_next + + movzx eax, [esi].LevelTransition.triggerCellY + cmp eax, ecx + jne cpt_next + + ; Walked into trigger cell! Initiate transition + movzx eax, [esi].LevelTransition.targetSpawnX + movzx ebx, [esi].LevelTransition.targetSpawnY + movzx ecx, [esi].LevelTransition.targetAngle + movzx edx, [esi].LevelTransition.fadeEffect + + lea edi, [esi].LevelTransition.targetMap + invoke SwitchSublevel, edi, eax, ebx, ecx, edx + ret + +cpt_next: + add esi, sizeof LevelTransition + inc edx + jmp cpt_loop + +cpt_done: + ret +CheckPortalTriggers ENDP + +; ------------------------------------------------------------------------------ +; SwitchSublevel: Triggers transition sequence to target sublevel file +; ------------------------------------------------------------------------------ +SwitchSublevel PROC uses esi edi, pszNextMap:DWORD, spawnX:DWORD, spawnY:DWORD, spawnAngle:DWORD, fadeEffect:DWORD + cmp fadeState, 0 + jne switch_busy + + mov esi, pszNextMap + lea edi, pendingMapPath + mov ecx, 32 +copy_next_map: + lodsb + stosb + test al, al + jz next_map_copied + dec ecx + jnz copy_next_map + mov byte ptr [edi-1], 0 +next_map_copied: + + mov eax, spawnX + mov pendingSpawnX, eax + mov eax, spawnY + mov pendingSpawnY, eax + mov eax, spawnAngle + mov pendingSpawnAngle, eax + + cmp fadeEffect, 0 + je switch_instant + + ; Initiate smooth Fade Out (takes 16 frames ~ 0.26s) + mov fadeState, 1 + mov fadeLevel, 1 + ret + +switch_instant: + call DoSublevelTransition +switch_busy: + ret +SwitchSublevel ENDP + +; ------------------------------------------------------------------------------ +; DoSublevelTransition: Unloads old sector and loads new sector +; ------------------------------------------------------------------------------ +DoSublevelTransition PROC uses ebx ecx edx + ; The loader replaces the room only after validating every staged value. + invoke LoadSublevelBinary, OFFSET pendingMapPath, pendingSpawnX, pendingSpawnY, pendingSpawnAngle + test eax, eax + jnz transition_loaded + mov mapErrorFrames, 180 +transition_loaded: + ret +DoSublevelTransition ENDP + +; ------------------------------------------------------------------------------ +; ApplyScreenFade: Screen darkening post-processing and transition sequencer +; ------------------------------------------------------------------------------ +ApplyScreenFade PROC uses ebx ecx edx esi edi + cmp fadeState, 0 + je fade_done + + cmp fadeState, 1 + je do_fade_out + cmp fadeState, 2 + je do_switch_state + cmp fadeState, 3 + je do_fade_in + jmp fade_done + +do_fade_out: + inc fadeLevel + cmp fadeLevel, 16 + jl apply_darkening + mov fadeLevel, 16 + mov fadeState, 2 + call DoSublevelTransition + mov fadeState, 3 + jmp apply_darkening + +do_switch_state: + call DoSublevelTransition + mov fadeState, 3 + jmp apply_darkening + +do_fade_in: + dec fadeLevel + cmp fadeLevel, 0 + jg apply_darkening + mov fadeLevel, 0 + mov fadeState, 0 + jmp fade_done + +apply_darkening: + cmp fadeLevel, 0 + jle fade_done + + cmp fadeLevel, 16 + jl fade_math + + ; Fully black screen + mov edi, OFFSET screenBuffer + mov ecx, SCREEN_W * SCREEN_H + xor eax, eax + rep stosd + jmp fade_done + +fade_math: + mov ebx, 16 + sub ebx, fadeLevel ; scale: 1..15 + mov esi, OFFSET screenBuffer + mov edi, esi + mov ecx, SCREEN_W * SCREEN_H + +fade_pixel_loop: + mov eax, [esi] + ; Blue + movzx edx, al + imul edx, ebx + shr edx, 4 + ; Green + movzx eax, ah + imul eax, ebx + shr eax, 4 + shl eax, 8 + or edx, eax + ; Red + mov eax, [esi] + shr eax, 16 + movzx eax, al + imul eax, ebx + shr eax, 4 + shl eax, 16 + or eax, edx + + mov [edi], eax + add esi, 4 + add edi, 4 + dec ecx + jnz fade_pixel_loop + +fade_done: + ret +ApplyScreenFade ENDP + +; ------------------------------------------------------------------------------ +; LoadSublevelBinary: Parameterized level loader for any .dat file +; Overrides player spawn if spawnX != -1, populates gameMap, sprites, transitions. +; Returns: eax = 1 on success, 0 on fallback +; ------------------------------------------------------------------------------ +LoadSublevelBinary PROC uses ebx ecx edx esi edi, pszPath:DWORD, spawnX:DWORD, spawnY:DWORD, spawnAngle:DWORD + LOCAL hFile:DWORD, bytesRead:DWORD, header:MapHeader + LOCAL numSprites:DWORD, numTransitions:DWORD, index:DWORD + LOCAL numEvents:DWORD, numStrings:DWORD, sceneFlags:DWORD + LOCAL resolvedPath[MAX_PATH_BYTES]:BYTE + LOCAL stagedMap[MAP_SIZE]:BYTE + LOCAL stagedSprites[MAX_SPRITES * (sizeof SpriteStruct)]:BYTE + LOCAL stagedTransitions[MAX_TRANSITIONS * (sizeof LevelTransition)]:BYTE + LOCAL newX:DWORD, newY:DWORD, newAngle:DWORD + + ; Relative map names live in assets. Accept an actual assets prefix, + ; drive-qualified paths and absolute paths, never just the first letter. + mov esi, pszPath + test esi, esi + jz load_default_path + cmp byte ptr [esi], 0 + jne resolve_map_path +load_default_path: + mov esi, OFFSET szMapFilePath +resolve_map_path: + lea edi, resolvedPath + mov ecx, MAX_PATH_BYTES - 1 + cmp byte ptr [esi], 0 + je load_failed + cmp byte ptr [esi+1], ':' + je copy_map_path + cmp byte ptr [esi], 92 + je copy_map_path + cmp byte ptr [esi], '/' + je copy_map_path + push esi + push ecx + mov ebx, OFFSET szAssetsPrefix + mov ecx, 6 +check_assets_prefix: + mov al, [esi] + or al, 20h + cmp al, [ebx] + jne prefix_not_assets + inc esi + inc ebx + loop check_assets_prefix + cmp byte ptr [esi], 92 + je prefix_is_assets + cmp byte ptr [esi], '/' + je prefix_is_assets +prefix_not_assets: + pop ecx + pop esi + mov ebx, OFFSET szAssetsPrefix +copy_assets_prefix: + mov al, [ebx] + test al, al + jz copy_map_path + stosb + inc ebx + dec ecx + jmp copy_assets_prefix +prefix_is_assets: + pop ecx + pop esi +copy_map_path: + lodsb + stosb + test al, al + jz open_level + dec ecx + jnz copy_map_path + jmp load_failed +open_level: + invoke CreateFileA, ADDR resolvedPath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 mov hFile, eax - cmp hFile, INVALID_HANDLE_VALUE - je load_fallback - - ; Read MapHeader (38 bytes, packed) + cmp eax, INVALID_HANDLE_VALUE + je load_failed invoke ReadFile, hFile, ADDR header, sizeof MapHeader, ADDR bytesRead, 0 test eax, eax - jz close_and_fallback + jz close_load_failed cmp bytesRead, sizeof MapHeader - jl close_and_fallback - - ; Verify Magic 'EBLN' + jne close_load_failed cmp header.magic, MAP_MAGIC - jne close_and_fallback - - ; Validate version (1 = legacy 16.16 sprite coords, 2 = raw units) - movzx eax, header.version - cmp eax, 1 - jl close_and_fallback - cmp eax, 2 - jg close_and_fallback - - ; Validate grid dimensions (engine is fixed at 32x32) + jne close_load_failed + cmp header.version, 1 + jb close_load_failed + cmp header.version, MAP_FORMAT_VERSION + ja close_load_failed cmp header.mapWidth, MAP_W - jne close_and_fallback + jne close_load_failed cmp header.mapHeight, MAP_H - jne close_and_fallback - - ; Apply Player Spawn Position (in cells -> fixed-point world units) - movzx eax, header.playerStartX - shl eax, 6 ; * 64 - add eax, 32 ; center in cell - mov playerX, eax - - movzx eax, header.playerStartY - shl eax, 6 ; * 64 - add eax, 32 - mov playerY, eax - - ; Apply Player Start Angle (0..511) - movzx eax, header.playerStartAngle - and eax, ANGLE_MASK - mov playerAngle, eax - - ; Apply Custom Ceiling and Floor Colors if specified - cmp header.ceilingColor, 0 - je @F - mov eax, header.ceilingColor - mov mapCeilingColor, eax -@@: - cmp header.floorColor, 0 - je @F - mov eax, header.floorColor - mov mapFloorColor, eax -@@: - - ; Read 1024 bytes of gameMap - invoke ReadFile, hFile, OFFSET gameMap, MAP_SIZE, ADDR bytesRead, 0 - test eax, eax - jz close_and_fallback - cmp bytesRead, MAP_SIZE - jne close_and_fallback - - ; Read Sprites + jne close_load_failed + cmp header.playerStartX, MAP_W + jae close_load_failed + cmp header.playerStartY, MAP_H + jae close_load_failed + cmp header.playerStartAngle, ANGLE_MASK + ja close_load_failed movzx eax, header.spriteCount cmp eax, MAX_SPRITES - jle @F - mov eax, MAX_SPRITES -@@: - mov count, eax - mov spriteCount, eax - - test eax, eax - jz finish_load - - imul eax, sizeof SpriteStruct - mov ecx, eax - invoke ReadFile, hFile, OFFSET spriteList, ecx, ADDR bytesRead, 0 - test eax, eax - jz close_and_fallback - mov eax, count - imul eax, sizeof SpriteStruct - cmp bytesRead, eax - jne close_and_fallback - - ; Format v1 stored sprite x/y as 16.16 fixed point -> convert to raw units + ja close_load_failed + mov numSprites, eax + xor eax, eax cmp header.version, 1 - jne finish_load - mov ecx, 0 -convert_v1_sprites: - cmp ecx, count - jge finish_load - mov eax, ecx + je old_map_no_transitions + ; Accept the extended v2 files written by early EblanStudio builds. + movzx eax, header.transitionCount +old_map_no_transitions: + cmp eax, MAX_TRANSITIONS + ja close_load_failed + mov numTransitions, eax + mov numEvents, 0 + mov numStrings, 0 + mov sceneFlags, 0 + cmp header.version, 4 + jb old_map_no_cutscene + movzx eax, header.cutsceneCount + cmp eax, MAX_CUTSCENE_EVENTS + ja close_load_failed + mov numEvents, eax + movzx eax, header.cutsceneStringCount + cmp eax, MAX_CUTSCENE_STRINGS + ja close_load_failed + mov numStrings, eax + movzx eax, header.cutsceneFlags + mov sceneFlags, eax +old_map_no_cutscene: + mov eax, numTransitions + imul eax, sizeof LevelTransition + mov ebx, eax + mov eax, numSprites imul eax, sizeof SpriteStruct - add eax, OFFSET spriteList - mov edx, [eax].SpriteStruct.x - sar edx, 16 - mov [eax].SpriteStruct.x, edx - mov edx, [eax].SpriteStruct.y - sar edx, 16 - mov [eax].SpriteStruct.y, edx - inc ecx - jmp convert_v1_sprites + add ebx, eax + add ebx, sizeof MapHeader + MAP_SIZE + mov eax, numEvents + imul eax, sizeof CutsceneEvent + add ebx, eax + mov eax, numStrings + imul eax, CUTSCENE_STRING_BYTES + add ebx, eax + invoke GetFileSize, hFile, 0 + cmp eax, ebx + jne close_load_failed -finish_load: + invoke ReadFile, hFile, ADDR stagedMap, MAP_SIZE, ADDR bytesRead, 0 + test eax, eax + jz close_load_failed + cmp bytesRead, MAP_SIZE + jne close_load_failed + mov eax, numSprites + imul eax, sizeof SpriteStruct + mov ebx, eax + invoke ReadFile, hFile, ADDR stagedSprites, ebx, ADDR bytesRead, 0 + test eax, eax + jz close_load_failed + cmp bytesRead, ebx + jne close_load_failed + mov eax, numTransitions + imul eax, sizeof LevelTransition + mov ebx, eax + invoke ReadFile, hFile, ADDR stagedTransitions, ebx, ADDR bytesRead, 0 + test eax, eax + jz close_load_failed + cmp bytesRead, ebx + jne close_load_failed + + mov ebx, numEvents + imul ebx, sizeof CutsceneEvent + invoke ReadFile, hFile, OFFSET stagedCutsceneEvents, ebx, ADDR bytesRead, 0 + test eax, eax + jz close_load_failed + cmp bytesRead, ebx + jne close_load_failed + mov ebx, numStrings + imul ebx, CUTSCENE_STRING_BYTES + invoke ReadFile, hFile, OFFSET stagedCutsceneStrings, ebx, ADDR bytesRead, 0 + test eax, eax + jz close_load_failed + cmp bytesRead, ebx + jne close_load_failed + invoke ValidateStagedCutscene, numEvents, numStrings, sceneFlags, ADDR stagedMap, numTransitions + test eax, eax + jz close_load_failed + + ; Validate all payload data before touching the active room. + lea esi, stagedMap + mov ecx, MAP_SIZE +validate_grid: + lodsb + cmp al, 15 + ja close_load_failed + loop validate_grid + lea esi, stagedSprites + mov ecx, numSprites +validate_sprite: + test ecx, ecx + jz validate_transitions + cmp header.version, 1 + jne sprite_coords_raw + sar [esi].SpriteStruct.x, 16 + sar [esi].SpriteStruct.y, 16 +sprite_coords_raw: + cmp [esi].SpriteStruct.x, 0 + jl close_load_failed + cmp [esi].SpriteStruct.x, MAP_W * CELL_SIZE + jge close_load_failed + cmp [esi].SpriteStruct.y, 0 + jl close_load_failed + cmp [esi].SpriteStruct.y, MAP_H * CELL_SIZE + jge close_load_failed + cmp [esi].SpriteStruct.textureId, MAX_TEXTURES + jae close_load_failed + cmp [esi].SpriteStruct.scale, 0 + jl close_load_failed + cmp [esi].SpriteStruct.scale, 16 * FIXED_ONE + ja close_load_failed + add esi, sizeof SpriteStruct + dec ecx + jmp validate_sprite +validate_transitions: + lea esi, stagedTransitions + mov index, 0 +validate_transition: + mov eax, index + cmp eax, numTransitions + jae validate_portal_cells + cmp [esi].LevelTransition.triggerCellX, MAP_W + jae close_load_failed + cmp [esi].LevelTransition.triggerCellY, MAP_H + jae close_load_failed + cmp [esi].LevelTransition.targetSpawnX, MAP_W + jae close_load_failed + cmp [esi].LevelTransition.targetSpawnY, MAP_H + jae close_load_failed + cmp [esi].LevelTransition.targetAngle, ANGLE_MASK + ja close_load_failed + cmp [esi].LevelTransition.fadeEffect, 1 + ja close_load_failed + push ecx + lea edi, [esi].LevelTransition.targetMap + invoke ValidateMapFilename, edi + pop ecx + test eax, eax + jz close_load_failed + movzx eax, [esi].LevelTransition.triggerCellY + shl eax, 5 + movzx edx, [esi].LevelTransition.triggerCellX + add eax, edx + mov al, stagedMap[eax] + cmp al, CELL_EMPTY + je transition_grid_ok + cmp al, CELL_DOOR_OPEN + je transition_grid_ok + cmp al, CELL_PORTAL + jne close_load_failed +transition_grid_ok: + lea edi, stagedTransitions + mov ecx, index +unique_transition: + test ecx, ecx + jz transition_unique + mov ax, WORD PTR [esi] + cmp ax, WORD PTR [edi] + je close_load_failed + add edi, sizeof LevelTransition + dec ecx + jmp unique_transition +transition_unique: + add esi, sizeof LevelTransition + inc index + jmp validate_transition +validate_portal_cells: + xor ebx, ebx +portal_grid_loop: + cmp ebx, MAP_SIZE + jae validate_spawn + cmp stagedMap[ebx], CELL_PORTAL + jne next_portal_grid + lea esi, stagedTransitions + mov ecx, numTransitions +find_grid_transition: + test ecx, ecx + jz close_load_failed + movzx eax, [esi].LevelTransition.triggerCellY + shl eax, 5 + movzx edx, [esi].LevelTransition.triggerCellX + add eax, edx + cmp eax, ebx + je next_portal_grid + add esi, sizeof LevelTransition + dec ecx + jmp find_grid_transition +next_portal_grid: + inc ebx + jmp portal_grid_loop +validate_spawn: + movzx eax, header.playerStartX + movzx ebx, header.playerStartY + movzx ecx, header.playerStartAngle + cmp spawnX, -1 + je spawn_values_ready + mov eax, spawnX + mov ebx, spawnY + mov ecx, spawnAngle +spawn_values_ready: + cmp eax, MAP_W + jae close_load_failed + cmp ebx, MAP_H + jae close_load_failed + cmp ecx, ANGLE_MASK + ja close_load_failed + mov newX, eax + mov newY, ebx + mov newAngle, ecx + shl ebx, 5 + add ebx, eax + mov al, stagedMap[ebx] + cmp al, CELL_EMPTY + je commit_level + cmp al, CELL_DOOR_OPEN + je commit_level + cmp al, CELL_PORTAL + jne close_load_failed +commit_level: invoke CloseHandle, hFile - mov eax, 1 ; Custom map loaded! + call StopCutscene + mov esi, OFFSET stagedCutsceneEvents + mov edi, OFFSET cutsceneEvents + mov ecx, numEvents + shl ecx, 2 + rep movsd + mov esi, OFFSET stagedCutsceneStrings + mov edi, OFFSET cutsceneStrings + mov ecx, numStrings + imul ecx, CUTSCENE_STRING_BYTES / 4 + rep movsd + mov eax, numEvents + mov cutsceneCount, eax + mov eax, numStrings + mov cutsceneStringCount, eax + mov eax, sceneFlags + mov cutsceneFlags, eax + and eax, CUTSCENE_AUTOPLAY + mov cutscenePending, eax + lea esi, stagedMap + mov edi, OFFSET gameMap + mov ecx, MAP_SIZE / 4 + rep movsd + lea esi, stagedSprites + mov edi, OFFSET spriteList + mov ecx, numSprites + imul ecx, sizeof SpriteStruct / 4 + rep movsd + lea esi, stagedTransitions + mov edi, OFFSET transitionList + mov ecx, numTransitions + imul ecx, sizeof LevelTransition + rep movsb + mov eax, numSprites + mov spriteCount, eax + mov eax, numTransitions + mov transitionCount, eax + mov eax, header.ceilingColor + and eax, 00FFFFFFh + mov mapCeilingColor, eax + mov eax, header.floorColor + and eax, 00FFFFFFh + mov mapFloorColor, eax + mov eax, newY + shl eax, 5 + add eax, newX + mov portalLatchCell, eax + mov eax, newX + shl eax, CELL_SHIFT + add eax, CELL_SIZE / 2 + mov playerX, eax + mov eax, newY + shl eax, CELL_SHIFT + add eax, CELL_SIZE / 2 + mov playerY, eax + mov eax, newAngle + mov playerAngle, eax + mov mapErrorFrames, 0 + mov eax, 1 ret - -close_and_fallback: +close_load_failed: invoke CloseHandle, hFile -load_fallback: - call InitMap ; Procedural fallback level +load_failed: xor eax, eax ret -LoadMapBinary ENDP +LoadSublevelBinary ENDP +; Map references in EBLN are bounded ASCII basenames, never arbitrary pointers. +ValidateMapFilename PROC uses ebx ecx edx esi, pszName:DWORD + mov esi, pszName + xor ecx, ecx +filename_character: + mov al, [esi+ecx] + test al, al + jz filename_end + cmp al, 32 + jb filename_invalid + cmp al, 127 + jae filename_invalid + cmp al, 92 + je filename_invalid + cmp al, '/' + je filename_invalid + cmp al, ':' + je filename_invalid + cmp al, '*' + je filename_invalid + cmp al, '?' + je filename_invalid + cmp al, 34 + je filename_invalid + cmp al, '<' + je filename_invalid + cmp al, '>' + je filename_invalid + cmp al, '|' + je filename_invalid + inc ecx + cmp ecx, 32 + jb filename_character + jmp filename_invalid +filename_end: + cmp ecx, 5 + jb filename_invalid + mov eax, DWORD PTR [esi+ecx-4] + or eax, 20202000h + cmp eax, 7461642Eh ; .dat + jne filename_invalid + mov eax, 1 + ret +filename_invalid: + xor eax, eax + ret +ValidateMapFilename ENDP + +LoadMapBinary PROC + mov eax, OFFSET szMapFilePath + cmp startupMapPath, 0 + je load_startup_map + mov eax, OFFSET startupMapPath +load_startup_map: + invoke LoadSublevelBinary, eax, -1, -1, 0 + test eax, eax + jnz startup_map_ready + call InitMap +startup_map_ready: + ret +LoadMapBinary ENDP diff --git a/include/engine_math.inc b/include/engine_math.inc index 94626bf..89ce645 100644 --- a/include/engine_math.inc +++ b/include/engine_math.inc @@ -3,23 +3,28 @@ ; ============================================================================== .data -fAngleDiv REAL4 256.0 -fFixedScale REAL4 65536.0 +fAngleDiv REAL4 256.0 +fFixedScale REAL4 65536.0 +fScreenHalfW REAL4 160.0 +fTanHalfFov REAL4 0.66817864 ; tan(48 * PI / 256) = tan(33.75 deg) +fRadToAngle REAL4 81.48733 ; 256.0 / PI .code ; ------------------------------------------------------------------------------ -; InitMathTables: Builds 512-entry Sin & Cos tables in 16.16 fixed point +; InitMathTables: Builds 512-entry Sin & Cos tables in 16.16 fixed point, +; and 320-entry tangential ray angle offset table for flat-plane projection. ; ------------------------------------------------------------------------------ InitMathTables PROC uses eax ecx edi - LOCAL curAngle:DWORD + LOCAL curVal:DWORD + ; 1. Generate 512-entry Sin/Cos tables mov ecx, 0 init_angle_loop: - mov curAngle, ecx + mov curVal, ecx fldpi - fimul curAngle + fimul curVal fdiv fAngleDiv ; st(0) = (angle * PI) / 256 fsincos ; st(0) = cos, st(1) = sin @@ -36,6 +41,32 @@ init_angle_loop: cmp ecx, ANGLE_512 jl init_angle_loop + ; 2. Generate 320-entry Ray Angle Offset table (tangential perspective correction) + ; and precomputed cosine table for instant fish-eye correction. + ; angleOffset = round( atan(((x - 160.0) / 160.0) * tan(FOV/2)) * (256.0 / PI) ) + mov ecx, 0 +init_ray_loop: + mov curVal, ecx + + fild curVal ; st(0) = x + fsub fScreenHalfW ; st(0) = x - 160.0 + fdiv fScreenHalfW ; st(0) = (x - 160.0) / 160.0 = cameraX + fmul fTanHalfFov ; st(0) = cameraX * tan(FOV/2) + fld1 ; st(0) = 1.0, st(1) = cameraX * tan(FOV/2) + fpatan ; st(0) = atan(st(1)/st(0)) = radOffset + fmul fRadToAngle ; st(0) = radOffset * (256.0 / PI) + fistp DWORD PTR [tableRayAngleOffset + ecx*4] + + ; Precompute tableRayCos[ecx] = cos(angleOffset) + mov eax, DWORD PTR [tableRayAngleOffset + ecx*4] + and eax, ANGLE_MASK + mov edx, [tableCos + eax*4] + mov DWORD PTR [tableRayCos + ecx*4], edx + + inc ecx + cmp ecx, SCREEN_W + jl init_ray_loop + ret InitMathTables ENDP diff --git a/include/engine_physics.inc b/include/engine_physics.inc index fda845c..641a906 100644 --- a/include/engine_physics.inc +++ b/include/engine_physics.inc @@ -13,6 +13,30 @@ UpdatePlayer PROC uses ebx ecx edx esi edi LOCAL nextX:DWORD, nextY:DWORD LOCAL checkGridX:DWORD, checkGridY:DWORD + ; Freeze player movement and inputs during level transitions + cmp fadeState, 0 + jne update_player_done + + cmp cutscenePending, 0 + je scene_manual_start + call StartCutscene +scene_manual_start: + cmp keyCutscene, 0 + je scene_check_active + cmp isCutsceneActive, 0 + jne scene_check_active + call StartCutscene +scene_check_active: + cmp isCutsceneActive, 0 + je normal_player_update + cmp keySkipScene, 0 + je scene_update_tick + call StopCutscene + ret +scene_update_tick: + call UpdateCutscene + ret +normal_player_update: mov moveX, 0 mov moveY, 0 @@ -36,6 +60,8 @@ check_action: cmp keyAction, 0 je check_movement call InteractDoor + cmp fadeState, 0 + jne update_player_done ; 2. Determine Movement Speed check_movement: @@ -149,9 +175,12 @@ check_x_col: mov checkGridY, ecx invoke GetMapCell, checkGridX, checkGridY + cmp eax, CELL_PORTAL + je allow_portal_x invoke IsSolidCell, eax test eax, eax jnz skip_x_move ; Collision on X: slide along wall! +allow_portal_x: mov eax, nextX mov playerX, eax @@ -180,13 +209,20 @@ check_y_col: mov checkGridX, ebx invoke GetMapCell, checkGridX, checkGridY + cmp eax, CELL_PORTAL + je allow_portal_y invoke IsSolidCell, eax test eax, eax jnz update_player_done ; Collision on Y +allow_portal_y: mov eax, nextY mov playerY, eax update_player_done: + cmp fadeState, 0 + jne @F + call CheckPortalTriggers +@@: ret UpdatePlayer ENDP diff --git a/include/engine_preview.inc b/include/engine_preview.inc new file mode 100644 index 0000000..6a2d7fa --- /dev/null +++ b/include/engine_preview.inc @@ -0,0 +1,150 @@ +; Windowless renderer used by EblanStudio. Same Render3DScene and overlays as game. +; Fixed wire layout is mirrored by editor/src/preview_protocol.h. +.data +previewPrefix db "--preview:",0 +previewHandle dd 0 +previewMemory dd 0 +previewParent dd 0 +previewTextureRevision dd -1 +.code +TryEnginePreview PROC uses ebx ecx edx esi edi + mov esi, OFFSET startupMapPath + mov edi, OFFSET previewPrefix + mov ecx, 10 + repe cmpsb + jne preview_not_requested + invoke OpenFileMappingA, 6, 0, esi ; FILE_MAP_READ | FILE_MAP_WRITE + test eax, eax + jz preview_exit_error + mov previewHandle, eax + invoke MapViewOfFile, eax, 6, 0, 0, 1357792 + test eax, eax + jz preview_exit_error + mov previewMemory, eax + mov ebx, eax + cmp DWORD PTR [ebx], 56504245h + jne preview_exit_error + cmp DWORD PTR [ebx+4], 1 + jne preview_exit_error + invoke OpenProcess, 00100000h, 0, DWORD PTR [ebx+12] ; SYNCHRONIZE + test eax, eax + jz preview_exit_error + mov previewParent, eax + call InitMathTables + call GenerateDefaultTextures +preview_wait: + invoke WaitForSingleObject, previewParent, 0 + test eax, eax + jz preview_exit_ok + mov ebx, previewMemory + cmp DWORD PTR [ebx+8], 3 + je preview_exit_ok + cmp DWORD PTR [ebx+8], 1 + je preview_render + invoke Sleep, 1 + jmp preview_wait +preview_render: + ; Treat IPC as untrusted: bounds before touching engine buffers. + mov eax, [ebx+16] + cmp eax, 2048 + jae preview_exit_error + mov playerX, eax + mov eax, [ebx+20] + cmp eax, 2048 + jae preview_exit_error + mov playerY, eax + mov eax, [ebx+24] + and eax, 511 + mov playerAngle, eax + mov eax, [ebx+28] + mov mapCeilingColor, eax + mov eax, [ebx+32] + mov mapFloorColor, eax + mov eax, [ebx+36] + cmp eax, MAX_SPRITES + ja preview_exit_error + mov spriteCount, eax + lea esi, [ebx+128] + mov edi, OFFSET gameMap + mov ecx, 1024/4 + rep movsd + push esi + mov esi, OFFSET gameMap + mov ecx, MAP_SIZE +preview_cell_check: + lodsb + cmp al, 15 + ja preview_exit_error + loop preview_cell_check + pop esi + mov edi, OFFSET spriteList + mov ecx, 32*sizeof SpriteStruct/4 + rep movsd + ; Validate every sprite, including unsaved inspector edits. + mov esi, OFFSET spriteList + mov ecx, spriteCount +preview_sprite_check: + test ecx, ecx + jz preview_textures + cmp DWORD PTR [esi].SpriteStruct.textureId, MAX_TEXTURES + jae preview_exit_error + cmp DWORD PTR [esi].SpriteStruct.x, 2048 + jae preview_exit_error + cmp DWORD PTR [esi].SpriteStruct.y, 2048 + jae preview_exit_error + cmp DWORD PTR [esi].SpriteStruct.scale, 1048576 + ja preview_exit_error + add esi, sizeof SpriteStruct + dec ecx + jmp preview_sprite_check +preview_textures: + mov eax, [ebx+48] + cmp eax, previewTextureRevision + je preview_scene + mov previewTextureRevision, eax + lea esi, [ebx+2016] + mov edi, OFFSET textureBuffer + mov ecx, MAX_TEXTURES*TEX_SIZE_BYTES/4 + rep movsd +preview_scene: + call Render3DScene + mov ebx, previewMemory + cmp DWORD PTR [ebx+40], 0 + je preview_copy_frame + mov cutsceneSubtitle, -1 + cmp BYTE PTR [ebx+1920], 0 + je preview_overlay + lea esi, [ebx+1920] + mov edi, OFFSET cutsceneStrings + mov ecx, 96/4 + rep movsd + mov BYTE PTR [cutsceneStrings+95], 0 + mov cutsceneStringCount, 1 + mov cutsceneSubtitle, 0 +preview_overlay: + call RenderCutsceneOverlay + mov ebx, previewMemory + mov eax, [ebx+44] + cmp eax, 16 + ja preview_exit_error + mov cutsceneFade, eax + call ApplyCutsceneFade +preview_copy_frame: + mov esi, OFFSET screenBuffer + mov ebx, previewMemory + lea edi, [ebx+1050592] + mov ecx, FRAME_BUFFER_SIZE/4 + rep movsd + mov eax, 2 + xchg eax, [ebx+8] ; Publish complete frame (full memory barrier). + jmp preview_wait +preview_exit_ok: + invoke UnmapViewOfFile, previewMemory + invoke CloseHandle, previewParent + invoke CloseHandle, previewHandle + invoke ExitProcess, 0 +preview_exit_error: + invoke ExitProcess, 2 +preview_not_requested: + ret +TryEnginePreview ENDP diff --git a/include/engine_raycaster.inc b/include/engine_raycaster.inc index 9e0a5b1..e40de16 100644 --- a/include/engine_raycaster.inc +++ b/include/engine_raycaster.inc @@ -4,6 +4,9 @@ .code +RenderSprites PROTO :DWORD +RenderGlass PROTO + ; ------------------------------------------------------------------------------ ; Render3DScene: Full frame 2.5D raycasting pass (Floor, Ceiling, Walls, Sprites) ; ------------------------------------------------------------------------------ @@ -15,6 +18,8 @@ Render3DScene PROC uses ebx ecx edx esi edi LOCAL stepX:DWORD, stepY:DWORD LOCAL sideDistX:DWORD, sideDistY:DWORD LOCAL deltaDistX:DWORD, deltaDistY:DWORD + LOCAL rawDist:DWORD + LOCAL perpWallDistFixed:DWORD ; 24.8 until projection LOCAL perpWallDist:DWORD LOCAL sideHit:DWORD ; 0 = X-wall (Vertical), 1 = Y-wall (Horizontal) LOCAL wallType:DWORD @@ -24,6 +29,13 @@ Render3DScene PROC uses ebx ecx edx esi edi LOCAL texStep:DWORD, texPos:DWORD LOCAL texPtr:DWORD LOCAL pScreenPixel:DWORD + LOCAL hasGlassHit:DWORD + LOCAL glassRawDist:DWORD + LOCAL glassPerpDistFixed:DWORD + LOCAL glassPerpDist:DWORD + LOCAL glassLineHeight:DWORD + LOCAL glassDrawStart:DWORD, glassDrawEnd:DWORD + LOCAL glassTexX:DWORD, glassSideHit:DWORD ; -------------------------------------------------------------------------- ; 1. Fast Background Clear: Ceiling (Top Half) and Floor (Bottom Half) @@ -43,16 +55,15 @@ Render3DScene PROC uses ebx ecx edx esi edi mov screenX, 0 ray_column_loop: - ; Calculate Ray Angle: playerAngle - FOV_HALF + (screenX * FOV_ANGLES / 320) + mov hasGlassHit, 0 + + ; Lookup Tangential Ray Angle Offset (flat plane perspective correction) mov eax, screenX - imul eax, FOV_ANGLES - xor edx, edx - mov ecx, SCREEN_W - div ecx ; eax = offset from left of FOV - add eax, playerAngle - sub eax, FOV_HALF - and eax, ANGLE_MASK - mov rayAngle, eax + mov edx, [tableRayAngleOffset + eax*4] + add edx, playerAngle + and edx, ANGLE_MASK + mov rayAngle, edx + mov eax, edx ; Ray Direction (16.16 Fixed Point) mov edx, [tableCos + eax*4] @@ -69,37 +80,47 @@ ray_column_loop: sar eax, 6 mov mapY, eax - ; Delta Dist X = abs(64 << 16 / rayDirX) + ; Delta Dist X in 24.8: (64 << 24) / abs(rayDirX) mov eax, rayDirX test eax, eax jnz calc_delta_x - mov eax, 1 ; avoid div by 0 + mov deltaDistX, 3FFFFFFFh + jmp delta_x_ready calc_delta_x: cdq xor eax, edx sub eax, edx ; eax = abs(rayDirX) mov ecx, eax - mov eax, (64 shl 16) + mov eax, (64 shl 24) xor edx, edx div ecx mov deltaDistX, eax +delta_x_ready: - ; Delta Dist Y = abs(64 << 16 / rayDirY) + ; Delta Dist Y in 24.8: (64 << 24) / abs(rayDirY) mov eax, rayDirY test eax, eax jnz calc_delta_y - mov eax, 1 + mov deltaDistY, 3FFFFFFFh + jmp delta_y_ready calc_delta_y: cdq xor eax, edx sub eax, edx ; eax = abs(rayDirY) mov ecx, eax - mov eax, (64 shl 16) + mov eax, (64 shl 24) xor edx, edx div ecx mov deltaDistY, eax +delta_y_ready: ; Calculate Step and Initial Side Dist + cmp rayDirX, 0 + jne nonzero_step_x + mov stepX, 1 + mov sideDistX, 3FFFFFFFh + jmp check_step_y +nonzero_step_x: cmp rayDirX, 0 jge ray_dir_x_pos mov stepX, -1 @@ -108,9 +129,10 @@ calc_delta_y: shl eax, 6 mov edx, playerX sub edx, eax - imul edx, deltaDistX - sar edx, 6 - mov sideDistX, edx + mov eax, edx + imul deltaDistX + shrd eax, edx, 6 + mov sideDistX, eax jmp check_step_y ray_dir_x_pos: @@ -120,11 +142,17 @@ ray_dir_x_pos: inc eax shl eax, 6 sub eax, playerX - imul eax, deltaDistX - sar eax, 6 + imul deltaDistX + shrd eax, edx, 6 mov sideDistX, eax check_step_y: + cmp rayDirY, 0 + jne nonzero_step_y + mov stepY, 1 + mov sideDistY, 3FFFFFFFh + jmp dda_loop +nonzero_step_y: cmp rayDirY, 0 jge ray_dir_y_pos mov stepY, -1 @@ -132,9 +160,10 @@ check_step_y: shl eax, 6 mov edx, playerY sub edx, eax - imul edx, deltaDistY - sar edx, 6 - mov sideDistY, edx + mov eax, edx + imul deltaDistY + shrd eax, edx, 6 + mov sideDistY, eax jmp dda_loop ray_dir_y_pos: @@ -143,8 +172,8 @@ ray_dir_y_pos: inc eax shl eax, 6 sub eax, playerY - imul eax, deltaDistY - sar eax, 6 + imul deltaDistY + shrd eax, edx, 6 mov sideDistY, eax ; -------------------------------------------------------------------------- @@ -177,6 +206,117 @@ step_in_y: test_hit: invoke GetMapCell, mapX, mapY mov wallType, eax + cmp eax, CELL_GLASS + jne not_glass_hit + + ; If this ray already recorded a glass wall, continue stepping through subsequent glass cells + cmp hasGlassHit, 0 + jne dda_loop + + ; Record first glass hit: + mov hasGlassHit, 1 + cmp sideHit, 0 + jne glass_dist_from_y + mov eax, sideDistX + sub eax, deltaDistX + jmp glass_apply_fisheye +glass_dist_from_y: + mov eax, sideDistY + sub eax, deltaDistY +glass_apply_fisheye: + mov glassRawDist, eax + mov ecx, screenX + mov ecx, [tableRayCos + ecx*4] + imul ecx + shrd eax, edx, 16 + cmp eax, 1 + jg @F + mov eax, 1 +@@: + mov glassPerpDistFixed, eax + add eax, 128 + shr eax, 8 + cmp eax, 1 + jae @F + mov eax, 1 +@@: + mov glassPerpDist, eax + + ; Glass line height & drawStart / drawEnd + mov eax, (64 * PROJ_DIST shl 8) + xor edx, edx + div glassPerpDistFixed + cmp eax, 1 + jge @F + mov eax, 1 +@@: + mov glassLineHeight, eax + + mov eax, SCREEN_HALF_H + mov edx, glassLineHeight + shr edx, 1 + sub eax, edx + cmp eax, 0 + jge @F + xor eax, eax +@@: + mov glassDrawStart, eax + + mov eax, SCREEN_HALF_H + mov edx, glassLineHeight + shr edx, 1 + add eax, edx + cmp eax, SCREEN_H + jl @F + mov eax, SCREEN_H - 1 +@@: + mov glassDrawEnd, eax + + ; Glass texX + cmp sideHit, 0 + jne glass_tex_hit_y + mov eax, glassRawDist + mov ebx, rayDirY + imul ebx + shrd eax, edx, 8 + mov ebx, playerY + shl ebx, 16 + add eax, ebx + jmp glass_compute_tex_x +glass_tex_hit_y: + mov eax, glassRawDist + mov ebx, rayDirX + imul ebx + shrd eax, edx, 8 + mov ebx, playerX + shl ebx, 16 + add eax, ebx +glass_compute_tex_x: + shr eax, 15 + and eax, TEX_MASK + cmp sideHit, 0 + jne glass_check_flip_y + cmp rayDirX, 0 + jle @F + mov ecx, TEX_MASK + sub ecx, eax + mov eax, ecx + jmp @F +glass_check_flip_y: + cmp rayDirY, 0 + jge @F + mov ecx, TEX_MASK + sub ecx, eax + mov eax, ecx +@@: + mov glassTexX, eax + mov eax, sideHit + mov glassSideHit, eax + + ; Continue stepping through the glass to the back wall! + jmp dda_loop + +not_glass_hit: invoke IsSolidCell, wallType test eax, eax jz dda_loop @@ -194,17 +334,23 @@ dist_from_y: sub eax, deltaDistY apply_fisheye_fix: - ; perpWallDist = dist * cos(rayAngle - playerAngle) - mov ebx, rayAngle - sub ebx, playerAngle - and ebx, ANGLE_MASK - mov ecx, [tableCos + ebx*4] - imul ecx ; edx:eax + mov rawDist, eax ; Euclidean distance in 24.8, also used for texture X + ; Fast tableRayCos lookup (precomputed perpendicular cosine per screen column) + mov ecx, screenX + mov ecx, [tableRayCos + ecx*4] + imul ecx ; edx:eax = rawDist * cos(rayAngleOffset) shrd eax, edx, 16 cmp eax, 1 ; Prevent division by zero jg @F mov eax, 1 @@: + mov perpWallDistFixed, eax + add eax, 128 + shr eax, 8 + cmp eax, 1 + jae rounded_distance_ready + mov eax, 1 +rounded_distance_ready: mov perpWallDist, eax ; Store in Depth Buffer for Sprite Occlusion @@ -214,9 +360,13 @@ apply_fisheye_fix: ; -------------------------------------------------------------------------- ; Projected Line Height on Screen: (64 * PROJ_DIST) / perpWallDist ; -------------------------------------------------------------------------- - mov eax, (64 * PROJ_DIST) + mov eax, (64 * PROJ_DIST shl 8) xor edx, edx - div perpWallDist + div perpWallDistFixed + cmp eax, 1 + jge @F + mov eax, 1 ; Clamp to >= 1 to prevent div by zero in texStep +@@: mov lineHeight, eax ; Calculate drawStart and drawEnd @@ -241,28 +391,33 @@ apply_fisheye_fix: @@: ; -------------------------------------------------------------------------- - ; Texture Coordinate X (texX) + ; Texture Coordinate X (texX) with full 128-texel sub-unit precision ; -------------------------------------------------------------------------- cmp sideHit, 0 jne tex_hit_y - ; wallHit = playerY + perpWallDist * rayDirY - mov eax, perpWallDist + ; wallHitFixed = (playerY << 16) + rawDist * rayDirY + mov eax, rawDist mov ebx, rayDirY imul ebx - shrd eax, edx, 16 - add eax, playerY + shrd eax, edx, 8 ; (24.8 * 16.16) -> 16.16 + mov ebx, playerY + shl ebx, 16 + add eax, ebx jmp compute_tex_x tex_hit_y: - mov eax, perpWallDist + ; wallHitFixed = (playerX << 16) + rawDist * rayDirX + mov eax, rawDist mov ebx, rayDirX imul ebx - shrd eax, edx, 16 - add eax, playerX + shrd eax, edx, 8 + mov ebx, playerX + shl ebx, 16 + add eax, ebx compute_tex_x: - and eax, 63 ; coordinate within 64-unit cell - shl eax, 1 ; scale 0..63 to 0..127 (TEX_W) + shr eax, 15 + and eax, TEX_MASK ; full 0..127 range (all 128 texture columns) mov texX, eax ; Flip texture coordinate depending on ray direction @@ -288,6 +443,10 @@ set_tex_ptr: and eax, 15 shl eax, 16 ; eax = wallType * 65536 add eax, OFFSET textureBuffer + cmp wallType, CELL_PORTAL + jne wall_texture_ready + mov eax, OFFSET portalTextureBuffer +wall_texture_ready: mov texPtr, eax ; Texture vertical sampling step (16.16 fixed point) @@ -369,14 +528,43 @@ write_wall_pixel: jmp wall_pixel_loop end_wall_stripe: + mov ecx, screenX + cmp hasGlassHit, 0 + je no_glass_in_col + mov eax, glassPerpDist + mov [glassDistBuffer + ecx*4], eax + mov eax, glassDrawStart + mov [glassDrawStartBuf + ecx*4], eax + mov eax, glassDrawEnd + mov [glassDrawEndBuf + ecx*4], eax + mov eax, glassLineHeight + mov [glassLineHeightBuf + ecx*4], eax + mov eax, glassTexX + mov [glassTexXBuf + ecx*4], eax + mov eax, glassSideHit + mov [glassSideHitBuf + ecx*4], eax + jmp col_glass_saved +no_glass_in_col: + mov DWORD PTR [glassDistBuffer + ecx*4], 0 +col_glass_saved: inc screenX cmp screenX, SCREEN_W jl ray_column_loop ; -------------------------------------------------------------------------- - ; 3. Render Sprites + ; 3. Render Sprites (Behind Glass & Normal Columns) ; -------------------------------------------------------------------------- - call RenderSprites + invoke RenderSprites, 1 + + ; -------------------------------------------------------------------------- + ; 4. Render Glass (Semi-Transparent Wall Pass) + ; -------------------------------------------------------------------------- + call RenderGlass + + ; -------------------------------------------------------------------------- + ; 5. Render Sprites (In Front of Glass) + ; -------------------------------------------------------------------------- + invoke RenderSprites, 2 ret Render3DScene ENDP @@ -390,11 +578,11 @@ Render3DScene ENDP ; per-column depth test vs depthBuffer, chroma key ; Sprite x/y are RAW world units (1 cell = 64 units), same scale as playerX/Y. ; ------------------------------------------------------------------------------ -RenderSprites PROC uses ebx ecx edx esi edi +RenderSprites PROC uses ebx ecx edx esi edi passFilter:DWORD LOCAL i:DWORD, j:DWORD, sprIdx:DWORD LOCAL spriteX:DWORD, spriteY:DWORD LOCAL transX:DWORD, transY:DWORD - LOCAL sprScreenX:DWORD, sprSize:DWORD + LOCAL sprScreenX:DWORD, sprSize:DWORD, baseSize:DWORD LOCAL origStartX:DWORD, origStartY:DWORD LOCAL drawStartX:DWORD, drawEndX:DWORD LOCAL drawStartY:DWORD, drawEndY:DWORD @@ -483,7 +671,7 @@ sort_inner: add ebx, OFFSET spriteList mov eax, [ebx].SpriteStruct.dist cmp eax, keyDist - jbe sort_insert ; dist[j] <= key -> insert after j + jae sort_insert ; dist[j] >= key -> keep far-to-near order ; Shift spriteOrder[j] -> spriteOrder[j+1] mov ecx, j @@ -566,6 +754,7 @@ sprite_loop: mov eax, (64 * PROJ_DIST) xor edx, edx div transY + mov baseSize, eax mov ecx, [ebx].SpriteStruct.scale test ecx, ecx jnz @F @@ -589,7 +778,7 @@ sprite_loop: ; Floor-anchored: sprite bottom sits at the floor line of its depth ; (wall bottom = horizon + size/2), top = bottom - size mov eax, SCREEN_HALF_H - mov edx, sprSize + mov edx, baseSize shr edx, 1 add eax, edx mov drawEndY, eax @@ -655,6 +844,30 @@ stripe_loop: cmp eax, drawEndX jg next_sprite + ; Filter by glass pass + mov ecx, stripe + mov edx, [glassDistBuffer + ecx*4] + + cmp passFilter, 1 + jne check_pass_front + + ; Pass 1 (behind glass or columns without glass): + test edx, edx + jz normal_sprite_depth_test + cmp transY, edx + jl advance_stripe ; Sprite is in front of glass -> defer to Pass 2 + jmp normal_sprite_depth_test + +check_pass_front: + cmp passFilter, 2 + jne normal_sprite_depth_test + ; Pass 2 (in front of glass only): + test edx, edx + jz advance_stripe ; No glass in this column -> already drawn + cmp transY, edx + jge advance_stripe ; Sprite is behind glass -> already drawn + +normal_sprite_depth_test: ; Depth test: sprite visible only if closer than wall in this column mov eax, transY mov ecx, stripe @@ -739,3 +952,172 @@ next_sprite: sprites_done: ret RenderSprites ENDP + +; ------------------------------------------------------------------------------ +; RenderGlass: Renders semi-transparent glass wall pass over background & sprites +; ------------------------------------------------------------------------------ +RenderGlass PROC uses ebx ecx edx esi edi + LOCAL screenX:DWORD + LOCAL drawStart:DWORD, drawEnd:DWORD, lineHeight:DWORD + LOCAL texX:DWORD, texPos:DWORD, texStep:DWORD + LOCAL texPtr:DWORD, pScreenPixel:DWORD + LOCAL sideHit:DWORD, perpDist:DWORD + + mov eax, CELL_GLASS + shl eax, 16 ; CELL_GLASS * TEX_SIZE_BYTES (8 * 65536) + add eax, OFFSET textureBuffer + mov texPtr, eax + + mov screenX, 0 +glass_col_loop: + mov ecx, screenX + cmp ecx, SCREEN_W + jge glass_done + + mov eax, [glassDistBuffer + ecx*4] + test eax, eax + jz next_glass_col + + mov perpDist, eax + mov eax, [glassDrawStartBuf + ecx*4] + mov drawStart, eax + mov eax, [glassDrawEndBuf + ecx*4] + mov drawEnd, eax + mov eax, [glassLineHeightBuf + ecx*4] + mov lineHeight, eax + mov eax, [glassTexXBuf + ecx*4] + mov texX, eax + mov eax, [glassSideHitBuf + ecx*4] + mov sideHit, eax + + ; Texture vertical step: texStep = (128 << 16) / lineHeight + mov eax, (128 shl 16) + xor edx, edx + div lineHeight + mov texStep, eax + + ; texPos = (drawStart - SCREEN_HALF_H + lineHeight / 2) * texStep + mov eax, drawStart + sub eax, SCREEN_HALF_H + mov ebx, lineHeight + shr ebx, 1 + add eax, ebx + imul eax, texStep + mov texPos, eax + + ; Screen pixel address: screenBuffer + (drawStart * SCREEN_PITCH) + (screenX * 4) + mov eax, drawStart + imul eax, SCREEN_PITCH + mov ecx, screenX + shl ecx, 2 + add eax, ecx + add eax, OFFSET screenBuffer + mov pScreenPixel, eax + + mov ecx, drawStart +glass_pixel_loop: + cmp ecx, drawEnd + jg next_glass_col + + ; Sample texture: texY = (texPos >> 16) & TEX_MASK + mov eax, texPos + shr eax, 16 + and eax, TEX_MASK + mov ebx, eax ; ebx = texY + + shl eax, 7 ; texY * 128 + add eax, texX + shl eax, 2 + add eax, texPtr + mov edx, [eax] ; edx = sampled texel (00RRGGBBh) + + ; Wall shading: Y-facing walls darkened 50% for 3D depth perception + cmp sideHit, 1 + jne @F + and edx, 00FEFEFEh + shr edx, 1 +@@: + ; Distance fog for glass + mov eax, perpDist + cmp eax, 350 + jl glass_blend + cmp eax, 700 + jge glass_fog_black + and edx, 00FEFEFEh + shr edx, 1 + jmp glass_blend +glass_fog_black: + mov edx, 00111111h + +glass_blend: + ; Check if this texel is the solid metal frame: + ; Outer 6 pixels: texX < 6 || texX >= 122 || texY < 6 || texY >= 122 + cmp texX, 6 + jl write_solid_frame + cmp texX, 122 + jge write_solid_frame + cmp ebx, 6 + jl write_solid_frame + cmp ebx, 122 + jge write_solid_frame + + ; Inside the glass pane: SEMI-TRANSPARENT BLEND! + ; Background pixel from screenBuffer + mov eax, pScreenPixel + mov eax, [eax] + + ; Check diagonal reflection streak: + mov esi, texX + add esi, ebx + and esi, 63 + cmp esi, 4 + jl glass_shine_streak + cmp esi, 24 + jl glass_pane_blend + cmp esi, 28 + jl glass_shine_streak + +glass_pane_blend: + ; 50% background + 50% glass tint: + and eax, 00FEFEFEh + shr eax, 1 + and edx, 00FEFEFEh + shr edx, 1 + add eax, edx + jmp write_glass_out + +glass_shine_streak: + ; Specular reflection: 50% background + 50% glass + specular glare + and eax, 00FEFEFEh + shr eax, 1 + and edx, 00FEFEFEh + shr edx, 1 + add eax, edx + ; Add specular highlight: + add eax, 00203040h + +write_glass_out: + mov edx, pScreenPixel + mov [edx], eax + jmp next_glass_pixel + +write_solid_frame: + mov eax, pScreenPixel + mov [eax], edx + +next_glass_pixel: + mov eax, texPos + add eax, texStep + mov texPos, eax + + add pScreenPixel, SCREEN_PITCH + inc ecx + jmp glass_pixel_loop + +next_glass_col: + inc screenX + jmp glass_col_loop + +glass_done: + ret +RenderGlass ENDP diff --git a/include/engine_textures.inc b/include/engine_textures.inc index ac29028..0978bdc 100644 --- a/include/engine_textures.inc +++ b/include/engine_textures.inc @@ -4,6 +4,8 @@ .code +GenerateDefaultSpriteTextures PROTO + ; ------------------------------------------------------------------------------ ; GenerateDefaultTextures: Procedurally creates 128x128 32-bit BGRA textures ; Zero external asset dependency - works out of the box on any machine! @@ -11,6 +13,12 @@ GenerateDefaultTextures PROC uses ebx ecx edx esi edi LOCAL texBase:DWORD, px:DWORD, py:DWORD, color:DWORD + mov edi, OFFSET textureBuffer + mov ecx, MAX_TEXTURES * TEX_SIZE_BYTES / 4 + xor eax, eax + rep stosd + call GenerateDefaultSpriteTextures + ; -------------------------------------------------------------------------- ; Texture 1: Red Brick Wall ; -------------------------------------------------------------------------- @@ -460,6 +468,72 @@ write_marble_pixel: cmp py, TEX_H jl marble_y_loop + ; -------------------------------------------------------------------------- + ; Texture 10: Portal / Dimensional Vortex (Swirling purple / cyan stargate) + ; -------------------------------------------------------------------------- + mov texBase, OFFSET portalTextureBuffer + + mov py, 0 +portal_y_loop: + mov px, 0 +portal_x_loop: + ; Base: deep cosmic dark purple + mov color, 002A0835h + + ; Stone arch frame on outer 8 pixels + mov eax, px + cmp eax, 8 + jl set_portal_arch + cmp eax, 120 + jge set_portal_arch + mov eax, py + cmp eax, 8 + jl set_portal_arch + + ; Calculate distance from center (64, 64) + mov eax, px + sub eax, 64 + imul eax, eax + mov edx, py + sub edx, 64 + imul edx, edx + add eax, edx ; r^2 = dx^2 + dy^2 + + ; Concentric glowing energy rings + cmp eax, 2500 ; r ~ 50 + jg write_portal_pixel + and eax, 15 + cmp eax, 3 + jg @F + mov color, 00D030F0h ; Bright violet energy ring + jmp write_portal_pixel +@@: + cmp eax, 8 + jg write_portal_pixel + mov color, 00E0E040h ; Cyan shimmer + jmp write_portal_pixel + +set_portal_arch: + mov color, 00484852h ; Carved rune stone arch + +write_portal_pixel: + mov eax, py + shl eax, 7 + add eax, px + shl eax, 2 + mov edi, texBase + add edi, eax + mov edx, color + mov [edi], edx + + inc px + cmp px, TEX_W + jl portal_x_loop + + inc py + cmp py, TEX_H + jl portal_y_loop + ret GenerateDefaultTextures ENDP @@ -471,65 +545,206 @@ GenerateDefaultTextures ENDP ; Returns: eax = 1 if pack loaded, 0 if procedural textures stay active. ; ------------------------------------------------------------------------------ LoadTexturePack PROC uses ebx ecx edx esi edi - LOCAL hFile:DWORD - LOCAL bytesRead:DWORD - LOCAL magic:DWORD, pkVersion:DWORD, slotCount:DWORD + LOCAL hFile:DWORD, bytesRead:DWORD + LOCAL magic:DWORD, pkVersion:WORD, slotCount:WORD + LOCAL payloadBytes:DWORD - invoke CreateFileA, OFFSET szTexPackPath, GENERIC_READ, FILE_SHARE_READ,\ - 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 + mov texPackLoaded, 0 + invoke CreateFileA, OFFSET szTexPackPath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 mov hFile, eax - cmp hFile, INVALID_HANDLE_VALUE + cmp eax, INVALID_HANDLE_VALUE je pack_fail - - ; Read 8-byte header (dd magic, dw version, dw slotCount) invoke ReadFile, hFile, ADDR magic, 4, ADDR bytesRead, 0 test eax, eax jz pack_close_fail cmp bytesRead, 4 - jl pack_close_fail + jne pack_close_fail cmp magic, TEXPACK_MAGIC jne pack_close_fail - invoke ReadFile, hFile, ADDR pkVersion, 2, ADDR bytesRead, 0 + test eax, eax + jz pack_close_fail cmp bytesRead, 2 - jl pack_close_fail + jne pack_close_fail cmp pkVersion, 1 jne pack_close_fail - invoke ReadFile, hFile, ADDR slotCount, 2, ADDR bytesRead, 0 + test eax, eax + jz pack_close_fail cmp bytesRead, 2 - jl pack_close_fail - - ; Clamp slot count to engine capacity - mov eax, slotCount - and eax, 0FFFFh + jne pack_close_fail + movzx eax, slotCount + test eax, eax + jz pack_close_fail cmp eax, MAX_TEXTURES - jle @F - mov eax, MAX_TEXTURES -@@: - mov slotCount, eax - test eax, eax - jz pack_close_fail - - ; Read slotCount * TEX_SIZE_BYTES pixels straight into textureBuffer - mov ecx, slotCount - shl ecx, 16 ; * 65536 - invoke ReadFile, hFile, OFFSET textureBuffer, ecx, ADDR bytesRead, 0 - test eax, eax - jz pack_close_fail - mov eax, slotCount + ja pack_close_fail shl eax, 16 - cmp bytesRead, eax + mov payloadBytes, eax + add eax, 8 + mov ebx, eax + invoke GetFileSize, hFile, 0 + cmp eax, ebx jne pack_close_fail + ; Commit only after the complete payload has been read successfully. + invoke ReadFile, hFile, OFFSET texturePackStaging, payloadBytes, ADDR bytesRead, 0 + test eax, eax + jz pack_close_fail + mov eax, payloadBytes + cmp bytesRead, eax + jne pack_close_fail + mov esi, OFFSET texturePackStaging + mov edi, OFFSET textureBuffer + mov ecx, payloadBytes + shr ecx, 2 + rep movsd invoke CloseHandle, hFile mov texPackLoaded, 1 mov eax, 1 ret - pack_close_fail: invoke CloseHandle, hFile pack_fail: xor eax, eax ret LoadTexturePack ENDP + +; Slots 10..15 remain sprite slots even when the map contains portals. +GenerateDefaultSpriteTextures PROC uses eax ebx ecx edx esi edi + LOCAL px:DWORD, py:DWORD, slot:DWORD, color:DWORD + mov edi, OFFSET textureBuffer + 10 * TEX_SIZE_BYTES + mov ecx, 6 * TEX_SIZE_BYTES / 4 + mov eax, COLOR_CHROMA_KEY + rep stosd + mov slot, 10 +sprite_default_slot: + mov py, 0 +sprite_default_y: + mov px, 0 +sprite_default_x: + mov color, COLOR_CHROMA_KEY + cmp slot, 10 + jne default_barrel + cmp px, 60 + jl lamp_shade + cmp px, 68 + jge lamp_shade + cmp py, 40 + jl lamp_shade + cmp py, 120 + jge lamp_shade + mov color, 00404040h +lamp_shade: + cmp px, 48 + jl lamp_foot + cmp px, 80 + jge lamp_foot + cmp py, 16 + jl lamp_foot + cmp py, 44 + jge lamp_foot + mov color, 00FFC030h +lamp_foot: + cmp px, 52 + jl default_sprite_write + cmp px, 76 + jge default_sprite_write + cmp py, 120 + jl default_sprite_write + cmp py, 126 + jge default_sprite_write + mov color, 00303030h + jmp default_sprite_write + +default_barrel: + cmp slot, 11 + jne default_statue + mov eax, px + sub eax, 64 + imul eax, eax + imul eax, 2704 + mov ebx, py + sub ebx, 70 + imul ebx, ebx + imul ebx, 1156 + add eax, ebx + cmp eax, 3125824 + jg default_sprite_write + mov color, 006A401Eh + mov eax, py + sub eax, 70 + cdq + xor eax, edx + sub eax, edx + cmp eax, 29 + jl barrel_highlight + cmp eax, 35 + jg barrel_highlight + mov color, 00555555h + jmp default_sprite_write +barrel_highlight: + cmp px, 53 + jge default_sprite_write + cmp eax, 26 + jge default_sprite_write + mov color, 008A5A2Eh + jmp default_sprite_write + +default_statue: + cmp px, 44 + jl statue_body + cmp px, 84 + jge statue_body + cmp py, 112 + jl statue_body + cmp py, 126 + jge statue_body + mov color, 00606060h +statue_body: + cmp px, 54 + jl statue_head + cmp px, 74 + jge statue_head + cmp py, 40 + jl statue_head + cmp py, 112 + jge statue_head + mov eax, px + xor eax, py + and eax, 7 + add eax, 08Ah + imul eax, 010101h + mov color, eax +statue_head: + mov eax, px + sub eax, 64 + imul eax, eax + mov ebx, py + sub ebx, 28 + imul ebx, ebx + add eax, ebx + cmp eax, 100 + jg default_sprite_write + mov color, 009A9A9Ah + +default_sprite_write: + mov edi, slot + shl edi, 16 + mov eax, py + shl eax, 7 + add eax, px + shl eax, 2 + add edi, eax + mov eax, color + mov DWORD PTR [textureBuffer + edi], eax + inc px + cmp px, TEX_W + jl sprite_default_x + inc py + cmp py, TEX_H + jl sprite_default_y + inc slot + cmp slot, 13 + jl sprite_default_slot + ret +GenerateDefaultSpriteTextures ENDP diff --git a/main.asm b/main.asm index 45a2175..14445bc 100644 --- a/main.asm +++ b/main.asm @@ -16,6 +16,9 @@ includelib winmm.lib ; Windows API Prototypes ExitProcess PROTO :DWORD GetModuleHandleA PROTO :DWORD +GetCommandLineA PROTO +GetFileSize PROTO :DWORD, :DWORD +GetForegroundWindow PROTO RegisterClassExA PROTO :DWORD CreateWindowExA PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD ShowWindow PROTO :DWORD, :DWORD @@ -39,6 +42,12 @@ CreateFileA PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :D ReadFile PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD WriteFile PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD CloseHandle PROTO :DWORD +PlaySoundA PROTO :DWORD, :DWORD, :DWORD +OpenFileMappingA PROTO :DWORD, :DWORD, :DWORD +MapViewOfFile PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD +UnmapViewOfFile PROTO :DWORD +OpenProcess PROTO :DWORD, :DWORD, :DWORD +WaitForSingleObject PROTO :DWORD, :DWORD ; Structures POINT STRUCT @@ -104,6 +113,8 @@ include include/engine_input.inc include include/engine_physics.inc include include/engine_raycaster.inc include include/engine_render2d.inc +include include/engine_cutscene.inc +include include/engine_preview.inc .code @@ -121,12 +132,13 @@ WndProc PROC hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD handle_keydown: cmp wParam, VK_KEY_ESCAPE - jne @F + jne check_f12 invoke PostQuitMessage, 0 mov isRunning, 0 xor eax, eax ret -@@: +check_f12: + ; Movement and action edges are handled only by PollInput. invoke DefWindowProcA, hWnd, uMsg, wParam, lParam ret @@ -207,6 +219,11 @@ Engine_Init ENDP ; Engine_RenderHUD: Draws 2D overlay text, controls, minimap, and FPS ; ------------------------------------------------------------------------------ Engine_RenderHUD PROC uses ebx ecx edx + cmp isCutsceneActive, 0 + je normal_engine_hud + call RenderCutsceneOverlay + ret +normal_engine_hud: ; 1. Top HUD Header invoke DrawString8x8, 10, 10, OFFSET strEngineName, COLOR_YELLOW @@ -219,13 +236,26 @@ Engine_RenderHUD PROC uses ebx ecx edx invoke DrawString8x8, 10, 218, OFFSET strControls1, COLOR_WHITE invoke DrawString8x8, 10, 228, OFFSET strControls3, COLOR_GREEN - ; 4. Door Interaction Hint (center screen) + ; 4. Door / Portal Interaction Hint (center screen) call CheckDoorHint - test eax, eax - jz @F - invoke DrawString8x8, 128, 150, OFFSET strDoorHint, COLOR_YELLOW -@@: + cmp eax, 1 + je show_door_hint + cmp eax, 2 + je show_portal_hint + jmp check_minimap +show_door_hint: + invoke DrawString8x8, 128, 150, OFFSET strDoorHint, COLOR_YELLOW + jmp check_minimap + +show_portal_hint: + invoke DrawString8x8, 110, 150, OFFSET strPortalHint, COLOR_CYAN + +check_minimap: + cmp mapErrorFrames, 0 + je hud_no_map_error + invoke DrawString8x8, 44, 164, OFFSET strMapLoadError, COLOR_RED +hud_no_map_error: ; 5. Minimap Radar (Toggle with 'M') call DrawMinimap @@ -237,12 +267,17 @@ Engine_RenderHUD ENDP ; ------------------------------------------------------------------------------ Engine_Frame PROC uses ebx esi edi ; 1. Input & Physics Update + cmp mapErrorFrames, 0 + je no_error_tick + dec mapErrorFrames +no_error_tick: call PollInput call UpdatePlayer ; 2. 3D Raycasting & 2D HUD Render call Render3DScene call Engine_RenderHUD + call ApplyCutsceneFade ; 2b. Screenshot request (F12): dump fresh framebuffer to BMP cmp keyScreenshot, 0 @@ -251,6 +286,9 @@ Engine_Frame PROC uses ebx esi edi call SaveScreenshot @@: + ; 2c. Screen Fade effect for sublevel transitions + call ApplyScreenFade + ; 3. Present Framebuffer to Screen via StretchDIBits (320x240 -> 1280x960) invoke StretchDIBits, hEngineDC,\ 0, 0, WINDOW_W, WINDOW_H,\ @@ -274,6 +312,14 @@ Engine_Frame PROC uses ebx esi edi mov fpsTimer, eax frame_done: + ; Reset one-frame input triggers + mov keyForward, 0 + mov keyBackward, 0 + mov keyStrafeLeft, 0 + mov keyStrafeRight, 0 + mov keyTurnLeft, 0 + mov keyTurnRight, 0 + mov keyAction, 0 ret Engine_Frame ENDP @@ -296,6 +342,69 @@ ss_done: ret SaveScreenshot ENDP +; Optional first argument: a quoted or unquoted starting map path. +; Assets and linked map basenames remain relative to the working directory. +ParseStartupMap PROC uses ebx ecx edx esi edi + invoke GetCommandLineA + mov esi, eax + mov startupMapPath, 0 + cmp byte ptr [esi], 34 + jne skip_executable_word + inc esi +skip_executable_quote: + lodsb + test al, al + jz startup_arg_done + cmp al, 34 + jne skip_executable_quote + jmp skip_argument_spaces +skip_executable_word: + lodsb + test al, al + jz startup_arg_done + cmp al, 32 + jne skip_executable_word +skip_argument_spaces: + cmp byte ptr [esi], 32 + je consume_argument_space + cmp byte ptr [esi], 9 + jne copy_startup_argument +consume_argument_space: + inc esi + jmp skip_argument_spaces +copy_startup_argument: + xor ebx, ebx + cmp byte ptr [esi], 34 + jne startup_argument_loop_init + mov ebx, 1 + inc esi +startup_argument_loop_init: + mov edi, OFFSET startupMapPath + mov ecx, MAX_PATH_BYTES - 1 +startup_argument_loop: + lodsb + test al, al + jz terminate_startup_arg + cmp al, 34 + je terminate_startup_arg + test ebx, ebx + jnz write_startup_char + cmp al, 32 + je terminate_startup_arg + cmp al, 9 + je terminate_startup_arg +write_startup_char: + stosb + dec ecx + jnz startup_argument_loop + mov startupMapPath, 0 + ret +terminate_startup_arg: + mov byte ptr [edi], 0 +startup_arg_done: + ret +ParseStartupMap ENDP + ; ------------------------------------------------------------------------------ ; main: Application Entry Point & Game Loop ; ------------------------------------------------------------------------------ @@ -303,6 +412,8 @@ main PROC LOCAL msg:MSG LOCAL curTick:DWORD, elapsed:DWORD + call ParseStartupMap + call TryEnginePreview call Engine_Init main_loop: @@ -344,6 +455,7 @@ do_tick: jmp main_loop exit_loop: + call StopCutscene invoke ReleaseDC, hEngineWnd, hEngineDC invoke timeEndPeriod, 1 invoke ExitProcess, 0 diff --git a/main.obj b/main.obj index 626945f6baf952e3ff637829b86ee9ffa36c71fb..2e9ab629d90380124e905f91f1ef6c5a66767bc7 100644 GIT binary patch literal 31105 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 J9M1xj{~xHOEqed} diff --git a/tests/cutscene_editor_checks.inl b/tests/cutscene_editor_checks.inl new file mode 100644 index 0000000..49d4c5e --- /dev/null +++ b/tests/cutscene_editor_checks.inl @@ -0,0 +1,88 @@ +static void RunCutsceneChecks(EditorApp& app) { + Check(app.LoadLevel("../assets/map.dat"), "cutscene test starts from legacy map"); + app.playerStartAngle = 508; app.playerStartY = 3; + app.cutscene.flags = CUTSCENE_AUTOPLAY; + app.cutscene.strings = {"Привет, мир!", "quiet.wav"}; + app.cutscene.events = { + {0,OP_MOVE_CAM_TO,0,288,160,4}, {0,OP_PAN_CAM_TO,0,4,4,0}, + {0,OP_FADE_SCREEN,0,16,4,0}, {0,OP_SHOW_SUBTITLE,0,0,0,0}, + {0,OP_PLAY_SOUND,0,1,0,0}, {1,OP_WAIT,0,2,0,0}, + {2,OP_HIDE_SUBTITLE,0,0,0,0}, {4,OP_FADE_SCREEN,0,0,4,0}, {8,OP_END,0,0,0,0} + }; + Check(app.SaveLevel("../assets/scene.dat"), "save v4 cutscene, Russian text and sound reference"); + BinaryLevel level; std::string error; + Check(ReadLevelFile("../assets/scene.dat",level,error) && level.header.version == 4 && level.cutscene.events.size() == 9 && + level.cutscene.strings[0] == "Привет, мир!" && level.cutscene.flags == CUTSCENE_AUTOPLAY, + "v4 track round trip retains UTF8 and autoplay"); + std::string encoded; + Check(CutsceneEncode("Привет, мир!",encoded) && encoded.size() == 12 && static_cast(encoded[0]) == 0xCF, + "Russian subtitles use the runtime CP1251 font"); + Check(!CutsceneEncode("😀",encoded), "unrepresentable subtitle is rejected"); + CutscenePreview preview; + preview.Start(160,224,508); + std::ofstream trace("../assets/cutscene_reference.bin",std::ios::binary); + int audioCount = 0; + for (int tick=0;tick<=8;++tick) { + preview.Step(app.cutscene,[&](int id,bool loop) { if(id==1 && !loop) ++audioCount; }); + int state[6] = {preview.x,preview.y,preview.angle,preview.fade,preview.subtitle,preview.active?1:0}; + trace.write(reinterpret_cast(state),sizeof(state)); + if (tick==2) Check(preview.x==224 && preview.y==192 && preview.angle==0 && preview.fade==8 && preview.subtitle==0, + "preview interpolates signed movement, shortest angle, fade and wait"); + if (tick==3) Check(preview.subtitle==-1, "wait delays a following hide command until its deadline"); + } + trace.close(); + Check(preview.x==288 && preview.y==160 && preview.angle==4 && !preview.active && preview.fade==0 && audioCount==1, + "preview reaches exact targets and stops cleanly"); + auto invalid = app.cutscene; + invalid.events[0].dataId=3601; + Check(!ValidateCutscene(invalid,&app.map[0][0],app.transitions.size(),error), "oversized camera duration rejected"); + invalid=app.cutscene;invalid.events[3].paramA=99; + Check(!ValidateCutscene(invalid,&app.map[0][0],app.transitions.size(),error), "invalid string reference rejected"); + invalid=app.cutscene;invalid.events.pop_back(); + Check(!ValidateCutscene(invalid,&app.map[0][0],app.transitions.size(),error), "missing end marker rejected"); + invalid=app.cutscene;invalid.events[0].paramA=0;invalid.events[0].paramB=0; + Check(!ValidateCutscene(invalid,&app.map[0][0],app.transitions.size(),error), "camera point in a wall rejected"); + for (const char* file : {"scene_badop.dat","scene_badref.dat","scene_badtext.dat","scene_badorder.dat","scene_badflags.dat","scene_noend.dat"}) { + Check(!app.LoadLevel(std::string("../assets/")+file) && app.cutscene.events.size()==9, + "malformed cutscene load preserves editor track"); + } + std::string start, engine; + Check(app.PreparePlaytest(start,engine) && start=="assets\\scene.dat", "F5 packages v4 track and referenced WAV"); + app.CleanupPlaytest(); + app.cutscene.strings[1]="absent.wav";start.clear();engine.clear(); + Check(!app.PreparePlaytest(start,engine), "F5 rejects missing cutscene audio before launch"); + app.CleanupPlaytest(); + app.LoadLevel("../assets/map.dat"); + Check(app.cutscene.events.empty() && app.cutscene.strings.empty(), "legacy map clears previous track"); + app.AddCutsceneEvent(OP_MOVE_CAM_TO); + Check(app.cutscene.events.size()==2 && app.placeCameraPoint, "timeline camera button inserts an end marker and enables map placement"); + app.Undo();Check(app.cutscene.events.empty(), "undo includes cutscene commands"); + app.Redo();Check(app.cutscene.events.size()==2, "redo restores cutscene commands"); + app.cutscene = {};app.selectedCutsceneEvent=-1; + for(int i=0;i<40;++i) { app.AddCutsceneEvent(OP_SHOW_SUBTITLE);app.DeleteCutsceneEvent(); } + Check(app.cutscene.strings.empty(), "deleting commands reclaims string pool slots"); + app.AddCutsceneEvent(OP_CHANGE_SUBLEVEL); + app.SetCell(4,2,CELL_EMPTY); + Check(std::none_of(app.cutscene.events.begin(),app.cutscene.events.end(),[](const auto& e){return e.opCode==OP_CHANGE_SUBLEVEL;}), + "removing a portal repairs cutscene transition references"); + app.LoadLevel("../assets/scene.dat");app.showCutsceneTimeline=true; + ImGui::CreateContext(); + auto& io=ImGui::GetIO();io.DisplaySize=ImVec2(1360,840);io.DeltaTime=1.0f/60;io.IniFilename=nullptr; + unsigned char* pixels;int w,h;io.Fonts->GetTexDataAsRGBA32(&pixels,&w,&h); + ImGui::NewFrame();app.RenderUI();ImGui::Render(); + Check(ImGui::GetDrawData()->TotalVtxCount>0,"editor timeline renders without a native window"); + io.AddKeyEvent(ImGuiKey_F5,true); + ImGui::NewFrame(); io.WantCaptureKeyboard=true; io.WantTextInput=true; + app.HandleHotkeys(); + Check(app.isEngineRunning,"F5 launches even when ImGui captures keyboard input"); + ImGui::Render(); + if(app.hEngineProcess) WaitForSingleObject(app.hEngineProcess,5000); + app.CheckPlaytestProcess(); + io.AddKeyEvent(ImGuiKey_F5,false); io.AddKeyEvent(ImGuiKey_F6,true); + ImGui::NewFrame(); io.WantCaptureKeyboard=true; io.WantTextInput=true; + app.HandleHotkeys(); + Check(!app.showCutsceneTimeline,"F6 remains available while a text widget owns focus"); + ImGui::Render(); + ImGui::DestroyContext(); + app.showCutsceneTimeline=false; +} diff --git a/tests/cutscene_engine_checks.inc b/tests/cutscene_engine_checks.inc new file mode 100644 index 0000000..38d56d7 --- /dev/null +++ b/tests/cutscene_engine_checks.inc @@ -0,0 +1,211 @@ +.data +sceneFile db 'scene.dat',0 +sceneInvalidOp db 'scene_badop.dat',0 +sceneInvalidRef db 'scene_badref.dat',0 +sceneInvalidText db 'scene_badtext.dat',0 +sceneInvalidOrder db 'scene_badorder.dat',0 +sceneInvalidFlags db 'scene_badflags.dat',0 +sceneMissingEnd db 'scene_noend.dat',0 +sceneTraceFile db 'cutscene_trace.bin',0 +sceneFrameFile db 'cutscene_frame.bgra',0 +sceneTrace dd 54 dup(0) +lastSoundFlags dd 0 +soundCapture db 128 dup(0) +.code +AuditPlaySoundA PROC uses ebx ecx esi edi, path:DWORD, module:DWORD, flags:DWORD + mov eax, flags + mov lastSoundFlags, eax + mov esi, path + mov soundCapture, 0 + test esi, esi + jz sound_mock_done + mov edi, OFFSET soundCapture + mov ecx, 127 +sound_mock_copy: + lodsb + stosb + test al, al + jz sound_mock_done + loop sound_mock_copy + mov byte ptr [edi], 0 +sound_mock_done: + mov eax, 1 + ret +AuditPlaySoundA ENDP + +RunCutsceneChecks PROC uses ebx ecx edx esi edi + invoke LoadSublevelBinary, OFFSET sceneFile, -1, -1, 0 + CHECK eax, 1 ; load v4 track with Russian subtitles + CHECK cutsceneCount, 9 ; all serialized cutscene events loaded + CHECK cutsceneStringCount, 2 ; all serialized strings loaded + CHECK cutscenePending, 1 ; autoplay waits until normal player update + movzx eax, BYTE PTR [cutsceneStrings] + CHECK eax, 0CFh ; Russian text arrives as CP1251 bytes + call StartCutscene + mov esi, 0 +scene_trace_tick: + call UpdateCutscene + mov edi, esi + imul edi, 24 + add edi, OFFSET sceneTrace + mov eax, playerX + stosd + mov eax, playerY + stosd + mov eax, playerAngle + stosd + mov eax, cutsceneFade + stosd + mov eax, cutsceneSubtitle + stosd + mov eax, isCutsceneActive + stosd + cmp esi, 0 + jne scene_trace_not_zero + CHECK lastSoundFlags, 00020003h ; WAV event uses asynchronous filename playback + CHECK DWORD PTR [soundCapture+14], 65697571h ; sound path is assets/sounds/quiet.wav +scene_trace_not_zero: + cmp esi, 2 + jne scene_trace_not_two + CHECK playerX, 224 ; camera reaches exact interpolated X midpoint + CHECK playerY, 192 ; camera interpolates a negative Y delta + CHECK playerAngle, 0 ; pan wraps through zero along shortest arc + CHECK cutsceneFade, 8 ; fade reaches midpoint + CHECK cutsceneSubtitle, 0 ; wait blocks a later hide command +scene_trace_not_two: + inc esi + cmp esi, 9 + jl scene_trace_tick + invoke Dump, OFFSET sceneTraceFile, OFFSET sceneTrace, 216 + CHECK playerX, 288 ; movement reaches its exact target before END + CHECK playerY, 160 ; Y target retained after END + CHECK playerAngle, 4 ; angle target retained after END + CHECK isCutsceneActive, 0 ; END returns control + CHECK cutsceneFade, 0 ; END clears cinematic darkening + CHECK cutsceneSubtitle, -1 ; END clears subtitles + CHECK lastSoundFlags, 0 ; END stops audio + + invoke LoadSublevelBinary, OFFSET sceneFile, -1, -1, 0 + mov keyForward, 1 + mov keyCutscene, 0 + mov keySkipScene, 0 + call UpdatePlayer + CHECK isCutsceneActive, 1 ; player update starts autoplay + CHECK playerX, 160 ; movement input does not move the player during the first scene frame + call UpdatePlayer + CHECK playerX, 192 ; next frame is driven only by cinematic interpolation + mov keySkipScene, 1 + call UpdatePlayer + CHECK isCutsceneActive, 0 ; Tab skips and releases camera control + mov keySkipScene, 0 + mov keyCutscene, 1 + call UpdatePlayer + CHECK isCutsceneActive, 1 ; C can restart a finished scene + mov keyCutscene, 0 + mov keyForward, 0 + mov testFocus, 1 + mov hEngineWnd, 1 + mov testKeys[VK_KEY_W*2], 8000h + mov testKeys[VK_KEY_TAB*2], 8000h + call PollInput + movzx eax, keyForward + CHECK eax, 0 ; scene masks normal movement input + movzx eax, keySkipScene + CHECK eax, 1 ; skip input remains available in a scene + call StopCutscene + call PollInput + movzx eax, keyForward + CHECK eax, 1 ; normal input returns after scene stop + mov testKeys[VK_KEY_W*2], 0 + mov testKeys[VK_KEY_TAB*2], 0 + mov keyForward, 0 + mov keySkipScene, 0 + invoke LoadSublevelBinary, OFFSET sceneFile, -1, -1, 0 + call StartCutscene + invoke LoadSublevelBinary, OFFSET sceneInvalidOp, -1, -1, 0 + CHECK eax, 0 ; unknown cutscene opcode rejected + CHECK isCutsceneActive, 1 ; invalid track load keeps currently running scene + CHECK cutsceneCount, 9 ; invalid track load keeps original commands + invoke LoadSublevelBinary, OFFSET sceneInvalidRef, -1, -1, 0 + CHECK eax, 0 ; invalid subtitle reference rejected + invoke LoadSublevelBinary, OFFSET sceneInvalidText, -1, -1, 0 + CHECK eax, 0 ; unterminated string rejected + invoke LoadSublevelBinary, OFFSET sceneInvalidOrder, -1, -1, 0 + CHECK eax, 0 ; unsorted commands rejected + invoke LoadSublevelBinary, OFFSET sceneInvalidFlags, -1, -1, 0 + CHECK eax, 0 ; unsupported scene flags rejected + invoke LoadSublevelBinary, OFFSET sceneMissingEnd, -1, -1, 0 + CHECK eax, 0 ; scene without END rejected + invoke LoadSublevelBinary, OFFSET mainPath, -1, -1, 0 + CHECK isCutsceneActive, 0 ; a successful room load stops old playback + CHECK cutsceneCount, 0 ; a legacy room clears old commands + CHECK cutsceneStringCount, 0 ; a legacy room clears old string references + + invoke LoadSublevelBinary, OFFSET sceneFile, -1, -1, 0 + mov DWORD PTR [cutsceneEvents+3*sizeof CutsceneEvent+CutsceneEvent.paramB], 2 + call StartCutscene + call UpdateCutscene + call UpdateCutscene + call UpdateCutscene + CHECK cutsceneSubtitle, -1 ; timed subtitle expires even while a WAIT blocks events + mov cutsceneSubtitle, 0 + mov edi, OFFSET screenBuffer + mov ecx, SCREEN_W*SCREEN_H + mov eax, COLOR_BLUE + rep stosd + call RenderCutsceneOverlay + CHECK DWORD PTR [screenBuffer], COLOR_BLACK ; cinematic top letterbox + CHECK DWORD PTR [screenBuffer+200*SCREEN_PITCH], COLOR_BLACK ; cinematic bottom letterbox + CHECK DWORD PTR [screenBuffer+100*SCREEN_PITCH], COLOR_BLUE ; picture area remains visible + CHECK DWORD PTR [screenBuffer+159*SCREEN_PITCH], 0000007Fh ; subtitle panel is semitransparent + mov edi, OFFSET screenBuffer+160*SCREEN_PITCH + mov ecx, 28*SCREEN_W + xor ebx, ebx +scene_white_pixel: + cmp DWORD PTR [edi], COLOR_WHITE + jne scene_next_pixel + inc ebx +scene_next_pixel: + add edi, 4 + loop scene_white_pixel + xor eax, eax + test ebx, ebx + setnz al + CHECK eax, 1 ; Russian subtitle glyphs are drawn + invoke Dump, OFFSET sceneFrameFile, OFFSET screenBuffer, FRAME_BUFFER_SIZE + mov edi, OFFSET screenBuffer + mov ecx, SCREEN_W*SCREEN_H + mov eax, 00123456h + rep stosd + mov cutsceneFade, 8 + call ApplyCutsceneFade + CHECK DWORD PTR [screenBuffer], 00091A2Bh ; fade blends each RGB channel correctly + mov cutsceneFade, 16 + call ApplyCutsceneFade + CHECK DWORD PTR [screenBuffer], 0 ; full cinematic fade produces black + call StopCutscene + + ; Scene transitions use the same validated room switch and fade sequencer. + invoke LoadSublevelBinary, OFFSET sceneFile, -1, -1, 0 + mov cutsceneCount, 2 + mov edi, OFFSET cutsceneEvents + mov ecx, 8 + xor eax, eax + rep stosd + mov BYTE PTR [cutsceneEvents+CutsceneEvent.opCode], OP_CHANGE_SUBLEVEL + mov WORD PTR [cutsceneEvents+sizeof CutsceneEvent], 1 + call StartCutscene + mov cutsceneFade, 16 + call UpdateCutscene + CHECK isCutsceneActive, 0 ; changing sublevel stops the old scene + CHECK fadeState, 1 ; scripted transition starts its configured fade + CHECK fadeLevel, 16 ; transition preserves an existing cinematic fade without a bright flash + mov esi, 32 +scene_transition_fade: + call ApplyScreenFade + dec esi + jnz scene_transition_fade + CHECK spriteCount, 1 ; scripted transition loads the destination room + CHECK cutsceneCount, 0 ; scripted transition cannot reuse old scene buffers + ret +RunCutsceneChecks ENDP diff --git a/tests/editor_regressions.cpp b/tests/editor_regressions.cpp new file mode 100644 index 0000000..b024c18 --- /dev/null +++ b/tests/editor_regressions.cpp @@ -0,0 +1,157 @@ +// Compile the real editor implementation in this translation unit so the +// scenarios can exercise tools and playtest preparation without opening a UI. +#include +#include +#include +#include +#define private public +#include "../editor/src/editor_app.h" +#undef private +#include "../editor/src/editor_app.cpp" +#include + +static int failures = 0, checks = 0; +static void Check(bool ok, const char* name) { + ++checks; + if (!ok) ++failures; + std::cout << (ok ? "PASS " : "FAIL ") << name << '\n'; +} +static std::vector Bytes(const fs::path& path) { + std::ifstream in(path, std::ios::binary); + return {std::istreambuf_iterator(in), {}}; +} + +#include "cutscene_editor_checks.inl" +#include "viewport_editor_checks.inl" + +int main(int argc, char** argv) { + EditorApp app; + std::vector defaults; + ReadTextureSlots("absent-defaults.bin", defaults); + { + std::ofstream out("../assets/defaults.bin", std::ios::binary); + out.write(reinterpret_cast(defaults.data()), defaults.size()); + } + Check(app.LoadLevel("../assets/map.dat"), "load v3 main map"); + Check(app.sprites.size() == 2 && app.transitions.size() == 1, "load all entities"); + Check(app.LoadLevel("../assets/legacy1.dat") && app.sprites[0].x == 224, "convert v1 coordinates"); + Check(app.LoadLevel("../assets/legacy2.dat") && app.transitions.size() == 1, "read extended v2 maps"); + Check(app.LoadLevel("../assets/black.dat") && app.ceilingColor == 0 && app.floorColor == 0, "apply black palette"); + Check(app.LoadLevel("../assets/map.dat"), "restore main map"); + auto before = app.CaptureSnapshot(); + auto pathBefore = app.currentFilePath; + for (const char* name : {"truncated.dat", "overflow.dat", "badname.dat", "badspawn.dat", "orphan.dat", "duplicate.dat"}) { + Check(!app.LoadLevel(std::string("../assets/") + name), name); + Check(app.currentFilePath == pathBefore && app.sprites.size() == before.sprites.size() && + app.transitions.size() == before.transitions.size() && !std::memcmp(app.map, before.map, sizeof(app.map)), + "failed load preserves current room"); + } + Check(app.SaveLevel("../assets/saved.dat"), "save current format atomically"); + BinaryLevel saved; std::string error; + Check(ReadLevelFile("../assets/saved.dat", saved, error) && saved.header.version == MAP_FORMAT_VERSION, "saved map reads back"); + auto goodSave = Bytes("../assets/saved.dat"); + app.playerStartX = -1; + Check(!app.SaveLevel("../assets/saved.dat") && Bytes("../assets/saved.dat") == goodSave, + "invalid save does not overwrite a valid file"); + app.playerStartX = 2; + + std::vector rgba(128 * 128 * 4); + for (int i = 0; i < 128 * 128; ++i) { + rgba[4*i] = 0x11; rgba[4*i+1] = 0x22; rgba[4*i+2] = 0x33; rgba[4*i+3] = 255; + } + stbi_write_png("wall.png", 128, 128, 4, rgba.data(), 128 * 4); + Check(app.ImportTextureImage(1, false, "wall.png"), "first PNG import creates directories and pack"); + auto pack = Bytes("../assets/textures/texturepack.bin"); + Check(pack.size() == 8 + 16 * 65536, "complete pack layout"); + Check(pack[8+65536] == 0x33 && pack[9+65536] == 0x22 && pack[10+65536] == 0x11 && pack[11+65536] == 0, + "RGBA converts to engine BGRA"); + auto fallback = MakeDefaultTextureSlot(2); + Check(std::equal(fallback.begin(), fallback.end(), pack.begin() + 8 + 2 * 65536), "first import retains fallback walls"); + auto lamp = MakeDefaultTextureSlot(10); + Check(std::equal(lamp.begin(), lamp.end(), pack.begin() + 8 + 10 * 65536), "first import retains sprite defaults"); + for (int y = 0; y < 128; ++y) for (int x = 0; x < 64; ++x) rgba[4*(y*128+x)+3] = 0; + stbi_write_png("sprite.png", 128, 128, 4, rgba.data(), 128 * 4); + Check(app.ImportTextureImage(11, true, "sprite.png"), "import transparent sprite"); + auto updated = Bytes("../assets/textures/texturepack.bin"); + const auto* sprite = updated.data() + 8 + 11 * 65536; + Check(sprite[0] == 255 && sprite[1] == 0 && sprite[2] == 255 && sprite[3] == 0 && sprite[400] == 0x33, + "alpha converts to chroma key"); + Check(std::equal(pack.begin(), pack.begin() + 8 + 11 * 65536, updated.begin()), "sprite import preserves other slots"); + fs::copy_file("../assets/textures/texturepack.bin", "../assets/imported.bin", fs::copy_options::overwrite_existing); + auto corrupt = updated; corrupt.resize(100); + { std::ofstream out("../assets/textures/texturepack.bin", std::ios::binary); out.write(reinterpret_cast(corrupt.data()), corrupt.size()); } + Check(!app.ImportTextureImage(1, false, "wall.png") && Bytes("../assets/textures/texturepack.bin") == corrupt, + "invalid existing pack is preserved"); + fs::copy_file("../assets/imported.bin", "../assets/textures/texturepack.bin", fs::copy_options::overwrite_existing); + Check(app.ResetTextureSlotToDefault(2), "reset uses the same safe pack writer"); + auto reset = Bytes("../assets/textures/texturepack.bin"); + Check(std::equal(updated.begin() + 8 + 11 * 65536, updated.end(), reset.begin() + 8 + 11 * 65536), + "reset preserves imported sprites"); + Check(app.ImportSoundAudio("quiet.wav"), "WAV import without scripts"); + app.StopAudioSound(); + auto manifest = Bytes("../assets/sounds/sounds.inc"); + Check(Bytes("quiet.wav") == Bytes("../assets/sounds/quiet.wav") && + std::string(manifest.begin(), manifest.end()).find("SND_QUIET") != std::string::npos, "sound file and manifest"); + + app.InitDefaultLevel(); + Check(app.SetCell(2, 2, CELL_PORTAL) && app.transitions.size() == 1, "brush creates portal and transition together"); + app.FloodFill(2, 2, CELL_PORTAL, CELL_EMPTY); + Check(app.map[2][2] == CELL_EMPTY && app.transitions.empty(), "fill removes transition with portal"); + app.map[2][2] = CELL_METAL; app.map[2][3] = CELL_METAL; + app.FloodFill(2, 2, CELL_METAL, CELL_PORTAL); + Check(app.transitions.size() == 2 && app.map[2][2] == CELL_PORTAL && app.map[2][3] == CELL_PORTAL, + "small fill creates every transition"); + app.SetCell(2, 2, CELL_EMPTY); app.SetCell(3, 2, CELL_EMPTY); + auto fillBefore = app.CaptureSnapshot(); + app.FloodFill(2, 2, CELL_EMPTY, CELL_PORTAL); + Check(app.transitions.empty() && !std::memcmp(app.map, fillBefore.map, sizeof(app.map)), "oversized portal fill is atomic"); + app.PushUndo(); app.SetCell(2, 2, CELL_PORTAL); app.Undo(); + Check(app.map[2][2] == CELL_EMPTY && app.transitions.empty(), "undo restores both grid and transitions"); + app.Redo(); Check(app.map[2][2] == CELL_PORTAL && app.transitions.size() == 1, "redo restores portal"); + app.currentTool = TOOL_PLAYER_SPAWN; app.ApplyTool(2, 2); + Check(app.map[2][2] == CELL_EMPTY && app.transitions.empty(), "moving spawn onto a portal removes its trigger"); + app.InitDefaultLevel(); + for (int i = 0; i < 16; ++i) app.SetCell(i + 1, 20, CELL_PORTAL); + Check(!app.SetCell(20, 20, CELL_PORTAL) && app.map[20][20] != CELL_PORTAL && app.transitions.size() == 16, + "portal limit cannot create orphan cells"); + + Check(app.LoadLevel("../assets/sublevel_02.dat"), "open sublevel for F5"); + auto originalMain = Bytes("../assets/map.dat"), originalSub = Bytes("../assets/sublevel_02.dat"); + auto originalPath = app.currentFilePath; + app.map[12][12] = CELL_MARBLE; // unsaved edit included only in preview + app.LaunchPlaytest(); + Check(app.isEngineRunning && app.currentFilePath == originalPath, "F5 preserves current file path"); + Check(Bytes("../assets/map.dat") == originalMain && Bytes("../assets/sublevel_02.dat") == originalSub, + "F5 never overwrites source maps"); + fs::path sandbox = app.playtestDirectory; + BinaryLevel preview; + Check(ReadLevelFile((sandbox / "assets/sublevel_02.dat").string(), preview, error) && preview.cells[12*32+12] == CELL_MARBLE, + "F5 includes unsaved edits"); + Check(Bytes(sandbox / "assets/map.dat") == originalMain, "reverse portal keeps the real main map"); + Check(Bytes(sandbox / "assets/textures/texturepack.bin") == Bytes("../assets/textures/texturepack.bin"), "F5 copies imported resources"); + if (app.hEngineProcess) WaitForSingleObject(app.hEngineProcess, 5000); + auto launched = Bytes(sandbox / "launched.txt"); + Check(std::string(launched.begin(), launched.end()) == "assets\\sublevel_02.dat", "engine receives the selected start map"); + app.CheckPlaytestProcess(); + Check(!app.isEngineRunning && !fs::exists(sandbox), "finished playtest cleans its own temporary directory"); + strcpy_s(app.transitions[0].targetMap, "missing.dat"); + app.LaunchPlaytest(); + Check(!app.isEngineRunning && app.playtestDirectory.empty() && Bytes("../assets/map.dat") == originalMain, + "missing linked map aborts F5 without data loss"); + RunCutsceneChecks(app); + if (argc > 1) { + Check(ReadLevelFile(std::string(argv[1]) + "/map.dat", preview, error), "existing project main map remains compatible"); + Check(ReadLevelFile(std::string(argv[1]) + "/sublevel_02.dat", preview, error), "existing project sublevel remains compatible"); + app.LoadLevel(std::string(argv[1]) + "/map.dat"); + std::string start, executable; + Check(app.PreparePlaytest(start, executable), "existing project graph prepares for playtest"); + app.CleanupPlaytest(); + app.LoadLevel(std::string(argv[1]) + "/sublevel_02.dat"); + start.clear(); executable.clear(); + Check(app.PreparePlaytest(start, executable), "existing project sublevel and reverse link prepare for playtest"); + app.CleanupPlaytest(); + } + if(argc>2) RunViewportChecks(app,argv[2]); + std::cout << "Editor: " << checks - failures << '/' << checks << " passed\n"; + return failures ? 1 : 0; +} diff --git a/tests/engine_regressions.asm b/tests/engine_regressions.asm new file mode 100644 index 0000000..13ca28f --- /dev/null +++ b/tests/engine_regressions.asm @@ -0,0 +1,370 @@ +include engine_api.inc + +AuditGetAsyncKeyState PROTO :DWORD +AuditGetForegroundWindow PROTO +AuditPlaySoundA PROTO :DWORD, :DWORD, :DWORD +GetAsyncKeyState TEXTEQU +GetForegroundWindow TEXTEQU +PlaySoundA TEXTEQU +CopyFileA PROTO :DWORD, :DWORD, :DWORD + +include include/engine_defs.inc +include include/font8x8.inc +include include/engine_data.inc +include include/engine_math.inc +include include/engine_map.inc +include include/engine_textures.inc +include include/engine_input.inc +include include/engine_physics.inc +include include/engine_raycaster.inc +include include/engine_render2d.inc +include include/engine_cutscene.inc +include startup_parser.inc +include project_paths.inc + +.data +resultCount dd 0 +results dd 256 dup(0) +resultPath db 'engine_results.bin',0 +anglePath db 'angles.bin',0 +framePath db 'frame.bgra',0 +projectFramePath db 'project_frame.bgra',0 +subPath db 'sublevel_02.dat',0 +mainPath db 'map.dat',0 +arenaPath db 'arena.dat',0 +blackPath db 'black.dat',0 +badPath db 'truncated.dat',0 +missingPath db 'missing.dat',0 +legacy1Path db 'legacy1.dat',0 +legacy2Path db 'legacy2.dat',0 +badNamePath db 'badname.dat',0 +blockedPath db 'badspawn.dat',0 +overflowPath db 'overflow.dat',0 +orphanPath db 'orphan.dat',0 +duplicatePath db 'duplicate.dat',0 +validPack db 'assets/imported.bin',0 +badPack db 'assets/badpack.bin',0 +defaultPixels db 'assets/defaults.bin',0 +defaultFile dd 0 +defaultBytes dd 0 +testKeys dw 256 dup(0) +testFocus dd 1 +snapshot dd 6 dup(0) + +CHECK MACRO value, expected + mov eax, value + cmp eax, expected + sete al + movzx eax, al + mov ecx, resultCount + mov [results+ecx*4], eax + inc resultCount +ENDM + +.code +AuditGetAsyncKeyState PROC key:DWORD + mov ecx, key + movzx eax, WORD PTR [testKeys+ecx*2] + ret +AuditGetAsyncKeyState ENDP +AuditGetForegroundWindow PROC + mov eax, testFocus + ret +AuditGetForegroundWindow ENDP + +Dump PROC uses ebx, path:DWORD, dataPtr:DWORD, dataSize:DWORD + LOCAL file:DWORD, written:DWORD + invoke CreateFileA, path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 + mov file, eax + invoke WriteFile, file, dataPtr, dataSize, ADDR written, 0 + invoke CloseHandle, file + ret +Dump ENDP + +CaptureState PROC uses eax esi edi ecx + mov eax, playerX + mov snapshot, eax + mov eax, playerY + mov snapshot[4], eax + mov eax, spriteCount + mov snapshot[8], eax + mov eax, transitionCount + mov snapshot[12], eax + mov eax, DWORD PTR [gameMap] + mov snapshot[16], eax + mov eax, mapCeilingColor + mov snapshot[20], eax + ret +CaptureState ENDP + +StateUnchanged PROC uses ebx + mov eax, playerX + cmp eax, snapshot + jne state_changed + mov eax, playerY + cmp eax, snapshot[4] + jne state_changed + mov eax, spriteCount + cmp eax, snapshot[8] + jne state_changed + mov eax, transitionCount + cmp eax, snapshot[12] + jne state_changed + mov eax, DWORD PTR [gameMap] + cmp eax, snapshot[16] + jne state_changed + mov eax, mapCeilingColor + cmp eax, snapshot[20] + jne state_changed + mov eax, 1 + ret +state_changed: + xor eax, eax + ret +StateUnchanged ENDP + +include tests/cutscene_engine_checks.inc + +AuditMain PROC + call InitMathTables + invoke Dump, OFFSET anglePath, OFFSET tableRayAngleOffset, SCREEN_W*4 + call ParseStartupMap + CHECK DWORD PTR [startupMapPath], 65636170h ; quoted command-line start map (pace...) + call GenerateDefaultTextures + invoke CreateFileA, OFFSET defaultPixels, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 + mov defaultFile, eax + invoke ReadFile, defaultFile, OFFSET texturePackStaging, MAX_TEXTURES*TEX_SIZE_BYTES, OFFSET defaultBytes, 0 + invoke CloseHandle, defaultFile + mov esi, OFFSET texturePackStaging + mov edi, OFFSET textureBuffer + mov ecx, MAX_TEXTURES*TEX_SIZE_BYTES/4 + repe cmpsd + sete al + movzx eax, al + CHECK eax, 1 ; editor fallback previews match all engine default pixels + CHECK DWORD PTR [textureBuffer+10*TEX_SIZE_BYTES], COLOR_CHROMA_KEY ; default lamp exists independently of portal + invoke CopyFileA, OFFSET validPack, OFFSET szTexPackPath, 0 + mov ecx, 128 +dirty_stack: + push 0A5A5A5A5h + loop dirty_stack + add esp, 512 + call LoadTexturePack + CHECK eax, 1 ; valid texture pack loads with dirty stack + CHECK DWORD PTR [textureBuffer+TEX_SIZE_BYTES], 00112233h ; imported PNG reaches ASM unchanged + CHECK DWORD PTR [textureBuffer+11*TEX_SIZE_BYTES], COLOR_CHROMA_KEY ; imported sprite transparency reaches ASM + invoke CopyFileA, OFFSET badPack, OFFSET szTexPackPath, 0 + call LoadTexturePack + CHECK eax, 0 ; truncated texture pack rejected + CHECK DWORD PTR [textureBuffer+TEX_SIZE_BYTES], 00112233h ; failed pack load preserves current pixels + + mov startupMapPath, 0 + call LoadMapBinary + CHECK eax, 1 ; startup main map loads + CHECK spriteCount, 2 ; startup sprite count + CHECK transitionCount, 1 ; startup transition count + invoke SwitchSublevel, OFFSET subPath, 4, 6, 0, 0 + CHECK spriteCount, 1 ; instant transition replaces sprites + CHECK playerX, 288 ; destination X spawn + CHECK playerY, 416 ; destination Y spawn + invoke SwitchSublevel, OFFSET mainPath, 2, 2, 0, 1 + mov esi, 32 +fade_frames: + call ApplyScreenFade + dec esi + jnz fade_frames + CHECK fadeState, 0 ; fade finishes and releases player + CHECK fadeLevel, 0 ; fade returns full brightness + CHECK spriteCount, 2 ; fade transition loads destination + invoke LoadSublevelBinary, OFFSET arenaPath, -1, -1, 0 + CHECK eax, 1 ; map basename beginning with a resolves in assets + invoke LoadSublevelBinary, OFFSET legacy1Path, -1, -1, 0 + CHECK eax, 1 ; legacy v1 accepted + CHECK DWORD PTR [spriteList], 224 ; legacy sprite coordinates converted + invoke LoadSublevelBinary, OFFSET legacy2Path, -1, -1, 0 + CHECK eax, 1 ; legacy extended v2 accepted + CHECK transitionCount, 1 ; legacy v2 transitions retained + invoke LoadSublevelBinary, OFFSET blackPath, -1, -1, 0 + CHECK eax, 1 ; black palette map loads + CHECK mapCeilingColor, 0 ; black ceiling applied + CHECK mapFloorColor, 0 ; black floor applied + + call CaptureState + invoke SwitchSublevel, OFFSET missingPath, 2, 2, 0, 0 + call StateUnchanged + CHECK eax, 1 ; missing destination preserves current room + CHECK mapErrorFrames, 180 ; failed transition reports an error + invoke LoadSublevelBinary, OFFSET badPath, -1, -1, 0 + CHECK eax, 0 ; truncated map rejected + call StateUnchanged + CHECK eax, 1 ; truncated load preserves current room + invoke LoadSublevelBinary, OFFSET badNamePath, -1, -1, 0 + CHECK eax, 0 ; unterminated target filename rejected + invoke LoadSublevelBinary, OFFSET blockedPath, -1, -1, 0 + CHECK eax, 0 ; blocked spawn rejected + invoke LoadSublevelBinary, OFFSET overflowPath, -1, -1, 0 + CHECK eax, 0 ; object count overflow rejected without clamping + invoke LoadSublevelBinary, OFFSET orphanPath, -1, -1, 0 + CHECK eax, 0 ; portal without transition rejected + invoke LoadSublevelBinary, OFFSET duplicatePath, -1, -1, 0 + CHECK eax, 0 ; duplicate triggers rejected + invoke LoadSublevelBinary, OFFSET mainPath, 0, 0, 0 + CHECK eax, 0 ; transition spawn inside a wall rejected + call StateUnchanged + CHECK eax, 1 ; invalid spawn leaves current room intact + + mov esi, OFFSET missingPath + mov edi, OFFSET startupMapPath +copy_missing_startup: + lodsb + stosb + test al, al + jnz copy_missing_startup + call LoadMapBinary + CHECK DWORD PTR [gameMap], 01010101h ; missing startup map creates the procedural fallback + CHECK spriteCount, 0 ; fallback clears stale sprites + CHECK transitionCount, 0 ; fallback clears stale transitions + mov startupMapPath, 0 + + ; Re-entering an occupied destination trigger must not bounce back. + invoke LoadSublevelBinary, OFFSET subPath, 2, 2, 0 + mov mapErrorFrames, 0 + call CheckPortalTriggers + CHECK spriteCount, 1 ; destination trigger is latched on spawn + mov playerX, 224 + call CheckPortalTriggers + mov playerX, 160 + call CheckPortalTriggers + CHECK fadeState, 1 ; leaving and re-entering a trigger activates it + mov fadeState, 0 + mov fadeLevel, 0 + + ; Input APIs are mocked; PollInput itself is the production procedure. + mov hEngineWnd, 1 + mov testKeys[VK_KEY_SHIFT*2], 8000h + call PollInput + movzx eax, keyRun + CHECK eax, 1 ; Shift starts sprint + mov testKeys[VK_KEY_SHIFT*2], 0 + call PollInput + movzx eax, keyRun + CHECK eax, 0 ; releasing Shift stops sprint + mov testKeys[VK_KEY_E*2], 8000h + call PollInput + movzx eax, keyAction + CHECK eax, 1 ; action emitted on first key press + call PollInput + movzx eax, keyAction + CHECK eax, 0 ; held action does not repeat + mov testKeys[VK_KEY_E*2], 0 + call PollInput + mov testKeys[VK_KEY_E*2], 8000h + call PollInput + movzx eax, keyAction + CHECK eax, 1 ; releasing action re-arms it + mov testFocus, 0 + call PollInput + movzx eax, keyAction + CHECK eax, 0 ; unfocused engine ignores keyboard + + ; Flat wall at x=640, player x=160: every perpendicular depth is 480. + mov edi, OFFSET gameMap + mov ecx, MAP_SIZE + xor eax, eax + rep stosb + xor ecx, ecx +straight_wall: + mov eax, ecx + shl eax, 5 + mov byte ptr [gameMap+eax+10], CELL_BRICK + inc ecx + cmp ecx, MAP_H + jl straight_wall + mov playerX, 160 + mov playerY, 1024 + mov playerAngle, 0 + mov spriteCount, 0 + call Render3DScene + mov esi, OFFSET depthBuffer + mov ecx, SCREEN_W + mov ebx, 1 +check_flat_depth: + cmp DWORD PTR [esi], 480 + je flat_depth_ok + xor ebx, ebx +flat_depth_ok: + add esi, 4 + loop check_flat_depth + CHECK ebx, 1 ; all 320 columns of a flat wall have exactly the same depth + invoke Dump, OFFSET framePath, OFFSET screenBuffer, FRAME_BUFFER_SIZE + + ; Overlapping sprites are sorted far-to-near, independent of insertion order. + mov spriteCount, 2 + mov esi, OFFSET spriteList + mov [esi].SpriteStruct.x, 288 + mov [esi].SpriteStruct.y, 1024 + mov [esi].SpriteStruct.scale, FIXED_ONE + mov [esi].SpriteStruct.textureId, 11 + add esi, sizeof SpriteStruct + mov [esi].SpriteStruct.x, 416 + mov [esi].SpriteStruct.y, 1024 + mov [esi].SpriteStruct.scale, FIXED_ONE + mov [esi].SpriteStruct.textureId, 12 + call Render3DScene + CHECK spriteOrder, 1 ; farther sprite draws first + CHECK spriteOrder[4], 0 ; nearer sprite draws last + + ; Sprite slot 10 can be replaced without repainting wall portals. + mov edi, OFFSET textureBuffer+10*TEX_SIZE_BYTES + mov ecx, TEX_SIZE_BYTES/4 + mov eax, COLOR_RED + rep stosd + mov edi, OFFSET portalTextureBuffer + mov ecx, TEX_SIZE_BYTES/4 + mov eax, COLOR_GREEN + rep stosd + mov byte ptr [gameMap+16*MAP_W+10], CELL_PORTAL + mov spriteCount, 0 + call Render3DScene + CHECK DWORD PTR [screenBuffer+120*SCREEN_PITCH+160*4], 00007F00h ; portal uses separate artwork despite imported sprite slot 10 + mov byte ptr [gameMap+16*MAP_W+10], CELL_BRICK + + ; Scaling a sprite changes its height, not the floor point at its depth. + mov edi, OFFSET textureBuffer+11*TEX_SIZE_BYTES + mov ecx, TEX_SIZE_BYTES/4 + mov eax, COLOR_RED + rep stosd + mov spriteCount, 1 + mov esi, OFFSET spriteList + mov [esi].SpriteStruct.scale, 2*FIXED_ONE + call Render3DScene + CHECK DWORD PTR [screenBuffer+179*SCREEN_PITCH+160*4], COLOR_RED ; scaled sprite still reaches its floor point + mov eax, DWORD PTR [screenBuffer+180*SCREEN_PITCH+160*4] + cmp eax, COLOR_RED + setne al + movzx eax, al + CHECK eax, 1 ; scaled sprite does not sink into the floor + + ; Cardinal rays must not divide by zero or wrap DDA distances. + mov spriteCount, 0 + mov playerAngle, ANGLE_90 + call Render3DScene + CHECK DWORD PTR [depthBuffer+160*4], 1024 ; exact cardinal ray handles zero X direction + + call GenerateDefaultTextures + invoke CopyFileA, OFFSET projectPackPath, OFFSET szTexPackPath, 0 + call LoadTexturePack + CHECK eax, 1 ; actual project texture pack loads + invoke LoadSublevelBinary, OFFSET projectMapPath, -1, -1, 0 + CHECK eax, 1 ; actual project map loads in ASM + call Render3DScene + invoke Dump, OFFSET projectFramePath, OFFSET screenBuffer, FRAME_BUFFER_SIZE + + call RunCutsceneChecks + mov eax, resultCount + inc eax + shl eax, 2 + invoke Dump, OFFSET resultPath, OFFSET resultCount, eax + invoke ExitProcess, 0 +AuditMain ENDP +END AuditMain diff --git a/tests/playtest_stub.cpp b/tests/playtest_stub.cpp new file mode 100644 index 0000000..729cb7c --- /dev/null +++ b/tests/playtest_stub.cpp @@ -0,0 +1,6 @@ +#include +int main(int argc, char** argv) { + if (argc != 2) return 1; + std::ofstream("launched.txt") << argv[1]; + return 0; +} diff --git a/tests/viewport_editor_checks.inl b/tests/viewport_editor_checks.inl new file mode 100644 index 0000000..9df81ff --- /dev/null +++ b/tests/viewport_editor_checks.inl @@ -0,0 +1,65 @@ +// Integration test: real x86 ASM producer -> x64 editor -> DX11 WARP texture. +static void RunViewportChecks(EditorApp& app, const char* actualEngine) { + std::error_code ec; + const auto testEngine = app.FindEnginePath(); + fs::copy_file(actualEngine,testEngine,fs::copy_options::overwrite_existing,ec); + Check(!ec,"stage real ASM renderer for editor integration"); + ID3D11Device* device=nullptr; + HRESULT hr=D3D11CreateDevice(nullptr,D3D_DRIVER_TYPE_WARP,nullptr,0,nullptr,0,D3D11_SDK_VERSION,&device,nullptr,nullptr); + Check(SUCCEEDED(hr),"DX11 software device supports the embedded viewport"); + if(!device || ec) return; + app.LoadLevel("../assets/scene.dat"); app.showCutsceneTimeline=true; app.previewAttempted=false; + app.InitD3D(device); + auto pump = [&]() { + int frames=0; ULONGLONG until=GetTickCount64()+5000; + while(frames<3 && GetTickCount64()state,0,0)==2) ++frames; + app.UpdateEnginePreview(); + if(!app.previewError.empty()) break; + Sleep(2); + } + return frames>=3 && app.previewError.empty(); + }; + Check(pump() && app.previewSRV && app.previewHasFrame,"real ASM frames arrive in the editor DX11 viewport"); + auto before=app.previewPixels; + app.map[3][4]=CELL_METAL; + Check(pump() && app.previewPixels!=before,"unsaved geometry updates the live game view"); + app.map[3][4]=CELL_EMPTY; + app.ScrubCutscene(2); + Check(pump() && app.previewPacket->x==224 && app.previewPacket->angle==0 && app.previewPacket->fade==8, + "timeline scrub drives the actual ASM viewport camera and fade"); + if(app.previewTexture) { + D3D11_TEXTURE2D_DESC desc{};app.previewTexture->GetDesc(&desc); + desc.Usage=D3D11_USAGE_STAGING;desc.BindFlags=0;desc.CPUAccessFlags=D3D11_CPU_ACCESS_READ; + ID3D11Texture2D* staging=nullptr; + device->CreateTexture2D(&desc,nullptr,&staging); + ID3D11DeviceContext* context=nullptr;device->GetImmediateContext(&context); + bool equal=false; + if(staging) { + context->CopyResource(staging,app.previewTexture); + D3D11_MAPPED_SUBRESOURCE read{}; + if(SUCCEEDED(context->Map(staging,0,D3D11_MAP_READ,0,&read))) { + equal=true; + for(int y=0;y<240;++y) if(memcmp(static_cast(read.pData)+y*read.RowPitch, + app.previewPixels.data()+y*320,1280)) equal=false; + context->Unmap(staging,0); + } + staging->Release(); + } + Check(equal,"DX11 texture pixels match the ASM framebuffer with opaque alpha"); + context->Release(); + } + app.StopEnginePreview(); + Check(!app.previewProcess.hProcess && !app.previewPacket && !app.previewMapping,"closing viewport releases renderer process and mapping"); + app.ShutdownD3D();device->Release();app.showCutsceneTimeline=false; + const auto demo=fs::path(actualEngine).parent_path()/"examples/cutscene_demo/assets/map.dat"; + Check(app.LoadLevel(demo.string()),"isolated cutscene demo loads in the editor"); + std::string start,executable; + Check(app.PreparePlaytest(start,executable),"demo F5 validates both rooms and packages its WAV"); + app.CleanupPlaytest(); + CutscenePreview demoPreview; + demoPreview.Start(app.playerStartX*64+32,app.playerStartY*64+32,app.playerStartAngle); + while(demoPreview.active && demoPreview.tick<1000) demoPreview.Step(app.cutscene); + Check(demoPreview.transition==0 && demoPreview.x==800 && demoPreview.y==544 && demoPreview.angle==0, + "demo camera reaches final waypoint and dispatches its room transition"); +} diff --git a/tools/make_cutscene_demo.py b/tools/make_cutscene_demo.py new file mode 100644 index 0000000..5436e2f --- /dev/null +++ b/tools/make_cutscene_demo.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +"""Build the separate cutscene example; never modifies the user's assets/ maps.""" +from pathlib import Path +import math +import struct +import wave + +ROOT = Path(__file__).resolve().parents[1] / "examples/cutscene_demo" + + +def write_map(name, *, spawn, angle, events=(), strings=(), transitions=(), autoplay=False): + grid = bytearray(1024) + for x in range(32): grid[x] = grid[31*32+x] = 1 + for y in range(32): grid[y*32] = grid[y*32+31] = 1 + for y in range(1, 18): grid[y*32+16] = 3 + for x, y in ((6,6),(10,5),(12,12),(4,10)): grid[y*32+x] = 7 + for t in transitions: grid[t[1]*32+t[0]] = 10 + sprites = [(7*64+32,5*64+32,11,65536,0,0),(11*64+32,7*64+32,10,65536,0,0)] + header = struct.pack("deadline: raise AssertionError("Preview renderer did not answer") + time.sleep(.005) + return packet[PIXELS:PIXELS+307200] + + try: + frame=request() + middle=struct.unpack_from(">16,y>>16) + packet[1152:1152+len(sprites)]=sprites + pack=(ROOT/"assets/textures/texturepack.bin").read_bytes() + packet[TEXTURES:TEXTURES+len(pack)-8]=pack[8:] + struct.pack_into("nul 2>&1\n' + batch += f'cl {flags} "{ROOT / "tests/playtest_stub.cpp"}" /Fe:engine.exe\nif errorlevel 1 exit /b 1\n' + batch += f'cl {flags} ' + " ".join(f'"{p}"' for p in sources) + batch += ' /Fe:editor_tests.exe /link /SUBSYSTEM:CONSOLE d3d11.lib dxgi.lib user32.lib gdi32.lib shell32.lib comdlg32.lib winmm.lib\n' + (work / "build_tests.bat").write_text(batch) + run(["cmd", "/c", str(work / "build_tests.bat")], work) + print(run([str(work / "editor_tests.exe"), str(ROOT / "assets"), str(ROOT / "engine.exe")], work / "editor"), end="") + spec = importlib.util.spec_from_file_location("texturepack", ROOT / "tools/make_texturepack.py") + texturepack = importlib.util.module_from_spec(spec) + spec.loader.exec_module(texturepack) + generated = b"".join(texturepack.GENERATORS[i]() for i in range(16)) + if generated != (work / "assets/defaults.bin").read_bytes(): + raise RuntimeError("Python texture generator differs from editor/runtime defaults") + print("PASS Python, editor and engine use identical procedural texture defaults") + + main_source = (ROOT / "main.asm").read_text(encoding="utf-8") + api = main_source[:main_source.index("; ------------------------------------------------------------------------------\n; Engine Includes")] + api = re.sub(r"^(GetAsyncKeyState|GetForegroundWindow|PlaySoundA)\s+PROTO.*\n", "", api, flags=re.M) + (work / "engine_api.inc").write_text(api) + start = main_source.index("ParseStartupMap PROC") + end = main_source.index("ParseStartupMap ENDP", start) + len("ParseStartupMap ENDP") + (work / "startup_parser.inc").write_text(main_source[start:end]) + (work / "project_paths.inc").write_text( + f'.data\nprojectMapPath db "{ROOT / "assets/map.dat"}",0\n' + f'projectPackPath db "{ROOT / "assets/textures/texturepack.bin"}",0\n.code\n') + masm_candidates = [Path(p) for p in ("D:/MASM32/masm32/bin/ml.exe", "C:/masm32/bin/ml.exe", "F:/MASM32/masm32/bin/ml.exe")] + masm_candidates += list(Path("C:/Program Files (x86)/Microsoft Visual Studio").glob("*/BuildTools/VC/Tools/MSVC/*/bin/Hostx64/x86/ml.exe")) + ml = next((p for p in masm_candidates if p.is_file()), None) + if not ml: + raise RuntimeError("x86 MASM assembler was not found") + sdk = sorted(Path("C:/Program Files (x86)/Windows Kits/10/Lib").glob("*/um/x86")) + if not sdk: + raise RuntimeError("Windows x86 SDK libraries were not found") + run([str(ml), "/c", "/coff", "/Cp", "/nologo", f"/I{work}", f"/I{ROOT}", + f"/Fo{work / 'engine_tests.obj'}", str(ROOT / "tests/engine_regressions.asm")], work) + link = ml.with_name("link.exe") + run([str(link), "/NOLOGO", "/SUBSYSTEM:CONSOLE", f"/LIBPATH:{sdk[-1]}", + f"/OUT:{work / 'engine_tests.exe'}", str(work / "engine_tests.obj"), + "kernel32.lib", "user32.lib", "gdi32.lib", "winmm.lib"], work) + run([str(work / "engine_tests.exe"), "pace map.dat"], work) + source = (ROOT / "tests/engine_regressions.asm").read_text() + (ROOT / "tests/cutscene_engine_checks.inc").read_text() + names = re.findall(r"^\s+CHECK .*?; (.+)$", source, re.M) + raw = (work / "engine_results.bin").read_bytes() + values = struct.unpack(f"<{len(raw)//4}I", raw) + if values[0] != len(names): + raise RuntimeError(f"ASM result count mismatch: {values[0]} vs {len(names)}") + for name, passed in zip(names, values[1:]): + print(("PASS " if passed else "FAIL ") + name) + angles = struct.unpack("<320i", (work / "angles.bin").read_bytes()) + expected = tuple(round(math.atan((x-160)/160*math.tan(48*math.pi/256))*256/math.pi) for x in range(320)) + if angles != expected or not all(values[1:]): + raise RuntimeError("ASM regressions failed") + print(f"ASM: {len(names)}/{len(names)} passed; 320 ray angles match the specification") + frame = (work / "frame.bgra").read_bytes() + bitmap_header = struct.pack("<2sIHHI", b"BM", len(frame)+54, 0, 0, 54) + bitmap_header += struct.pack("