From b6816abe56f8856297cd8ab25240f5e95f9cca2d Mon Sep 17 00:00:00 2001 From: yellows8 Date: Sun, 11 Feb 2018 19:07:18 -0500 Subject: [PATCH] Initial public commit. --- .gitignore | 6 + Makefile | 7 + Makefile.nx | 189 ++++++ Makefile.pc | 38 ++ README.md | 9 + common/common.h | 106 +++ common/font.c | 168 +++++ common/font.h | 36 + common/language.c | 773 ++++++++++++++++++++++ common/language.h | 37 ++ common/launch.c | 59 ++ common/launch.h | 24 + common/main.h | 0 common/menu-entry.c | 318 +++++++++ common/menu-list.c | 150 +++++ common/menu.c | 140 ++++ common/menu.h | 75 +++ common/nacp.h | 41 ++ common/nanojpeg.c | 916 ++++++++++++++++++++++++++ common/nanojpeg.h | 66 ++ common/nro.h | 43 ++ common/text.c | 15 + common/text.h | 6 + common/ui.c | 18 + common/ui.h | 6 + data/folder_icon.bin | 1 + data/switchicon_questionmark.bin | 1 + data/tahoma12.nxfnt | Bin 0 -> 79960 bytes data/tahoma24.nxfnt | Bin 0 -> 280338 bytes nx_main/loaders/builtin.c | 32 + nx_main/main.c | 88 +++ nx_main/nx_launch.c | 75 +++ pc_main/main.cpp | 56 ++ pc_main/pc_launch.c | 19 + resources/folder_icon_.jpg | Bin 0 -> 4294 bytes resources/switchicon-questionmark.jpg | Bin 0 -> 8965 bytes 36 files changed, 3518 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 Makefile.nx create mode 100644 Makefile.pc create mode 100644 README.md create mode 100644 common/common.h create mode 100644 common/font.c create mode 100644 common/font.h create mode 100644 common/language.c create mode 100644 common/language.h create mode 100644 common/launch.c create mode 100644 common/launch.h create mode 100644 common/main.h create mode 100644 common/menu-entry.c create mode 100644 common/menu-list.c create mode 100644 common/menu.c create mode 100644 common/menu.h create mode 100644 common/nacp.h create mode 100644 common/nanojpeg.c create mode 100644 common/nanojpeg.h create mode 100644 common/nro.h create mode 100644 common/text.c create mode 100644 common/text.h create mode 100644 common/ui.c create mode 100644 common/ui.h create mode 100644 data/folder_icon.bin create mode 100644 data/switchicon_questionmark.bin create mode 100644 data/tahoma12.nxfnt create mode 100644 data/tahoma24.nxfnt create mode 100644 nx_main/loaders/builtin.c create mode 100644 nx_main/main.c create mode 100644 nx_main/nx_launch.c create mode 100644 pc_main/main.cpp create mode 100644 pc_main/pc_launch.c create mode 100644 resources/folder_icon_.jpg create mode 100644 resources/switchicon-questionmark.jpg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d09ee29 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*~ +*.exe +*.o +test +tahoma12.c +tahoma24.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..08ecf11 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +all: + make -f Makefile.nx + make -f Makefile.pc + +clean: + make -f Makefile.pc clean + make -f Makefile.nx clean diff --git a/Makefile.nx b/Makefile.nx new file mode 100644 index 0000000..5ba762c --- /dev/null +++ b/Makefile.nx @@ -0,0 +1,189 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITPRO)/libnx/switch_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm". +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := common/ nx_main/ nx_main/loaders/ +DATA := data +INCLUDES := include +EXEFS_SRC := exefs_src + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv8-a -mtp=soft -fPIE + +CFLAGS := -g -Wall -O2 \ + -ffast-math \ + $(ARCH) $(DEFINES) + +CFLAGS += $(INCLUDE) -DSWITCH + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lnx + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(LIBNX) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.jpg) + ifneq (,$(findstring $(TARGET).jpg,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).jpg + else + ifneq (,$(findstring icon.jpg,$(icons))) + export APP_ICON := $(TOPDIR)/icon.jpg + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_ICON)),) + export NROFLAGS += --icon=$(APP_ICON) +endif + +ifeq ($(strip $(NO_NACP)),) + export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp +endif + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile.nx + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).pfs0 $(TARGET).nso $(TARGET).nro $(TARGET).nacp $(TARGET).elf + + +#--------------------------------------------------------------------------------- +else +.PHONY: all + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).pfs0 $(OUTPUT).nro + +$(OUTPUT).pfs0 : $(OUTPUT).nso + +$(OUTPUT).nso : $(OUTPUT).elf + +ifeq ($(strip $(NO_NACP)),) +$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp +else +$(OUTPUT).nro : $(OUTPUT).elf +endif + +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +%.nxfnt.o : %.nxfnt +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/Makefile.pc b/Makefile.pc new file mode 100644 index 0000000..24556a7 --- /dev/null +++ b/Makefile.pc @@ -0,0 +1,38 @@ +# canned command sequence for binary data +#--------------------------------------------------------------------------------- +define bin2o + bin2s $< | $(AS) -o $(@) + echo "extern const u8" `(echo $( `(echo $(> `(echo $(> `(echo $( +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef SWITCH +#include +#endif + +#include +typedef uint8_t u8; +typedef uint32_t u32; +typedef uint64_t u64; + +#define M_TAU (2*M_PI) + +typedef union { + uint32_t abgr; + struct { + uint8_t r,g,b,a; + }; +} color_t; + +#include "font.h" +#include "nacp.h" +#include "menu.h" +#include "text.h" +#include "ui.h" +#include "launch.h" +#include "nro.h" +#include "nanojpeg.h" + +void menuStartup(); +void menuLoop(); + +static inline uint8_t BlendColor(uint32_t src, uint32_t dst, uint8_t alpha) +{ + uint8_t one_minus_alpha = (uint8_t)255 - alpha; + return (dst*alpha + src*one_minus_alpha)/(uint8_t)255; +} + +static inline color_t MakeColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + color_t clr; + clr.r = r; + clr.g = g; + clr.b = b; + clr.a = a; + return clr; +} + +#ifdef SWITCH +extern uint8_t* g_framebuf; +static inline void DrawPixel(uint32_t x, uint32_t y, color_t clr) +{ + if (x >= 1280 || y >= 720) + return; + u32 off = 4*gfxGetFramebufferDisplayOffset(x, y); + g_framebuf[off] = BlendColor(g_framebuf[off], clr.r, clr.a); off++; + g_framebuf[off] = BlendColor(g_framebuf[off], clr.g, clr.a); off++; + g_framebuf[off] = BlendColor(g_framebuf[off], clr.b, clr.a); off++; + g_framebuf[off] = 0xff; +} +static inline void DrawPixelRaw(uint32_t x, uint32_t y, color_t clr) +{ + if (x >= 1280 || y >= 720) + return; + u32 off = 4*gfxGetFramebufferDisplayOffset(x, y); + g_framebuf[off] = clr.r; off++; + g_framebuf[off] = clr.g; off++; + g_framebuf[off] = clr.b; off++; + g_framebuf[off] = 0xff; +} +#else +extern color_t pixels[720][1280]; +static inline void DrawPixel(uint32_t x, uint32_t y, color_t clr) +{ + if (x >= 1280 || y >= 720) + return; + pixels[y][x].r = BlendColor(pixels[y][x].r, clr.r, clr.a); + pixels[y][x].g = BlendColor(pixels[y][x].g, clr.g, clr.a); + pixels[y][x].b = BlendColor(pixels[y][x].b, clr.b, clr.a); + pixels[y][x].a = 0xff; +} +static inline void DrawPixelRaw(uint32_t x, uint32_t y, color_t clr) +{ + if (x >= 1280 || y >= 720) + return; + pixels[y][x].r = clr.r; + pixels[y][x].g = clr.g; + pixels[y][x].b = clr.b; + pixels[y][x].a = 0xff; +} +#endif + +void DrawPixel(uint32_t x, uint32_t y, color_t clr); +void DrawText(const ffnt_header_t* font, uint32_t x, uint32_t y, color_t clr, const char* text); +void DrawTextTruncate(const ffnt_header_t* font, uint32_t x, uint32_t y, color_t clr, const char* text, uint32_t max_width, const char* end_text); diff --git a/common/font.c b/common/font.c new file mode 100644 index 0000000..9123d90 --- /dev/null +++ b/common/font.c @@ -0,0 +1,168 @@ +#include "common.h" + +static inline const ffnt_page_t* FontGetPage(const ffnt_header_t* font, uint32_t page_id) +{ + //__builtin_printf("GetPage %u\n", (unsigned int)page_id); + if (page_id >= font->npages) + return NULL; + ffnt_pageentry_t* ent = &((ffnt_pageentry_t*)(font+1))[page_id]; + if (ent->size == 0) + return NULL; + return (const ffnt_page_t*)((const uint8_t*)font + ent->offset); +} + +static inline bool FontLoadGlyph(glyph_t* glyph, const ffnt_header_t* font, uint32_t codepoint) +{ + //__builtin_printf("LoadGlyph %u\n", (unsigned int)codepoint); + const ffnt_page_t* page = FontGetPage(font, codepoint >> 8); + if (!page) + return false; + + codepoint &= 0xFF; + uint32_t off = page->hdr.pos[codepoint]; + if (off == ~(uint32_t)0) + return false; + + //__builtin_printf("%c %u\n", (char)codepoint, (unsigned int)off); + glyph->width = page->hdr.widths[codepoint]; + glyph->height = page->hdr.heights[codepoint]; + glyph->advance = page->hdr.advances[codepoint]; + glyph->posX = page->hdr.posX[codepoint]; + glyph->posY = page->hdr.posY[codepoint]; + glyph->data = &page->data[off]; + return true; +} + +static void DrawGlyph(uint32_t x, uint32_t y, color_t clr, const glyph_t* glyph) +{ + uint32_t i, j; + const uint8_t* data = glyph->data; + x += glyph->posX; + y += glyph->posY; + //__builtin_printf("DrawGlyph %u %u %08X\n", (unsigned int)x, (unsigned int)y, (unsigned int)clr.abgr); + for (j = 0; j < glyph->height; j ++) + { + for (i = 0; i < glyph->width; i ++) + { + clr.a = *data++; + if (!clr.a) continue; + DrawPixel(x+i, y+j, clr); + } + } +} + +static inline uint8_t DecodeByte(const char** ptr) +{ + uint8_t c = (uint8_t)**ptr; + *ptr += 1; + return c; +} + +// UTF-8 code adapted from http://www.json.org/JSON_checker/utf8_decode.c + +static inline int8_t DecodeUTF8Cont(const char** ptr) +{ + int c = DecodeByte(ptr); + return ((c & 0xC0) == 0x80) ? (c & 0x3F) : -1; +} + +static inline uint32_t DecodeUTF8(const char** ptr) +{ + uint32_t r; + uint8_t c; + int8_t c1, c2, c3; + + c = DecodeByte(ptr); + if ((c & 0x80) == 0) + return c; + if ((c & 0xE0) == 0xC0) + { + c1 = DecodeUTF8Cont(ptr); + if (c1 >= 0) + { + r = ((c & 0x1F) << 6) | c1; + if (r >= 0x80) + return r; + } + } else if ((c & 0xF0) == 0xE0) + { + c1 = DecodeUTF8Cont(ptr); + if (c1 >= 0) + { + c2 = DecodeUTF8Cont(ptr); + if (c2 >= 0) + { + r = ((c & 0x0F) << 12) | (c1 << 6) | c2; + if (r >= 0x800 && (r < 0xD800 || r >= 0xE000)) + return r; + } + } + } else if ((c & 0xF8) == 0xF0) + { + c1 = DecodeUTF8Cont(ptr); + if (c1 >= 0) + { + c2 = DecodeUTF8Cont(ptr); + if (c2 >= 0) + { + c3 = DecodeUTF8Cont(ptr); + if (c3 >= 0) + { + r = ((c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3; + if (r >= 0x10000 && r < 0x110000) + return r; + } + } + } + } + return 0xFFFD; +} + +static void DrawText_(const ffnt_header_t* font, uint32_t x, uint32_t y, color_t clr, const char* text, uint32_t max_width, const char* end_text) +{ + //__builtin_printf("DrawText %u %u %08X %s\n", (unsigned int)x, (unsigned int)y, (unsigned int)clr.abgr, text); + y += font->baseline; + uint32_t origX = x; + while (*text) + { + if (max_width && x-origX >= max_width) { + text = end_text; + max_width = 0; + } + + glyph_t glyph; + uint32_t codepoint = DecodeUTF8(&text); + + if (codepoint == '\n') + { + if (max_width) { + text = end_text; + max_width = 0; + continue; + } + + x = origX; + y += font->height; + continue; + } + + if (!FontLoadGlyph(&glyph, font, codepoint)) + { + if (!FontLoadGlyph(&glyph, font, '?')) + continue; + } + + DrawGlyph(x, y, clr, &glyph); + x += glyph.advance; + } +} + +void DrawText(const ffnt_header_t* font, uint32_t x, uint32_t y, color_t clr, const char* text) +{ + DrawText_(font, x, y, clr, text, 0, NULL); +} + +void DrawTextTruncate(const ffnt_header_t* font, uint32_t x, uint32_t y, color_t clr, const char* text, uint32_t max_width, const char* end_text) +{ + DrawText_(font, x, y, clr, text, max_width, end_text); +} diff --git a/common/font.h b/common/font.h new file mode 100644 index 0000000..b937356 --- /dev/null +++ b/common/font.h @@ -0,0 +1,36 @@ +typedef struct { + uint8_t magic[4]; // 'fFNT' + int version; // 1 + uint16_t npages; + uint8_t height; + uint8_t baseline; +} ffnt_header_t; + +typedef struct { + uint32_t size, offset; +} ffnt_pageentry_t; + +typedef struct { + uint32_t pos[0x100]; + uint8_t widths[0x100]; + uint8_t heights[0x100]; + int8_t advances[0x100]; + int8_t posX[0x100]; + int8_t posY[0x100]; +} ffnt_pagehdr_t; + +typedef struct { + ffnt_pagehdr_t hdr; + uint8_t data[]; +} ffnt_page_t; + +typedef struct { + uint8_t width, height; + int8_t posX, posY, advance; + const uint8_t* data; +} glyph_t; + +extern const ffnt_header_t tahoma24_nxfnt; +extern const ffnt_header_t tahoma12_nxfnt; +#define tahoma24 &tahoma24_nxfnt +#define tahoma12 &tahoma12_nxfnt diff --git a/common/language.c b/common/language.c new file mode 100644 index 0000000..8423809 --- /dev/null +++ b/common/language.c @@ -0,0 +1,773 @@ +#include "language.h" + +//TODO: Update this once libnx supports settings get-language. + +#define STR_JP(_str) [/*CFG_LANGUAGE_JP*/0] = _str +#define STR_EN(_str) [/*CFG_LANGUAGE_EN*/1] = _str +#define STR_FR(_str) [/*CFG_LANGUAGE_FR*/2] = _str +#define STR_DE(_str) [/*CFG_LANGUAGE_DE*/3] = _str +#define STR_IT(_str) [/*CFG_LANGUAGE_IT*/4] = _str +#define STR_ES(_str) [/*CFG_LANGUAGE_ES*/5] = _str +#define STR_ZH(_str) [/*CFG_LANGUAGE_ZH*/6] = _str +#define STR_KO(_str) [/*CFG_LANGUAGE_KO*/7] = _str +#define STR_NL(_str) [/*CFG_LANGUAGE_NL*/8] = _str +#define STR_PT(_str) [/*CFG_LANGUAGE_PT*/9] = _str +#define STR_RU(_str) [/*CFG_LANGUAGE_RU*/10] = _str +#define STR_TW(_str) [/*CFG_LANGUAGE_TW*/11] = _str + +const char* const g_strings[StrId_Max][16] = +{ + [StrId_Loading] = + { + STR_EN("Loading…"), + STR_ES("Cargando…"), + STR_DE("Lade…"), + STR_FR("Chargement…"), + STR_IT("Caricamento…"), + STR_JP("ロード中…"), + STR_PT("Carregando…"), + STR_NL("Laden…"), + STR_KO("로딩중…"), + STR_RU("загрузка…"), + STR_ZH("加载中…"), + STR_TW("加載中…"), + }, + + [StrId_Directory] = + { + STR_EN("Directory"), + STR_ES("Carpeta"), + STR_DE("Verzeichnis"), + STR_FR("Dossier"), + STR_IT("Cartella"), + STR_JP("フォルダ"), + STR_PT("Directório"), + STR_NL("Map"), + STR_KO("디렉토리"), + STR_RU("каталог"), + STR_ZH("目录"), + STR_TW("資料夾"), + }, + + [StrId_DefaultVersion] = + { + STR_EN("1.0.0"), + STR_ES("1.0.0"), + STR_DE("1.0.0"), + STR_FR("1.0.0"), + STR_IT("1.0.0"), + STR_JP("1.0.0"), + STR_PT("1.0.0"), + STR_NL("1.0.0"), + STR_KO("1.0.0"), + STR_RU("1.0.0"), + STR_ZH("1.0.0"), + STR_TW("1.0.0"), + }, + + /*[StrId_DefaultLongTitle] = + { + STR_EN("Homebrew application"), + STR_ES("Aplicación homebrew"), + STR_DE("Homebrew-Anwendung"), + STR_FR("Application homebrew"), + STR_IT("Applicazione homebrew"), + STR_JP("自作アプリ"), + STR_PT("Aplicação Homebrew"), + STR_NL("Homebrew toepassing"), + STR_KO("홈브류 애플리케이션"), + STR_RU("приложение хомебреw"), + STR_ZH("自制应用程序"), + STR_TW("自製程式"), + },*/ + + [StrId_DefaultPublisher] = + { + STR_EN("Unknown author"), + STR_ES("Autor desconocido"), + STR_DE("Unbekannter Autor"), + STR_FR("Auteur inconnu"), + STR_IT("Autore sconosciuto"), + STR_JP("未知の作者"), + STR_PT("Autor Desconhecido"), + STR_NL("Auteur onbekend"), + STR_KO("작자미상"), + STR_RU("неизвестный автор"), + STR_ZH("未知作者"), + STR_TW("未知作者"), + }, + + [StrId_IOError] = + { + STR_EN("I/O Error"), + STR_ES("Error de E/S"), + STR_DE("E/A-Fehler"), + STR_FR("Erreur d'E/S"), + STR_IT("Errore di I/O"), + STR_JP("入出力エラー"), + STR_PT("Erro de E/S"), + STR_NL("I/O Fout"), + STR_KO("I/O 에러"), + STR_RU("I/O-ошибка"), + STR_ZH("读写出错"), + STR_TW("讀寫錯誤"), + }, + + [StrId_CouldNotOpenFile] = + { + STR_EN("Could not open file:\n%s"), + STR_ES("No se pudo abrir el archivo:\n%s"), + STR_DE("Konnte Datei nicht öffnen:\n%s"), + STR_FR("Impossible d'ouvrir le fichier :\n%s"), + STR_IT("Impossibile aprire il file:\n%s"), + STR_JP("ファイルを開くことができませんでした:\n%s"), + STR_PT("Não foi possível abrir o ficheiro:\n%s"), + STR_NL("Kan bestand niet openen:\n%s"), + STR_KO("파일을 열 수 없습니다:\n%s"), + STR_RU("Не могу открыть файл:\n%s"), + STR_ZH("无法打开文件:\n%s"), + STR_TW("開啓檔案失敗:\n%s"), + }, + + [StrId_NoAppsFound_Title] = + { + STR_EN("No applications found"), + STR_ES("No hay aplicaciones"), + STR_DE("Keine Anwendungen gefunden"), + STR_FR("Aucune application trouvée"), + STR_IT("Nessun'applicazione trovata"), + STR_JP("アプリが見つかりませんでした"), + STR_PT("Não foram encontradas aplicações"), + STR_NL("Geen toepassingen gevonden"), + STR_KO("애플리케이션을 찾을 수 없습니다"), + STR_RU("приложение не найдено"), + STR_ZH("找不到可执行的自制程序"), + STR_TW("未能找到可執行的自製程式"), + }, + + [StrId_NoAppsFound_Msg] = + { + STR_EN( + "No applications could be found on the SD card.\n" + "Make sure a folder named /switch exists in the\n" + "root of the SD card and it contains applications.\n" + ), + STR_ES( + "No se han podido encontrar aplicaciones en la\n" + "tarjeta SD. Compruebe que haya una carpeta\n" + "llamada /switch y que contenga aplicaciones.\n" + ), + STR_DE( + "Auf der SD-Karte wurden keine Anwendungen\n" + "gefunden. Stelle sicher, dass ein Verzeichnis\n" + "namens /switch im Wurzelverzeichnis der SD-Karte\n" + "existiert und Anwendungen enthält!" + ), + STR_FR( + "Aucune application n'a été trouvée sur la carte\n" + "SD. Veillez à ce qu'un dossier intitulé /switch\n" + "existe à la racine de la carte SD et à ce qu'il\n" + "contienne des applications." + ), + STR_IT( + "Nessun'applicazione è stata trovata sulla scheda\n" + "SD. Assicurati che esista una cartella chiamata\n" + "/switch nella root della scheda SD e che contenga\n" + "delle applicazioni." + ), + STR_JP( + "SDカードにアプリケーションが見つかりませんでした。\n" + "SDカードのルートに「/switch」という名前のフォルダを\n" + "作成してください。" + ), + STR_PT( + "Nenhuma aplicação foi encontrada no cartão SD.\n" + "Certifique-se que uma pasta com o nome /switch\n" + "existe na raiz do cartão SD e que contêm\n" + "aplicações." + ), + STR_NL( + "Geen toepassingen gevonden op de SD kaart.\n" + "Zorg ervoor dat een map genaamd /switch in de\n" + "rootdirectory van de SD kaart aangemaakt is\n" + "en de toepassingen bevat." + ), + STR_KO( + "애플리케이션을 SD 카드에서 찾을 수 없습니다.\n" + "SD 카드 최상단에 /switch 라는 이름의 폴더가 있는지,\n" + "애플리케이션을 포함하고 있는지 확인해 주십시오." + ), + STR_RU( + "На SD-карте нет приложений.\n" + "Убедитесь, что на карте SD есть каталог с\n" + "названием switch и она содержит приложения." + ), + STR_ZH( + "内存卡找不到任何可执行的应用程序。\n" + "请在内存卡的根目录建立「switch」子目录,\n" + "并存放自制应用软件至该目录。" + ), + STR_TW( + "記憶體找不到任何可執行的應用程式。\n" + "請在記憶體建立「switch」資料夾,\n" + "然後儲存自製軟體到此處。" + ), + }, + + /*[StrId_Reboot] = + { + STR_EN( + "Returning to \xEE\x81\xB3HOME is not available.\n" + "You're about to reboot your console.\n\n" + " \xEE\x80\x80 Reboot\n" + " \xEE\x80\x81 Cancel" + ), + STR_ES( + "Volver a \xEE\x81\xB3HOME no está disponible.\n" + "Está a punto de reiniciar su consola.\n\n" + " \xEE\x80\x80 Reiniciar\n" + " \xEE\x80\x81 Cancelar" + ), + STR_DE( + "Rückkehr zu \xEE\x81\xB3HOME nicht verfügbar.\n" + "Deine Konsole wird neu gestartet.\n\n" + " \xEE\x80\x80 Neu starten\n" + " \xEE\x80\x81 Abbrechen" + ), + STR_FR( + "Retour au menu \xEE\x81\xB3HOME indisponible.\n" + "Vous êtes sur le point de redémarrer\n" + "votre console.\n\n" + " \xEE\x80\x80 Redémarrer\n" + " \xEE\x80\x81 Annuler" + ), + STR_IT( + "Ritorno al menu \xEE\x81\xB3HOME non disponibile.\n" + "Stai per riavviare la tua console.\n\n" + " \xEE\x80\x80 Riavvia\n" + " \xEE\x80\x81 Annulla" + ), + STR_JP( + "\xEE\x81\xB3HOMEに戻ることはできません。\n" + "コンソールが今すぐ再起動する。\n\n" + " \xEE\x80\x80 再起動\n" + " \xEE\x80\x81 キャンセル" + ), + STR_PT( + "Regressar para \xEE\x81\xB3HOME não está\n" + "disponível. Está a reiniciar a sua consola.\n\n" + " \xEE\x80\x80 Reiniciar\n" + " \xEE\x80\x81 Cancelar" + ), + STR_NL( + "Terugkeren naar \xEE\x81\xB3HOME is niet\n" + "beschikbaar.Wil je de console herstarten?\n\n" + " \xEE\x80\x80 Herstarten\n" + " \xEE\x80\x81 Annuleren" + ), + STR_KO( + "\xEE\x81\xB3홈으로 돌아갈 수 없습니다.\n" + "당신의 기기를 리부팅 하려 합니다.\n\n" + " \xEE\x80\x80 리부팅\n" + " \xEE\x80\x81 취소" + ), + STR_RU( + "Возврат к \xEE\x81\xB3HOME недоступен.\n" + "Вы собираетесь перезагрузить консоль.\n\n" + " \xEE\x80\x80 Перезагрузите\n" + " \xEE\x80\x81 Отмена" + ), + STR_ZH( + "无法返回至主机的 \xEE\x81\xB3HOME 菜单。\n" + "您需要重新启动您的 3DS 设备。\n\n" + " \xEE\x80\x80 重启设备\n" + " \xEE\x80\x81 取消操作" + ), + STR_TW( + "無法返回至主機的 \xEE\x81\xB3HOME 選單。\n" + "您需要重新啓動您的 3DS 設備。\n\n" + " \xEE\x80\x80 重啓設備\n" + " \xEE\x80\x81 取消操作" + ), + },*/ + + /*[StrId_ReturnToHome] = + { + STR_EN( + "You're about to return to \xEE\x81\xB3HOME.\n\n" + " \xEE\x80\x80 Return\n" + " \xEE\x80\x81 Cancel\n" + " \xEE\x80\x82 Reboot" + ), + STR_ES( + "Está a punto de volver a \xEE\x81\xB3HOME.\n\n" + " \xEE\x80\x80 Volver\n" + " \xEE\x80\x81 Cancelar\n" + " \xEE\x80\x82 Reiniciar" + ), + STR_DE( + "Rückkehr zum \xEE\x81\xB3HOME-Menü.\n\n" + " \xEE\x80\x80 Fortfahren\n" + " \xEE\x80\x81 Abbrechen\n" + " \xEE\x80\x82 Konsole neustarten" + ), + STR_FR( + "Retour au menu \xEE\x81\xB3HOME.\n\n" + " \xEE\x80\x80 Continuer\n" + " \xEE\x80\x81 Annuler\n" + " \xEE\x80\x82 Redémarrer" + ), + STR_IT( + "Ritorno al menu \xEE\x81\xB3HOME.\n\n" + " \xEE\x80\x80 Continua\n" + " \xEE\x80\x81 Annulla\n" + " \xEE\x80\x82 Riavvia" + ), + STR_JP( + "あなたは今すぐ\xEE\x81\xB3HOMEに戻されます。\n\n" + " \xEE\x80\x80 戻る\n" + " \xEE\x80\x81 キャンセル\n" + " \xEE\x80\x82 再起動" + ), + STR_PT( + "Regressar ao menu \xEE\x81\xB3HOME.\n\n" + " \xEE\x80\x80 Regressar\n" + " \xEE\x80\x81 Cancelar\n" + " \xEE\x80\x82 Reiniciar" + ), + STR_NL( + "Je keert zo terug naar \xEE\x81\xB3HOME.\n\n" + " \xEE\x80\x80 Doorgaan\n" + " \xEE\x80\x81 Annuleren\n" + " \xEE\x80\x82 Herstarten" + ), + STR_KO( + "\xEE\x81\xB3홈으로 돌아가려 합니다.\n\n" + " \xEE\x80\x80 이동\n" + " \xEE\x80\x81 취소\n" + " \xEE\x80\x82 리부팅" + ), + STR_RU( + "Вы возвращаетесь в \xEE\x81\xB3HOME.\n\n" + " \xEE\x80\x80 Вернуть\n" + " \xEE\x80\x81 Отмена\n" + " \xEE\x80\x82 Перезагрузите" + ), + STR_ZH( + "您即将返回到主機的 \xEE\x81\xB3HOME 菜单。\n\n" + " \xEE\x80\x80 确认返回\n" + " \xEE\x80\x81 取消操作\n" + " \xEE\x80\x82 重启设备" + ), + STR_TW( + "您即將返回到主機的 \xEE\x81\xB3HOME 選單。\n\n" + " \xEE\x80\x80 確認返回\n" + " \xEE\x80\x81 取消操作\n" + " \xEE\x80\x82 重啓設備" + ), + },*/ + + /*[StrId_TitleSelector] = + { + STR_EN("Title selector"), + STR_ES("Selector de título"), + STR_DE("Titel-Selektor"), + STR_FR("Sélecteur de titre"), + STR_IT("Selettore del titolo"), + STR_JP("タイトルセレクタ"), + STR_PT("Selector de Títulos"), + STR_NL("Titel selector"), + STR_KO("타이틀 선택기"), + STR_RU("Селектор заголовков"), + STR_ZH("应用启动器"), + STR_TW("自製程式啓動器"), + }, + + [StrId_ErrorReadingTitleMetadata] = + { + STR_EN("Error reading title metadata.\n%08lX%08lX@%d"), + STR_ES("Error leyendo los metadatos de los títulos.\n%08lX%08lX@%d"), + STR_DE("Fehler beim lesen der Titel-Metadaten.\n%08lX%08lX@%d"), + STR_FR( + "Erreur lors de la lecture des métadonnées\n" + "de titre.\n%08lX%08lX@%d" + ), + STR_IT("Errore nella lettura dei metadata dei titoli.\n%08lX%08lX@%d"), + STR_JP("タイトルメタデータを読み取ることができませんでした。\n%08lX%08lX@%d"), + STR_PT("Erro a ler os metadados do título.\n%08lX%08lX@%d"), + STR_NL("Fout bij het lezen van titel metadata.\n%08lX%08lX@%d"), + STR_KO("타이틀 메타데이터를 읽는데 실패하였습니다.\n%08lX%08lX@%d"), + STR_RU("Ошибка чтения метаданных заголовка\n.%08lX%08lX@%d"), + STR_ZH("读取软件相关信息时发生错误:\n%08lX%08lX@%d"), + STR_TW("讀取軟體相關數據時發生錯誤:\n%08lX%08lX@%d"), + }, + + [StrId_NoTitlesFound] = + { + STR_EN("No titles could be detected."), + STR_ES("No se han podido detectar títulos."), + STR_DE("Keine Titel gefunden."), + STR_FR("Aucun titre trouvé."), + STR_IT("Nessun titolo trovato."), + STR_JP("タイトルが見つかりませんでした。"), + STR_PT("Nenhum título foi encontrado."), + STR_NL("Geen titels gevonden."), + STR_KO("타이틀을 찾지 못하였습니다."), + STR_RU("Заголовки не обнаружены"), + STR_ZH("主机内找不到任何软件。"), + STR_TW("主機内找不到任何軟體。"), + }, + + [StrId_SelectTitle] = + { + STR_EN( + "Please select a target title.\n\n" + " \xEE\x80\x80 Select\n" + " \xEE\x80\x81 Cancel" + ), + STR_ES( + "Elija el título de destino.\n\n" + " \xEE\x80\x80 Seleccionar\n" + " \xEE\x80\x81 Cancelar" + ), + STR_DE( + "Bitte wähle den Ziel-Titel aus.\n\n" + " \xEE\x80\x80 Auswählen\n" + " \xEE\x80\x81 Abbrechen" + ), + STR_FR( + "Veuillez sélectionner un titre de destination.\n\n" + " \xEE\x80\x80 Sélectionner\n" + " \xEE\x80\x81 Annuler" + ), + STR_IT( + "Seleziona il titolo di destinazione.\n\n" + " \xEE\x80\x80 Seleziona\n" + " \xEE\x80\x81 Annulla" + ), + STR_JP( + "ターゲットタイトルを選択してください。\n\n" + " \xEE\x80\x80 選択\n" + " \xEE\x80\x81 キャンセル" + ), + STR_PT( + "Por favor escolha um título alvo.\n\n" + " \xEE\x80\x80 Escolher\n" + " \xEE\x80\x81 Cancelar" + ), + STR_NL( + "Selecteer een titel.\n\n" + " \xEE\x80\x80 Selecteer\n" + " \xEE\x80\x81 Annuleren" + ), + STR_KO( + "대상 타이틀을 선택해 주십시오.\n\n" + " \xEE\x80\x80 선택\n" + " \xEE\x80\x81 취소" + ), + STR_RU( + "Выберите целевой заголовок.\n\n" + " \xEE\x80\x80 Выберите\n" + " \xEE\x80\x81 Отмена" + ), + STR_ZH( + "请选择一个目标软件。\n\n" + " \xEE\x80\x80 确认\n" + " \xEE\x80\x81 取消" + ), + STR_TW( + "請選擇一個目標軟體。\n\n" + " \xEE\x80\x80 確認\n" + " \xEE\x80\x81 取消" + ), + }, + + [StrId_NoTargetTitleSupport] = + { + STR_EN( + "This homebrew exploit does not have support\n" + "for launching applications under target titles.\n" + "Please use a different exploit." + ), + STR_ES( + "Este exploit de homebrew no tiene soporte para\n" + "ejecutar aplicaciones bajo títulos de destino.\n" + "Use otro exploit diferente." + ), + STR_DE( + "Dieser Homebrew-Exploit unterstützt das Starten\n" + "von Anwendungen unter Ziel-Titeln nicht.\n" + "Bitte verwende einen anderen Exploit." + ), + STR_FR( + "Cet exploit homebrew ne permet pas de lancer\n" + "des applications sous des titres précis.\n" + "Veuillez utiliser un exploit différent." + ), + STR_IT( + "Questo exploit homebrew non permette di avviare\n" + "applicazioni in titoli specifici.\n" + "Utilizza un exploit diverso." + ), + STR_JP( + "この自家製のエクスプロイトは、ターゲットタイトルの\n" + "下でアプリを起動することができません。\n" + "別のエクスプロイトを使用してください。" + ), + STR_PT( + "Este exploit homebrew não têm suporte\n" + "para executar aplicações no título alvo.\n" + "Por favor use um exploit diferente." + ), + STR_NL( + "Deze homebrew exploit heeft geen ondersteuning\n" + "voor het starten van toepassingen met de gekozen titlel.\n" + "Gebruik een andere exploit." + ), + STR_KO( + "이 홈브류 익스플로잇은 해당 타이틀에서 어플리케이션을\n" + "실행시키는 것을 지원하지 않습니다.\n" + "다른 익스플로잇을 사용해 주십시오." + ), + STR_RU( + "Этот эксплойт homebrew не поддерживает запуск\n" + "приложений под целевыми заголовками.\n" + "Пожалуйста, используйте другой эксплойт." + ), + STR_ZH( + "您所利用漏洞启动的「自制软件启动器」,\n" + "无法在当前选中的软件中启动自制软件。\n" + "请使用其它的漏洞来启动「自制软件启动器」。" + ), + STR_TW( + "您所利用漏洞開啓的「自製軟體啓動器」\n" + "無法在當前選中的軟體啓動自製軟件。\n" + "請利用其它漏洞來啓動「自製軟體啓動器」。" + ), + }, + + [StrId_MissingTargetTitle] = + { + STR_EN( + "The application you attempted to run requires\n" + "a title that is not installed in the system." + ), + STR_ES( + "La aplicación seleccionada necesita un título\n" + "que no está instalado en el sistema." + ), + STR_DE( + "Die ausgewählte Anwendung benötigt einen\n" + "Titel der nicht installiert ist" + ), + STR_FR( + "L'application sélectionnée requiert un titre\n" + "qui n'a pas été installé sur le système." + ), + STR_IT( + "L'applicazione selezionata richiede un titolo\n" + "che non è installato nel sistema." + ), + STR_JP( + "このアプリを実行するために\n" + "適切なタイトルがインストールされていません。" + ), + STR_PT( + "A aplicação que acabou de tentar executar requer\n" + "um título que não está instalado neste sistema." + ), + STR_NL( + "De toepassing die je probeert te starten\n" + "vereist een titel die niet geinstalleerd is." + ), + STR_KO( + "시도한 애플리케이션의 실행에 필요한 타이틀이\n" + "시스템에 설치되어 있지 않습니다." + ), + STR_RU( + "Для приложения требуется зависимость,\n" + "которая не установлена." + ), + STR_ZH( + "主机找不到该应用程序\n" + "所需求的软件。" + ), + STR_TW( + "主機找不到該應用程式\n" + "所需求的軟體。" + ), + },*/ + + /*[StrId_NetLoader] = + { + STR_EN("3dslink NetLoader"), + STR_ES("Cargador de programas 3dslink"), + STR_DE("3dslink Netzwerk-Loader"), + STR_FR("Chargeur de programme 3dslink"), + STR_IT("Caricamento programmi 3dslink"), + STR_JP("3dslinkネットローダ"), + STR_PT("Carregador de programas 3dslink"), + STR_NL("3dslink netwerk lader"), + STR_KO("3dslink 넷로더"), + STR_RU("Загрузчик 3dslink"), + STR_ZH("3dslink 网络执行模块"), + STR_TW("3dslink 網路執行模組"), + }, + + [StrId_NetLoaderUnavailable] = + { + STR_EN("The NetLoader is currently unavailable."), + STR_ES("El cargador de programas no está disponible."), + STR_DE("Der Netzwerk-Loader ist zur Zeit nicht verfügbar."), + STR_FR("Le chargeur de programme 3dslink est indisponible."), + STR_IT("Il caricamento programmi 3dslink non è disponibile."), + STR_JP("3dslinkネットローダを利用できません。"), + STR_PT("O carregador de programas está de momento indisponível."), + STR_NL("De netwerk lader is niet beschikbaar."), + STR_KO("넷로더는 현재 사용이 불가능 합니다."), + STR_RU("Загрузчик в настоящее время недоступен."), + STR_ZH("无法启动 3dslink 网络执行模块。"), + STR_TW("無法啓動 3dslink 網路執行模組。"), + }, + + [StrId_NetLoaderError] = + { + STR_EN("An error occurred.\nTechnical details: [%s:%d]"), + STR_ES("Ha ocurrido un error.\nDatos técnicos: [%s:%d]"), + STR_DE("Ein Fehler ist aufgetreten\nTechnische Details: [%s:%d]"), + STR_FR("Une erreur s'est produite.\nDétails techniques : [%s:%d]"), + STR_IT("Si è verificato un errore.\nDettagli tecnici : [%s:%d]"), + STR_JP("エラーが発生しました。\n技術的な詳細:[%s:%d]"), + STR_PT("Ocorreu um erro.\nDetalhes técnicos: [%s:%d]"), + STR_NL("Er is een fout opgetreden\nTechnische details: [%s:%d]"), + STR_KO("에러가 발생했습니다.\n상세: [%s:%d]"), + STR_RU("Произошла ошибка.\nТехнические подробности: [%s:%d]"), + STR_ZH("发生错误。\n详细错误信息:[%s:%d]"), + STR_TW("發生錯誤。\n詳細錯誤資訊:[%s:%d]"), + }, + + [StrId_NetLoaderOffline] = + { + STR_EN("Offline, waiting for network…\n\n\n \xEE\x80\x81 Cancel"), + STR_ZH("无法连接网络,等待网络连接…\n\n\n \xEE\x80\x81 取消"), + STR_TW("當前離線,等待網路連線…\n\n\n \xEE\x80\x81 取消"), + STR_IT("Disconnesso, in attesa della connessione…\n\n\n \xEE\x80\x81 Annullare"), + }, + + [StrId_NetLoaderActive] = + { + STR_EN( + "Waiting for 3dslink to connect…\n" + "IP Addr: %lu.%lu.%lu.%lu, Port: %d\n\n" + " \xEE\x80\x81 Cancel" + ), + STR_ES( + "Esperando a que se conecte 3dslink…\n" + "Dir.IP: %lu.%lu.%lu.%lu, Puerto: %d\n\n" + " \xEE\x80\x81 Cancelar" + ), + STR_DE( + "Warte auf Verbindung von 3dslink…\n" + "IP Addr: %lu.%lu.%lu.%lu, Port: %d\n\n" + " \xEE\x80\x81 Abbrechen" + ), + STR_FR( + "En attente de la connexion de 3dslink…\n" + "Adr. IP : %lu.%lu.%lu.%lu, Port : %d\n\n" + " \xEE\x80\x81 Annuler" + ), + STR_IT( + "In attesa della connessione di 3dslink…\n" + "Ind. IP : %lu.%lu.%lu.%lu, Porta : %d\n\n" + " \xEE\x80\x81 Annullare" + ), + STR_JP( + "3dslinkが接続するのを待っている…\n" + "IPアドレス:%lu.%lu.%lu.%lu, ポート番号:%d\n\n" + " \xEE\x80\x81 キャンセル" + ), + STR_PT( + "A aguardar pela conexão do 3dslink…\n" + "End. IP: %lu.%lu.%lu.%lu, Porta: %d\n\n" + " \xEE\x80\x81 Cancelar" + ), + STR_NL( + "Wachten op 3dslink verbinding…\n" + "IP Addr: %lu.%lu.%lu.%lu, Poort: %d\n\n" + " \xEE\x80\x81 Annuleren" + ), + STR_KO( + "3dslink 의 연결을 대기중…\n" + "IP 주소: %lu.%lu.%lu.%lu, 포트: %d\n\n" + " \xEE\x80\x81 취소" + ), + STR_RU( + "Ожидание подключения 3dslink…\n" + "айпи адрес: %lu.%lu.%lu.%lu, Порт: %d\n\n" + " \xEE\x80\x81 Отмена" + ), + STR_ZH( + "等待 3dslink 连接…\n" + "IP 地址:%lu.%lu.%lu.%lu,端口:%d\n\n" + " \xEE\x80\x81 取消等待" + ), + STR_TW( + "等待 3dslink 連接…\n" + "IP 位址:%lu.%lu.%lu.%lu,連接埠:%d\n\n" + " \xEE\x80\x81 取消等待" + ), + }, + + [StrId_NetLoaderTransferring] = + { + STR_EN( + "Transferring…\n" + "%zu out of %zu KiB written" + ), + STR_ES( + "Transfiriendo…\n" + "%zu de %zu KiB escritos" + ), + STR_DE( + "Übertragen…\n" + "%zu von %zu KiB geschrieben" + ), + STR_FR( + "Transfert…\n" + "%zu sur %zu Kio écrits" + ), + STR_IT( + "Trasferimento…\n" + "%zu di %zu KiB scritti" + ), + STR_JP( + "データが転送されます…\n" + "%zu / %zu KiB 書かれた" + ), + STR_PT( + "A transferir…\n" + "%zu de %zu KiB escritos" + ), + STR_NL( + "Overbrengen…\n" + "%zu van %zu KiB geschreven" + ), + STR_KO( + "전송중…\n" + "%zu / %zu KiB 전송" + ), + STR_RU( + "Передача…\n" + "%zu из %zu КИБ написано" + ), + STR_ZH( + "正在传输…\n" + "已完成 %zu / %zu KiB" + ), + STR_TW( + "正在傳輸…\n" + "已完成 %zu / %zu KiB" + ), + },*/ +}; + diff --git a/common/language.h b/common/language.h new file mode 100644 index 0000000..e446bb4 --- /dev/null +++ b/common/language.h @@ -0,0 +1,37 @@ +#pragma once + +typedef enum +{ + StrId_Loading = 0, + StrId_Directory, + StrId_DefaultVersion, + StrId_DefaultPublisher, + StrId_IOError, + StrId_CouldNotOpenFile, + + StrId_NoAppsFound_Title, + StrId_NoAppsFound_Msg, + + StrId_Reboot, + StrId_ReturnToHome, + + StrId_TitleSelector, + StrId_ErrorReadingTitleMetadata, + StrId_NoTitlesFound, + StrId_SelectTitle, + + StrId_NoTargetTitleSupport, + StrId_MissingTargetTitle, + + StrId_NetLoader, + StrId_NetLoaderUnavailable, + StrId_NetLoaderOffline, + StrId_NetLoaderError, + StrId_NetLoaderActive, + StrId_NetLoaderTransferring, + + StrId_Max, +} StrId; + +extern const char* const g_strings[StrId_Max][16]; + diff --git a/common/launch.c b/common/launch.c new file mode 100644 index 0000000..16e660c --- /dev/null +++ b/common/launch.c @@ -0,0 +1,59 @@ +#include "common.h" + +size_t launchAddArg(argData_s* ad, const char* arg) { + size_t len = strlen(arg)+1; + if ((ad->dst+len) >= (char*)(ad+1)) return len; // Overflow + ad->buf[0]++; + strcpy(ad->dst, arg); + ad->dst += len; + return len; +} + +void launchAddArgsFromString(argData_s* ad, char* arg) { + char c, *pstr, *str=arg, *endarg = arg+strlen(arg); + + do + { + do + { + c = *str++; + } while ((c == ' ' || c == '\t') && str < endarg); + + pstr = str-1; + + if (c == '\"') + { + pstr++; + while(*str++ != '\"' && str < endarg); + } + else if (c == '\'') + { + pstr++; + while(*str++ != '\'' && str < endarg); + } + else + { + do + { + c = *str++; + } while (c != ' ' && c != '\t' && str < endarg); + } + + str--; + + if (str == (endarg - 1)) + { + if(*str == '\"' || *str == '\'') + *(str++) = 0; + else + str++; + } + else + { + *(str++) = '\0'; + } + + launchAddArg(ad, pstr); + + } while(strtype = type; +} + +void menuEntryFree(menuEntry_s* me) { + me->icon_size = 0; + if (me->icon) { + free(me->icon); + me->icon = NULL; + } + + if (me->icon_gfx) { + free(me->icon_gfx); + me->icon_gfx = NULL; + } + + if (me->nacp) { + free(me->nacp); + me->nacp = NULL; + } +} + +bool fileExists(const char* path) { + struct stat st; + return stat(path, &st)==0 && S_ISREG(st.st_mode); +} + +static bool menuEntryLoadEmbeddedIcon(menuEntry_s* me) { + NroHeader header; + AssetHeader asset_header; + + FILE* f = fopen(me->path, "rb"); + if (!f) return false; + + fseek(f, sizeof(NroStart), SEEK_SET); + if (fread(&header, sizeof(header), 1, f) != 1) + { + fclose(f); + return false; + } + + fseek(f, header.size, SEEK_SET); + + if (fread(&asset_header, sizeof(asset_header), 1, f) != 1 + || asset_header.magic != ASSETHEADER_MAGICNUM + || asset_header.version > ASSETHEADER_VERSION + || asset_header.icon.offset == 0 + || asset_header.icon.size == 0) + { + fclose(f); + return false; + } + + me->icon_size = asset_header.icon.size; + me->icon = (uint8_t*)malloc(me->icon_size); + if (me->icon == NULL) { + fclose(f); + return false; + } + memset(me->icon, 0, me->icon_size); + + fseek(f, header.size + asset_header.icon.offset, SEEK_SET); + bool ok = fread(me->icon, me->icon_size, 1, f) == 1; + fclose(f); + return ok; +} + +static bool menuEntryLoadEmbeddedNacp(menuEntry_s* me) { + NroHeader header; + AssetHeader asset_header; + + FILE* f = fopen(me->path, "rb"); + if (!f) return false; + + fseek(f, sizeof(NroStart), SEEK_SET); + if (fread(&header, sizeof(header), 1, f) != 1) + { + fclose(f); + return false; + } + + fseek(f, header.size, SEEK_SET); + + if (fread(&asset_header, sizeof(asset_header), 1, f) != 1 + || asset_header.magic != ASSETHEADER_MAGICNUM + || asset_header.version > ASSETHEADER_VERSION + || asset_header.nacp.offset == 0 + || asset_header.nacp.size == 0) + { + fclose(f); + return false; + } + + if (asset_header.nacp.size < sizeof(NacpStruct)) + { + fclose(f); + return false; + } + + me->nacp = (NacpStruct*)malloc(sizeof(NacpStruct)); + if (me->nacp == NULL) { + fclose(f); + return false; + } + + fseek(f, header.size + asset_header.nacp.offset, SEEK_SET); + bool ok = fread(me->nacp, sizeof(NacpStruct), 1, f) == 1; + fclose(f); + return ok; +} + +/*static void fixSpaceNewLine(char* buf) { + char *outp = buf, *inp = buf; + char lastc = 0; + do + { + char c = *inp++; + if (c == ' ' && lastc == ' ') + outp[-1] = '\n'; + else + *outp++ = c; + lastc = c; + } while (lastc); +}*/ + +bool menuEntryLoad(menuEntry_s* me, const char* name, bool shortcut) { + static char tempbuf[PATH_MAX+1]; + //bool isOldAppFolder = false; + + tempbuf[PATH_MAX] = 0; + strcpy(me->name, name); + if (me->type == ENTRY_TYPE_FOLDER) + { + snprintf(tempbuf, sizeof(tempbuf)-1, "%.*s/%.*s.nro", (int)sizeof(tempbuf)/2, me->path, (int)sizeof(tempbuf)/2-7, name); + bool found = fileExists(tempbuf); + + if (found) + { + //isOldAppFolder = true; + shortcut = false; + me->type = ENTRY_TYPE_FILE; + strcpy(me->path, tempbuf); + } /*else + strcpy(me->name, textGetString(StrId_Directory));*/ + } + + if (me->type == ENTRY_TYPE_FILE) + { + strcpy(me->name, name); + strcpy(me->author, textGetString(StrId_DefaultPublisher)); + strcpy(me->version, textGetString(StrId_DefaultVersion)); + + //shortcut_s sc; + + /*if (shortcut) + { + if (R_FAILED(shortcutCreate(&sc, me->path))) + return false; + if (!fileExists(sc.executable)) + { + shortcutFree(&sc); + return false; + } + strcpy(me->path, "sdmc:"); + strcat(me->path, sc.executable); + }*/ + + bool iconLoaded = false; + + // Load the icon + /*if (shortcut) + { + FILE* f = sc.icon ? fopen(sc.icon, "rb") : NULL; + if (f) + { + iconLoaded = fread(&me->smdh, sizeof(smdh_s), 1, f) == 1; + fclose(f); + } + }*/ + + if (!iconLoaded) do + { + // Attempt loading external icon + /*strcpy(tempbuf, me->path); + char* ext = getExtension(tempbuf); + + strcpy(ext, ".jpg"); + iconLoaded = menuEntryLoadExternalIcon(me, tempbuf); + if (iconLoaded) break; + + if (isOldAppFolder) + { + char* slash = getSlash(tempbuf); + + strcpy(slash, "/icon.jpg"); + iconLoaded = menuEntryLoadExternalIcon(me, tempbuf); + if (iconLoaded) break; + }*/ + + // Attempt loading the embedded icon + if (!shortcut) + iconLoaded = menuEntryLoadEmbeddedIcon(me); + } while (0); + + if (iconLoaded) + { + menuEntryParseIcon(me); + } + + bool nacpLoaded = false; + + nacpLoaded = menuEntryLoadEmbeddedNacp(me); + + if (nacpLoaded) + { + menuEntryParseNacp(me); + + // Fix description for some applications using multiple spaces to indicate newline + //fixSpaceNewLine(me->description); + } + + // Metadata overrides for shortcuts + /*if (shortcut) + { + if (sc.name) strncpy(me->name, sc.name, ENTRY_NAMELENGTH); + if (sc.description) strncpy(me->description, sc.description, ENTRY_DESCLENGTH); + if (sc.author) strncpy(me->author, sc.author, ENTRY_AUTHORLENGTH); + }*/ + + // Load the descriptor + /*if (shortcut && sc.descriptor && fileExists(sc.descriptor)) + descriptorLoad(&me->descriptor, sc.descriptor); + else + { + strcpy(tempbuf, me->path); + strcpy(getExtension(tempbuf), ".xml"); + bool found = fileExists(tempbuf); + if (!found && isOldAppFolder) + { + strcpy(tempbuf, me->path); + strcpy(getSlash(tempbuf), "/descriptor.xml"); + found = fileExists(tempbuf); + } + if (found) + descriptorLoad(&me->descriptor, tempbuf); + }*/ + + // Initialize the argument data + argData_s* ad = &me->args; + ad->dst = (char*)&ad->buf[1]; + launchAddArg(ad, me->path); + + // Load the argument(s) from the shortcut + /*if (shortcut && sc.arg && *sc.arg) + launchAddArgsFromString(ad, sc.arg);*/ + + /*if (shortcut) + shortcutFree(&sc);*/ + } + + return true; +} + +void menuEntryParseIcon(menuEntry_s* me) { + uint8_t *imageptr = NULL; + size_t imagesize = 256*256*3; + + if (me->icon_size==0 || me->icon==NULL) return; + + njInit(); + + if (njDecode(me->icon, me->icon_size) != NJ_OK) { + njDone(); + return; + } + + me->icon_size = 0; + free(me->icon); + me->icon = NULL; + + if ((njGetWidth() != 256 || njGetHeight() != 256 || (size_t)njGetImageSize() != imagesize) || njIsColor() != 1) {//The decoded image must be RGB and 256x256. + njDone(); + return; + } + + imageptr = njGetImage(); + if (imageptr == NULL) { + njDone(); + return; + } + + me->icon_gfx = (uint8_t*)malloc(imagesize); + if (me->icon_gfx == NULL) { + njDone(); + return; + } + + memcpy(me->icon_gfx, imageptr, imagesize); + + njDone(); +} + +void menuEntryParseNacp(menuEntry_s* me) { + int lang = 0;//TODO: Update this once libnx supports settings get-language. + + if (me->nacp==NULL) return; + + strncpy(me->name, me->nacp->lang[lang].name, sizeof(me->name)-1); + strncpy(me->author, me->nacp->lang[lang].author, sizeof(me->author)-1); + strncpy(me->version, me->nacp->version, sizeof(me->version)-1); + + free(me->nacp); + me->nacp = NULL; +} + diff --git a/common/menu-list.c b/common/menu-list.c new file mode 100644 index 0000000..67db454 --- /dev/null +++ b/common/menu-list.c @@ -0,0 +1,150 @@ +#include "common.h" + +static menu_s s_menu[2]; +static bool s_curMenu; + +menu_s* menuGetCurrent(void) { + return &s_menu[s_curMenu]; +} + +static menuEntry_s* menuCreateEntry(MenuEntryType type) { + menuEntry_s* me = (menuEntry_s*)malloc(sizeof(menuEntry_s)); + menuEntryInit(me, type); + return me; +} + +static void menuDeleteEntry(menuEntry_s* me) { + menuEntryFree(me); + free(me); +} + +static void menuAddEntry(menuEntry_s* me) { + menu_s* m = &s_menu[!s_curMenu]; + me->menu = m; + if (m->lastEntry) + { + m->lastEntry->next = me; + m->lastEntry = me; + } else + { + m->firstEntry = me; + m->lastEntry = me; + } + m->nEntries ++; +} + +static void menuClear(void) { + menu_s* m = &s_menu[!s_curMenu]; + menuEntry_s *cur, *next; + for (cur = m->firstEntry; cur; cur = next) + { + next = cur->next; + menuDeleteEntry(cur); + } + memset(m, 0, sizeof(*m)); +} + +static int menuEntryCmp(const void *p1, const void *p2) { + const menuEntry_s* lhs = *(menuEntry_s**)p1; + const menuEntry_s* rhs = *(menuEntry_s**)p2; + + if(lhs->type == rhs->type) + return strcasecmp(lhs->name, rhs->name); + if(lhs->type == ENTRY_TYPE_FOLDER) + return -1; + return 1; +} + +static void menuSort(void) { + int i; + menu_s* m = &s_menu[!s_curMenu]; + int nEntries = m->nEntries; + if (nEntries==0) return; + + menuEntry_s** list = (menuEntry_s**)calloc(nEntries, sizeof(menuEntry_s*)); + if(list == NULL) return; + + menuEntry_s* p = m->firstEntry; + for(i = 0; i < nEntries; ++i) { + list[i] = p; + p = p->next; + } + + qsort(list, nEntries, sizeof(menuEntry_s*), menuEntryCmp); + + menuEntry_s** pp = &m->firstEntry; + for(i = 0; i < nEntries; ++i) { + *pp = list[i]; + pp = &(*pp)->next; + } + m->lastEntry = list[nEntries-1]; + *pp = NULL; + + free(list); +} + +int menuScan(const char* target) { + if (chdir(target) < 0) return 1; + if (getcwd(s_menu[!s_curMenu].dirname, PATH_MAX+1) == NULL) + return 1; + + DIR* dir; + struct dirent* dp; + char tmp_path[PATH_MAX+1]; + dir = opendir(s_menu[!s_curMenu].dirname); + if (!dir) return 2; + + while ((dp = readdir(dir))) + { + menuEntry_s* me = NULL; + bool shortcut = false; + /*if (entry->attributes & FS_ATTRIBUTE_HIDDEN) + continue;*/ + + bool entrytype=0; + + memset(tmp_path, 0, sizeof(tmp_path)); + snprintf(tmp_path, sizeof(tmp_path)-1, "%s%s", s_menu[!s_curMenu].dirname, dp->d_name); + + #ifdef SWITCH + fsdev_dir_t* dirSt = (fsdev_dir_t*)dir->dirData->dirStruct; + FsDirectoryEntry* entry = &dirSt->entry_data[dirSt->index]; + + entrytype = entry->type == ENTRYTYPE_DIR; + #else + struct stat tmpstat; + + if(stat(tmp_path, &tmpstat)==-1) + continue; + + entrytype = (tmpstat.st_mode & S_IFMT) != S_IFREG; + #endif + + if (entrytype) + me = menuCreateEntry(ENTRY_TYPE_FOLDER); + else + { + const char* ext = getExtension(dp->d_name); + if (strcasecmp(ext, ".nro")==0/* || (shortcut = strcasecmp(ext, ".xml")==0)*/) + me = menuCreateEntry(ENTRY_TYPE_FILE); + } + + if (!me) + continue; + + strncpy(me->path, tmp_path, sizeof(me->path)-1); + if (menuEntryLoad(me, dp->d_name, shortcut)) + menuAddEntry(me); + else + menuDeleteEntry(me); + } + + closedir(dir); + menuSort(); + + // Swap the menu and clear the previous menu + s_curMenu = !s_curMenu; + menuClear(); + return 0; +} + diff --git a/common/menu.c b/common/menu.c new file mode 100644 index 0000000..e828f89 --- /dev/null +++ b/common/menu.c @@ -0,0 +1,140 @@ +#include "common.h" + +#include "switchicon_questionmark_bin.h" +#include "folder_icon_bin.h" + +void launchMenuEntryTask(menuEntry_s* arg) +{ + menuEntry_s* me = arg; + if (me->type == ENTRY_TYPE_FOLDER) + menuScan(me->path); + //changeDirTask(me->path); + else + launchMenuEntry(me); +} + +//Draws a RGB888 image. +static void drawImage(int x, int y, int width, int height, const uint8_t *image) { + int tmpx, tmpy; + int pos; + + for (tmpx=0; tmpxicon_gfx) + imageptr = me->icon_gfx; + else if (me->type == ENTRY_TYPE_FOLDER) + imageptr = (uint8_t*)folder_icon_bin; + else + imageptr = (uint8_t*)switchicon_questionmark_bin; + + if (imageptr) drawImage(start_x, start_y+32, 256, 256, imageptr); + + DrawTextTruncate(tahoma12, start_x + 8, start_y + 8, MakeColor(64, 64, 64, 255), me->name, 256 - 32, "..."); + + if (is_active) { + start_x = 64; + start_y = 96 + 32; + + memset(tmpstr, 0, sizeof(tmpstr)); + snprintf(tmpstr, sizeof(tmpstr)-1, "Name: %s\nAuthor: %s\nVersion: %s", me->name, me->author, me->version); + DrawText(tahoma12, start_x, start_y, MakeColor(64, 64, 64, 255), tmpstr); + } +} + +void menuStartup() { + const char *path; + + #ifdef SWITCH + path = "sdmc:/switch"; + #else + path = "switch"; + #endif + + menuScan(path); +} + +void menuLoop() { + menuEntry_s* me; + menu_s* menu = menuGetCurrent(); + int i; + int cnt=0; + int x, y; + + for (x=0; x<1280; x++) { + for (y=0; y<122; y++) { + DrawPixelRaw(x, y, MakeColor(237+8, 237+8, 237+8, 237+8)); + } + } + + DrawText(tahoma24, 64, 64, MakeColor(64, 64, 64, 255), "The Homebrew Launcher"); + DrawText(tahoma12, 64 + 256 + 128 + 128, 64 + 16, MakeColor(64, 64, 64, 255), "v1.0.0"); + DrawText(tahoma12, 64 + 256 + 128 + 128, 64 + 16 + 16, MakeColor(64, 64, 64, 255), menu->dirname); + + if (menu->nEntries==0) + { + DrawText(tahoma12, 64, 96 + 32, MakeColor(64, 64, 64, 255), textGetString(StrId_NoAppsFound_Msg)); + } else + { + // Draw menu entries + for (me = menu->firstEntry, i = 0; me; me = me->next, i ++) { + if ((i < menu->curEntry && menu->curEntry-i < 4) || i>=menu->curEntry) { + drawEntry(me, cnt, i==menu->curEntry); + cnt++; + if (cnt==4) break; + } + } + } +} diff --git a/common/menu.h b/common/menu.h new file mode 100644 index 0000000..3083291 --- /dev/null +++ b/common/menu.h @@ -0,0 +1,75 @@ +#pragma once + +#define ENTRY_NAMELENGTH 0x200 +#define ENTRY_AUTHORLENGTH 0x100 +#define ENTRY_VERLENGTH 0x10 +#define ENTRY_ARGBUFSIZE 0x400 + +typedef enum +{ + ENTRY_TYPE_FILE, + ENTRY_TYPE_FOLDER, +} MenuEntryType; + +typedef struct menuEntry_s_tag menuEntry_s; +typedef struct menu_s_tag menu_s; + +struct menu_s_tag +{ + menuEntry_s *firstEntry, *lastEntry; + int nEntries; + int curEntry; + + char dirname[PATH_MAX+1]; +}; + +typedef struct +{ + char* dst; + uint32_t buf[ENTRY_ARGBUFSIZE/sizeof(uint32_t)]; +} argData_s; + +struct menuEntry_s_tag +{ + menu_s* menu; + menuEntry_s* next; + MenuEntryType type; + + char path[PATH_MAX+1]; + argData_s args; + + char name[ENTRY_NAMELENGTH+1]; + char author[ENTRY_AUTHORLENGTH+1]; + char version[ENTRY_VERLENGTH+1]; + + uint8_t *icon; + size_t icon_size; + uint8_t *icon_gfx; + + NacpStruct *nacp; +}; + +void menuEntryInit(menuEntry_s* me, MenuEntryType type); +void menuEntryFree(menuEntry_s* me); +bool fileExists(const char* path); +bool menuEntryLoad(menuEntry_s* me, const char* name, bool shortcut); +void menuEntryParseIcon(menuEntry_s* me); +void menuEntryParseNacp(menuEntry_s* me); + +menu_s* menuGetCurrent(void); +int menuScan(const char* target); + +static inline char* getExtension(const char* str) +{ + const char* p; + for (p = str+strlen(str); p >= str && *p != '.'; p--); + return (char*)p; +} + +static inline char* getSlash(const char* str) +{ + const char* p; + for (p = str+strlen(str); p >= str && *p != '/'; p--); + return (char*)p; +} + diff --git a/common/nacp.h b/common/nacp.h new file mode 100644 index 0000000..82ad865 --- /dev/null +++ b/common/nacp.h @@ -0,0 +1,41 @@ +#pragma once + +typedef struct { + char name[0x200]; + char author[0x100]; +} NacpLanguageEntry; + +typedef struct { + NacpLanguageEntry lang[12]; + NacpLanguageEntry lang_unk[4];//? + + u8 x3000_unk[0x24];////Normally all-zero? + u32 x3024_unk; + u32 x3028_unk; + u32 x302C_unk; + u32 x3030_unk; + u32 x3034_unk; + u64 titleid0; + + u8 x3040_unk[0x20]; + char version[0x10]; + + u64 titleid_dlcbase; + u64 titleid1; + + u32 x3080_unk; + u32 x3084_unk; + u32 x3088_unk; + u8 x308C_unk[0x24];//zeros? + + u64 titleid2; + u64 titleids[7];//"Array of application titleIDs, normally the same as the above app-titleIDs. Only set for game-updates?" + + u32 x30F0_unk; + u32 x30F4_unk; + + u64 titleid3;//"Application titleID. Only set for game-updates?" + + char bcat_passphrase[0x40]; + u8 x3140_unk[0xEC0];//Normally all-zero? +} NacpStruct; diff --git a/common/nanojpeg.c b/common/nanojpeg.c new file mode 100644 index 0000000..abfac49 --- /dev/null +++ b/common/nanojpeg.c @@ -0,0 +1,916 @@ +// NanoJPEG -- KeyJ's Tiny Baseline JPEG Decoder +// version 1.3.5 (2016-11-14) +// Copyright (c) 2009-2016 Martin J. Fiedler +// published under the terms of the MIT license +// +// 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. + + +/////////////////////////////////////////////////////////////////////////////// +// DOCUMENTATION SECTION // +// read this if you want to know what this is all about // +/////////////////////////////////////////////////////////////////////////////// + +// INTRODUCTION +// ============ +// +// This is a minimal decoder for baseline JPEG images. It accepts memory dumps +// of JPEG files as input and generates either 8-bit grayscale or packed 24-bit +// RGB images as output. It does not parse JFIF or Exif headers; all JPEG files +// are assumed to be either grayscale or YCbCr. CMYK or other color spaces are +// not supported. All YCbCr subsampling schemes with power-of-two ratios are +// supported, as are restart intervals. Progressive or lossless JPEG is not +// supported. +// Summed up, NanoJPEG should be able to decode all images from digital cameras +// and most common forms of other non-progressive JPEG images. +// The decoder is not optimized for speed, it's optimized for simplicity and +// small code. Image quality should be at a reasonable level. A bicubic chroma +// upsampling filter ensures that subsampled YCbCr images are rendered in +// decent quality. The decoder is not meant to deal with broken JPEG files in +// a graceful manner; if anything is wrong with the bitstream, decoding will +// simply fail. +// The code should work with every modern C compiler without problems and +// should not emit any warnings. It uses only (at least) 32-bit integer +// arithmetic and is supposed to be endianness independent and 64-bit clean. +// However, it is not thread-safe. + + +// COMPILE-TIME CONFIGURATION +// ========================== +// +// The following aspects of NanoJPEG can be controlled with preprocessor +// defines: +// +// _NJ_EXAMPLE_PROGRAM = Compile a main() function with an example +// program. +// _NJ_INCLUDE_HEADER_ONLY = Don't compile anything, just act as a header +// file for NanoJPEG. Example: +// #define _NJ_INCLUDE_HEADER_ONLY +// #include "nanojpeg.c" +// int main(void) { +// njInit(); +// // your code here +// njDone(); +// } +// NJ_USE_LIBC=1 = Use the malloc(), free(), memset() and memcpy() +// functions from the standard C library (default). +// NJ_USE_LIBC=0 = Don't use the standard C library. In this mode, +// external functions njAlloc(), njFreeMem(), +// njFillMem() and njCopyMem() need to be defined +// and implemented somewhere. +// NJ_USE_WIN32=0 = Normal mode (default). +// NJ_USE_WIN32=1 = If compiling with MSVC for Win32 and +// NJ_USE_LIBC=0, NanoJPEG will use its own +// implementations of the required C library +// functions (default if compiling with MSVC and +// NJ_USE_LIBC=0). +// NJ_CHROMA_FILTER=1 = Use the bicubic chroma upsampling filter +// (default). +// NJ_CHROMA_FILTER=0 = Use simple pixel repetition for chroma upsampling +// (bad quality, but faster and less code). + + +// API +// === +// +// For API documentation, read the "header section" below. + + +// EXAMPLE +// ======= +// +// A few pages below, you can find an example program that uses NanoJPEG to +// convert JPEG files into PGM or PPM. To compile it, use something like +// gcc -O3 -D_NJ_EXAMPLE_PROGRAM -o nanojpeg nanojpeg.c +// You may also add -std=c99 -Wall -Wextra -pedantic -Werror, if you want :) +// The only thing you might need is -Wno-shift-negative-value, because this +// code relies on the target machine using two's complement arithmetic, but +// the C standard does not, even though *any* practically useful machine +// nowadays uses two's complement. + + +/////////////////////////////////////////////////////////////////////////////// +// HEADER SECTION // +// copy and pase this into nanojpeg.h if you want // +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _NANOJPEG_H +#define _NANOJPEG_H + +// nj_result_t: Result codes for njDecode(). +typedef enum _nj_result { + NJ_OK = 0, // no error, decoding successful + NJ_NO_JPEG, // not a JPEG file + NJ_UNSUPPORTED, // unsupported format + NJ_OUT_OF_MEM, // out of memory + NJ_INTERNAL_ERR, // internal error + NJ_SYNTAX_ERROR, // syntax error + __NJ_FINISHED, // used internally, will never be reported +} nj_result_t; + +// njInit: Initialize NanoJPEG. +// For safety reasons, this should be called at least one time before using +// using any of the other NanoJPEG functions. +void njInit(void); + +// njDecode: Decode a JPEG image. +// Decodes a memory dump of a JPEG file into internal buffers. +// Parameters: +// jpeg = The pointer to the memory dump. +// size = The size of the JPEG file. +// Return value: The error code in case of failure, or NJ_OK (zero) on success. +nj_result_t njDecode(const void* jpeg, const int size); + +// njGetWidth: Return the width (in pixels) of the most recently decoded +// image. If njDecode() failed, the result of njGetWidth() is undefined. +int njGetWidth(void); + +// njGetHeight: Return the height (in pixels) of the most recently decoded +// image. If njDecode() failed, the result of njGetHeight() is undefined. +int njGetHeight(void); + +// njIsColor: Return 1 if the most recently decoded image is a color image +// (RGB) or 0 if it is a grayscale image. If njDecode() failed, the result +// of njGetWidth() is undefined. +int njIsColor(void); + +// njGetImage: Returns the decoded image data. +// Returns a pointer to the most recently image. The memory layout it byte- +// oriented, top-down, without any padding between lines. Pixels of color +// images will be stored as three consecutive bytes for the red, green and +// blue channels. This data format is thus compatible with the PGM or PPM +// file formats and the OpenGL texture formats GL_LUMINANCE8 or GL_RGB8. +// If njDecode() failed, the result of njGetImage() is undefined. +unsigned char* njGetImage(void); + +// njGetImageSize: Returns the size (in bytes) of the image data returned +// by njGetImage(). If njDecode() failed, the result of njGetImageSize() is +// undefined. +int njGetImageSize(void); + +// njDone: Uninitialize NanoJPEG. +// Resets NanoJPEG's internal state and frees all memory that has been +// allocated at run-time by NanoJPEG. It is still possible to decode another +// image after a njDone() call. +void njDone(void); + +#endif//_NANOJPEG_H + + +/////////////////////////////////////////////////////////////////////////////// +// CONFIGURATION SECTION // +// adjust the default settings for the NJ_ defines here // +/////////////////////////////////////////////////////////////////////////////// + +#ifndef NJ_USE_LIBC + #define NJ_USE_LIBC 1 +#endif + +#ifndef NJ_USE_WIN32 + #ifdef _MSC_VER + #define NJ_USE_WIN32 (!NJ_USE_LIBC) + #else + #define NJ_USE_WIN32 0 + #endif +#endif + +#ifndef NJ_CHROMA_FILTER + #define NJ_CHROMA_FILTER 1 +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// EXAMPLE PROGRAM // +// just define _NJ_EXAMPLE_PROGRAM to compile this (requires NJ_USE_LIBC) // +/////////////////////////////////////////////////////////////////////////////// + +#ifdef _NJ_EXAMPLE_PROGRAM + +#include +#include +#include + +int main(int argc, char* argv[]) { + int size; + char *buf; + FILE *f; + + if (argc < 2) { + printf("Usage: %s []\n", argv[0]); + return 2; + } + f = fopen(argv[1], "rb"); + if (!f) { + printf("Error opening the input file.\n"); + return 1; + } + fseek(f, 0, SEEK_END); + size = (int) ftell(f); + buf = (char*) malloc(size); + fseek(f, 0, SEEK_SET); + size = (int) fread(buf, 1, size, f); + fclose(f); + + njInit(); + if (njDecode(buf, size)) { + free((void*)buf); + printf("Error decoding the input file.\n"); + return 1; + } + free((void*)buf); + + f = fopen((argc > 2) ? argv[2] : (njIsColor() ? "nanojpeg_out.ppm" : "nanojpeg_out.pgm"), "wb"); + if (!f) { + printf("Error opening the output file.\n"); + return 1; + } + fprintf(f, "P%d\n%d %d\n255\n", njIsColor() ? 6 : 5, njGetWidth(), njGetHeight()); + fwrite(njGetImage(), 1, njGetImageSize(), f); + fclose(f); + njDone(); + return 0; +} + +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// IMPLEMENTATION SECTION // +// you may stop reading here // +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _NJ_INCLUDE_HEADER_ONLY + +#ifdef _MSC_VER + #define NJ_INLINE static __inline + #define NJ_FORCE_INLINE static __forceinline +#else + #define NJ_INLINE static inline + #define NJ_FORCE_INLINE static inline +#endif + +#if NJ_USE_LIBC + #include + #include + #define njAllocMem malloc + #define njFreeMem free + #define njFillMem memset + #define njCopyMem memcpy +#elif NJ_USE_WIN32 + #include + #define njAllocMem(size) ((void*) LocalAlloc(LMEM_FIXED, (SIZE_T)(size))) + #define njFreeMem(block) ((void) LocalFree((HLOCAL) block)) + NJ_INLINE void njFillMem(void* block, unsigned char value, int count) { __asm { + mov edi, block + mov al, value + mov ecx, count + rep stosb + } } + NJ_INLINE void njCopyMem(void* dest, const void* src, int count) { __asm { + mov edi, dest + mov esi, src + mov ecx, count + rep movsb + } } +#else + extern void* njAllocMem(int size); + extern void njFreeMem(void* block); + extern void njFillMem(void* block, unsigned char byte, int size); + extern void njCopyMem(void* dest, const void* src, int size); +#endif + +typedef struct _nj_code { + unsigned char bits, code; +} nj_vlc_code_t; + +typedef struct _nj_cmp { + int cid; + int ssx, ssy; + int width, height; + int stride; + int qtsel; + int actabsel, dctabsel; + int dcpred; + unsigned char *pixels; +} nj_component_t; + +typedef struct _nj_ctx { + nj_result_t error; + const unsigned char *pos; + int size; + int length; + int width, height; + int mbwidth, mbheight; + int mbsizex, mbsizey; + int ncomp; + nj_component_t comp[3]; + int qtused, qtavail; + unsigned char qtab[4][64]; + nj_vlc_code_t vlctab[4][65536]; + int buf, bufbits; + int block[64]; + int rstinterval; + unsigned char *rgb; +} nj_context_t; + +static nj_context_t nj; + +static const char njZZ[64] = { 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 }; + +NJ_FORCE_INLINE unsigned char njClip(const int x) { + return (x < 0) ? 0 : ((x > 0xFF) ? 0xFF : (unsigned char) x); +} + +#define W1 2841 +#define W2 2676 +#define W3 2408 +#define W5 1609 +#define W6 1108 +#define W7 565 + +NJ_INLINE void njRowIDCT(int* blk) { + int x0, x1, x2, x3, x4, x5, x6, x7, x8; + if (!((x1 = blk[4] << 11) + | (x2 = blk[6]) + | (x3 = blk[2]) + | (x4 = blk[1]) + | (x5 = blk[7]) + | (x6 = blk[5]) + | (x7 = blk[3]))) + { + blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] = blk[0] << 3; + return; + } + x0 = (blk[0] << 11) + 128; + x8 = W7 * (x4 + x5); + x4 = x8 + (W1 - W7) * x4; + x5 = x8 - (W1 + W7) * x5; + x8 = W3 * (x6 + x7); + x6 = x8 - (W3 - W5) * x6; + x7 = x8 - (W3 + W5) * x7; + x8 = x0 + x1; + x0 -= x1; + x1 = W6 * (x3 + x2); + x2 = x1 - (W2 + W6) * x2; + x3 = x1 + (W2 - W6) * x3; + x1 = x4 + x6; + x4 -= x6; + x6 = x5 + x7; + x5 -= x7; + x7 = x8 + x3; + x8 -= x3; + x3 = x0 + x2; + x0 -= x2; + x2 = (181 * (x4 + x5) + 128) >> 8; + x4 = (181 * (x4 - x5) + 128) >> 8; + blk[0] = (x7 + x1) >> 8; + blk[1] = (x3 + x2) >> 8; + blk[2] = (x0 + x4) >> 8; + blk[3] = (x8 + x6) >> 8; + blk[4] = (x8 - x6) >> 8; + blk[5] = (x0 - x4) >> 8; + blk[6] = (x3 - x2) >> 8; + blk[7] = (x7 - x1) >> 8; +} + +NJ_INLINE void njColIDCT(const int* blk, unsigned char *out, int stride) { + int x0, x1, x2, x3, x4, x5, x6, x7, x8; + if (!((x1 = blk[8*4] << 8) + | (x2 = blk[8*6]) + | (x3 = blk[8*2]) + | (x4 = blk[8*1]) + | (x5 = blk[8*7]) + | (x6 = blk[8*5]) + | (x7 = blk[8*3]))) + { + x1 = njClip(((blk[0] + 32) >> 6) + 128); + for (x0 = 8; x0; --x0) { + *out = (unsigned char) x1; + out += stride; + } + return; + } + x0 = (blk[0] << 8) + 8192; + x8 = W7 * (x4 + x5) + 4; + x4 = (x8 + (W1 - W7) * x4) >> 3; + x5 = (x8 - (W1 + W7) * x5) >> 3; + x8 = W3 * (x6 + x7) + 4; + x6 = (x8 - (W3 - W5) * x6) >> 3; + x7 = (x8 - (W3 + W5) * x7) >> 3; + x8 = x0 + x1; + x0 -= x1; + x1 = W6 * (x3 + x2) + 4; + x2 = (x1 - (W2 + W6) * x2) >> 3; + x3 = (x1 + (W2 - W6) * x3) >> 3; + x1 = x4 + x6; + x4 -= x6; + x6 = x5 + x7; + x5 -= x7; + x7 = x8 + x3; + x8 -= x3; + x3 = x0 + x2; + x0 -= x2; + x2 = (181 * (x4 + x5) + 128) >> 8; + x4 = (181 * (x4 - x5) + 128) >> 8; + *out = njClip(((x7 + x1) >> 14) + 128); out += stride; + *out = njClip(((x3 + x2) >> 14) + 128); out += stride; + *out = njClip(((x0 + x4) >> 14) + 128); out += stride; + *out = njClip(((x8 + x6) >> 14) + 128); out += stride; + *out = njClip(((x8 - x6) >> 14) + 128); out += stride; + *out = njClip(((x0 - x4) >> 14) + 128); out += stride; + *out = njClip(((x3 - x2) >> 14) + 128); out += stride; + *out = njClip(((x7 - x1) >> 14) + 128); +} + +#define njThrow(e) do { nj.error = e; return; } while (0) +#define njCheckError() do { if (nj.error) return; } while (0) + +static int njShowBits(int bits) { + unsigned char newbyte; + if (!bits) return 0; + while (nj.bufbits < bits) { + if (nj.size <= 0) { + nj.buf = (nj.buf << 8) | 0xFF; + nj.bufbits += 8; + continue; + } + newbyte = *nj.pos++; + nj.size--; + nj.bufbits += 8; + nj.buf = (nj.buf << 8) | newbyte; + if (newbyte == 0xFF) { + if (nj.size) { + unsigned char marker = *nj.pos++; + nj.size--; + switch (marker) { + case 0x00: + case 0xFF: + break; + case 0xD9: nj.size = 0; break; + default: + if ((marker & 0xF8) != 0xD0) + nj.error = NJ_SYNTAX_ERROR; + else { + nj.buf = (nj.buf << 8) | marker; + nj.bufbits += 8; + } + } + } else + nj.error = NJ_SYNTAX_ERROR; + } + } + return (nj.buf >> (nj.bufbits - bits)) & ((1 << bits) - 1); +} + +NJ_INLINE void njSkipBits(int bits) { + if (nj.bufbits < bits) + (void) njShowBits(bits); + nj.bufbits -= bits; +} + +NJ_INLINE int njGetBits(int bits) { + int res = njShowBits(bits); + njSkipBits(bits); + return res; +} + +NJ_INLINE void njByteAlign(void) { + nj.bufbits &= 0xF8; +} + +static void njSkip(int count) { + nj.pos += count; + nj.size -= count; + nj.length -= count; + if (nj.size < 0) nj.error = NJ_SYNTAX_ERROR; +} + +NJ_INLINE unsigned short njDecode16(const unsigned char *pos) { + return (pos[0] << 8) | pos[1]; +} + +static void njDecodeLength(void) { + if (nj.size < 2) njThrow(NJ_SYNTAX_ERROR); + nj.length = njDecode16(nj.pos); + if (nj.length > nj.size) njThrow(NJ_SYNTAX_ERROR); + njSkip(2); +} + +NJ_INLINE void njSkipMarker(void) { + njDecodeLength(); + njSkip(nj.length); +} + +NJ_INLINE void njDecodeSOF(void) { + int i, ssxmax = 0, ssymax = 0; + nj_component_t* c; + njDecodeLength(); + njCheckError(); + if (nj.length < 9) njThrow(NJ_SYNTAX_ERROR); + if (nj.pos[0] != 8) njThrow(NJ_UNSUPPORTED); + nj.height = njDecode16(nj.pos+1); + nj.width = njDecode16(nj.pos+3); + if (!nj.width || !nj.height) njThrow(NJ_SYNTAX_ERROR); + nj.ncomp = nj.pos[5]; + njSkip(6); + switch (nj.ncomp) { + case 1: + case 3: + break; + default: + njThrow(NJ_UNSUPPORTED); + } + if (nj.length < (nj.ncomp * 3)) njThrow(NJ_SYNTAX_ERROR); + for (i = 0, c = nj.comp; i < nj.ncomp; ++i, ++c) { + c->cid = nj.pos[0]; + if (!(c->ssx = nj.pos[1] >> 4)) njThrow(NJ_SYNTAX_ERROR); + if (c->ssx & (c->ssx - 1)) njThrow(NJ_UNSUPPORTED); // non-power of two + if (!(c->ssy = nj.pos[1] & 15)) njThrow(NJ_SYNTAX_ERROR); + if (c->ssy & (c->ssy - 1)) njThrow(NJ_UNSUPPORTED); // non-power of two + if ((c->qtsel = nj.pos[2]) & 0xFC) njThrow(NJ_SYNTAX_ERROR); + njSkip(3); + nj.qtused |= 1 << c->qtsel; + if (c->ssx > ssxmax) ssxmax = c->ssx; + if (c->ssy > ssymax) ssymax = c->ssy; + } + if (nj.ncomp == 1) { + c = nj.comp; + c->ssx = c->ssy = ssxmax = ssymax = 1; + } + nj.mbsizex = ssxmax << 3; + nj.mbsizey = ssymax << 3; + nj.mbwidth = (nj.width + nj.mbsizex - 1) / nj.mbsizex; + nj.mbheight = (nj.height + nj.mbsizey - 1) / nj.mbsizey; + for (i = 0, c = nj.comp; i < nj.ncomp; ++i, ++c) { + c->width = (nj.width * c->ssx + ssxmax - 1) / ssxmax; + c->height = (nj.height * c->ssy + ssymax - 1) / ssymax; + c->stride = nj.mbwidth * c->ssx << 3; + if (((c->width < 3) && (c->ssx != ssxmax)) || ((c->height < 3) && (c->ssy != ssymax))) njThrow(NJ_UNSUPPORTED); + if (!(c->pixels = (unsigned char*) njAllocMem(c->stride * nj.mbheight * c->ssy << 3))) njThrow(NJ_OUT_OF_MEM); + } + if (nj.ncomp == 3) { + nj.rgb = (unsigned char*) njAllocMem(nj.width * nj.height * nj.ncomp); + if (!nj.rgb) njThrow(NJ_OUT_OF_MEM); + } + njSkip(nj.length); +} + +NJ_INLINE void njDecodeDHT(void) { + int codelen, currcnt, remain, spread, i, j; + nj_vlc_code_t *vlc; + static unsigned char counts[16]; + njDecodeLength(); + njCheckError(); + while (nj.length >= 17) { + i = nj.pos[0]; + if (i & 0xEC) njThrow(NJ_SYNTAX_ERROR); + if (i & 0x02) njThrow(NJ_UNSUPPORTED); + i = (i | (i >> 3)) & 3; // combined DC/AC + tableid value + for (codelen = 1; codelen <= 16; ++codelen) + counts[codelen - 1] = nj.pos[codelen]; + njSkip(17); + vlc = &nj.vlctab[i][0]; + remain = spread = 65536; + for (codelen = 1; codelen <= 16; ++codelen) { + spread >>= 1; + currcnt = counts[codelen - 1]; + if (!currcnt) continue; + if (nj.length < currcnt) njThrow(NJ_SYNTAX_ERROR); + remain -= currcnt << (16 - codelen); + if (remain < 0) njThrow(NJ_SYNTAX_ERROR); + for (i = 0; i < currcnt; ++i) { + register unsigned char code = nj.pos[i]; + for (j = spread; j; --j) { + vlc->bits = (unsigned char) codelen; + vlc->code = code; + ++vlc; + } + } + njSkip(currcnt); + } + while (remain--) { + vlc->bits = 0; + ++vlc; + } + } + if (nj.length) njThrow(NJ_SYNTAX_ERROR); +} + +NJ_INLINE void njDecodeDQT(void) { + int i; + unsigned char *t; + njDecodeLength(); + njCheckError(); + while (nj.length >= 65) { + i = nj.pos[0]; + if (i & 0xFC) njThrow(NJ_SYNTAX_ERROR); + nj.qtavail |= 1 << i; + t = &nj.qtab[i][0]; + for (i = 0; i < 64; ++i) + t[i] = nj.pos[i + 1]; + njSkip(65); + } + if (nj.length) njThrow(NJ_SYNTAX_ERROR); +} + +NJ_INLINE void njDecodeDRI(void) { + njDecodeLength(); + njCheckError(); + if (nj.length < 2) njThrow(NJ_SYNTAX_ERROR); + nj.rstinterval = njDecode16(nj.pos); + njSkip(nj.length); +} + +static int njGetVLC(nj_vlc_code_t* vlc, unsigned char* code) { + int value = njShowBits(16); + int bits = vlc[value].bits; + if (!bits) { nj.error = NJ_SYNTAX_ERROR; return 0; } + njSkipBits(bits); + value = vlc[value].code; + if (code) *code = (unsigned char) value; + bits = value & 15; + if (!bits) return 0; + value = njGetBits(bits); + if (value < (1 << (bits - 1))) + value += ((-1) << bits) + 1; + return value; +} + +NJ_INLINE void njDecodeBlock(nj_component_t* c, unsigned char* out) { + unsigned char code = 0; + int value, coef = 0; + njFillMem(nj.block, 0, sizeof(nj.block)); + c->dcpred += njGetVLC(&nj.vlctab[c->dctabsel][0], NULL); + nj.block[0] = (c->dcpred) * nj.qtab[c->qtsel][0]; + do { + value = njGetVLC(&nj.vlctab[c->actabsel][0], &code); + if (!code) break; // EOB + if (!(code & 0x0F) && (code != 0xF0)) njThrow(NJ_SYNTAX_ERROR); + coef += (code >> 4) + 1; + if (coef > 63) njThrow(NJ_SYNTAX_ERROR); + nj.block[(int) njZZ[coef]] = value * nj.qtab[c->qtsel][coef]; + } while (coef < 63); + for (coef = 0; coef < 64; coef += 8) + njRowIDCT(&nj.block[coef]); + for (coef = 0; coef < 8; ++coef) + njColIDCT(&nj.block[coef], &out[coef], c->stride); +} + +NJ_INLINE void njDecodeScan(void) { + int i, mbx, mby, sbx, sby; + int rstcount = nj.rstinterval, nextrst = 0; + nj_component_t* c; + njDecodeLength(); + njCheckError(); + if (nj.length < (4 + 2 * nj.ncomp)) njThrow(NJ_SYNTAX_ERROR); + if (nj.pos[0] != nj.ncomp) njThrow(NJ_UNSUPPORTED); + njSkip(1); + for (i = 0, c = nj.comp; i < nj.ncomp; ++i, ++c) { + if (nj.pos[0] != c->cid) njThrow(NJ_SYNTAX_ERROR); + if (nj.pos[1] & 0xEE) njThrow(NJ_SYNTAX_ERROR); + c->dctabsel = nj.pos[1] >> 4; + c->actabsel = (nj.pos[1] & 1) | 2; + njSkip(2); + } + if (nj.pos[0] || (nj.pos[1] != 63) || nj.pos[2]) njThrow(NJ_UNSUPPORTED); + njSkip(nj.length); + for (mbx = mby = 0;;) { + for (i = 0, c = nj.comp; i < nj.ncomp; ++i, ++c) + for (sby = 0; sby < c->ssy; ++sby) + for (sbx = 0; sbx < c->ssx; ++sbx) { + njDecodeBlock(c, &c->pixels[((mby * c->ssy + sby) * c->stride + mbx * c->ssx + sbx) << 3]); + njCheckError(); + } + if (++mbx >= nj.mbwidth) { + mbx = 0; + if (++mby >= nj.mbheight) break; + } + if (nj.rstinterval && !(--rstcount)) { + njByteAlign(); + i = njGetBits(16); + if (((i & 0xFFF8) != 0xFFD0) || ((i & 7) != nextrst)) njThrow(NJ_SYNTAX_ERROR); + nextrst = (nextrst + 1) & 7; + rstcount = nj.rstinterval; + for (i = 0; i < 3; ++i) + nj.comp[i].dcpred = 0; + } + } + nj.error = __NJ_FINISHED; +} + +#if NJ_CHROMA_FILTER + +#define CF4A (-9) +#define CF4B (111) +#define CF4C (29) +#define CF4D (-3) +#define CF3A (28) +#define CF3B (109) +#define CF3C (-9) +#define CF3X (104) +#define CF3Y (27) +#define CF3Z (-3) +#define CF2A (139) +#define CF2B (-11) +#define CF(x) njClip(((x) + 64) >> 7) + +NJ_INLINE void njUpsampleH(nj_component_t* c) { + const int xmax = c->width - 3; + unsigned char *out, *lin, *lout; + int x, y; + out = (unsigned char*) njAllocMem((c->width * c->height) << 1); + if (!out) njThrow(NJ_OUT_OF_MEM); + lin = c->pixels; + lout = out; + for (y = c->height; y; --y) { + lout[0] = CF(CF2A * lin[0] + CF2B * lin[1]); + lout[1] = CF(CF3X * lin[0] + CF3Y * lin[1] + CF3Z * lin[2]); + lout[2] = CF(CF3A * lin[0] + CF3B * lin[1] + CF3C * lin[2]); + for (x = 0; x < xmax; ++x) { + lout[(x << 1) + 3] = CF(CF4A * lin[x] + CF4B * lin[x + 1] + CF4C * lin[x + 2] + CF4D * lin[x + 3]); + lout[(x << 1) + 4] = CF(CF4D * lin[x] + CF4C * lin[x + 1] + CF4B * lin[x + 2] + CF4A * lin[x + 3]); + } + lin += c->stride; + lout += c->width << 1; + lout[-3] = CF(CF3A * lin[-1] + CF3B * lin[-2] + CF3C * lin[-3]); + lout[-2] = CF(CF3X * lin[-1] + CF3Y * lin[-2] + CF3Z * lin[-3]); + lout[-1] = CF(CF2A * lin[-1] + CF2B * lin[-2]); + } + c->width <<= 1; + c->stride = c->width; + njFreeMem((void*)c->pixels); + c->pixels = out; +} + +NJ_INLINE void njUpsampleV(nj_component_t* c) { + const int w = c->width, s1 = c->stride, s2 = s1 + s1; + unsigned char *out, *cin, *cout; + int x, y; + out = (unsigned char*) njAllocMem((c->width * c->height) << 1); + if (!out) njThrow(NJ_OUT_OF_MEM); + for (x = 0; x < w; ++x) { + cin = &c->pixels[x]; + cout = &out[x]; + *cout = CF(CF2A * cin[0] + CF2B * cin[s1]); cout += w; + *cout = CF(CF3X * cin[0] + CF3Y * cin[s1] + CF3Z * cin[s2]); cout += w; + *cout = CF(CF3A * cin[0] + CF3B * cin[s1] + CF3C * cin[s2]); cout += w; + cin += s1; + for (y = c->height - 3; y; --y) { + *cout = CF(CF4A * cin[-s1] + CF4B * cin[0] + CF4C * cin[s1] + CF4D * cin[s2]); cout += w; + *cout = CF(CF4D * cin[-s1] + CF4C * cin[0] + CF4B * cin[s1] + CF4A * cin[s2]); cout += w; + cin += s1; + } + cin += s1; + *cout = CF(CF3A * cin[0] + CF3B * cin[-s1] + CF3C * cin[-s2]); cout += w; + *cout = CF(CF3X * cin[0] + CF3Y * cin[-s1] + CF3Z * cin[-s2]); cout += w; + *cout = CF(CF2A * cin[0] + CF2B * cin[-s1]); + } + c->height <<= 1; + c->stride = c->width; + njFreeMem((void*) c->pixels); + c->pixels = out; +} + +#else + +NJ_INLINE void njUpsample(nj_component_t* c) { + int x, y, xshift = 0, yshift = 0; + unsigned char *out, *lin, *lout; + while (c->width < nj.width) { c->width <<= 1; ++xshift; } + while (c->height < nj.height) { c->height <<= 1; ++yshift; } + out = (unsigned char*) njAllocMem(c->width * c->height); + if (!out) njThrow(NJ_OUT_OF_MEM); + lin = c->pixels; + lout = out; + for (y = 0; y < c->height; ++y) { + lin = &c->pixels[(y >> yshift) * c->stride]; + for (x = 0; x < c->width; ++x) + lout[x] = lin[x >> xshift]; + lout += c->width; + } + c->stride = c->width; + njFreeMem((void*) c->pixels); + c->pixels = out; +} + +#endif + +NJ_INLINE void njConvert(void) { + int i; + nj_component_t* c; + for (i = 0, c = nj.comp; i < nj.ncomp; ++i, ++c) { + #if NJ_CHROMA_FILTER + while ((c->width < nj.width) || (c->height < nj.height)) { + if (c->width < nj.width) njUpsampleH(c); + njCheckError(); + if (c->height < nj.height) njUpsampleV(c); + njCheckError(); + } + #else + if ((c->width < nj.width) || (c->height < nj.height)) + njUpsample(c); + #endif + if ((c->width < nj.width) || (c->height < nj.height)) njThrow(NJ_INTERNAL_ERR); + } + if (nj.ncomp == 3) { + // convert to RGB + int x, yy; + unsigned char *prgb = nj.rgb; + const unsigned char *py = nj.comp[0].pixels; + const unsigned char *pcb = nj.comp[1].pixels; + const unsigned char *pcr = nj.comp[2].pixels; + for (yy = nj.height; yy; --yy) { + for (x = 0; x < nj.width; ++x) { + register int y = py[x] << 8; + register int cb = pcb[x] - 128; + register int cr = pcr[x] - 128; + *prgb++ = njClip((y + 359 * cr + 128) >> 8); + *prgb++ = njClip((y - 88 * cb - 183 * cr + 128) >> 8); + *prgb++ = njClip((y + 454 * cb + 128) >> 8); + } + py += nj.comp[0].stride; + pcb += nj.comp[1].stride; + pcr += nj.comp[2].stride; + } + } else if (nj.comp[0].width != nj.comp[0].stride) { + // grayscale -> only remove stride + unsigned char *pin = &nj.comp[0].pixels[nj.comp[0].stride]; + unsigned char *pout = &nj.comp[0].pixels[nj.comp[0].width]; + int y; + for (y = nj.comp[0].height - 1; y; --y) { + njCopyMem(pout, pin, nj.comp[0].width); + pin += nj.comp[0].stride; + pout += nj.comp[0].width; + } + nj.comp[0].stride = nj.comp[0].width; + } +} + +void njInit(void) { + njFillMem(&nj, 0, sizeof(nj_context_t)); +} + +void njDone(void) { + int i; + for (i = 0; i < 3; ++i) + if (nj.comp[i].pixels) njFreeMem((void*) nj.comp[i].pixels); + if (nj.rgb) njFreeMem((void*) nj.rgb); + njInit(); +} + +nj_result_t njDecode(const void* jpeg, const int size) { + njDone(); + nj.pos = (const unsigned char*) jpeg; + nj.size = size & 0x7FFFFFFF; + if (nj.size < 2) return NJ_NO_JPEG; + if ((nj.pos[0] ^ 0xFF) | (nj.pos[1] ^ 0xD8)) return NJ_NO_JPEG; + njSkip(2); + while (!nj.error) { + if ((nj.size < 2) || (nj.pos[0] != 0xFF)) return NJ_SYNTAX_ERROR; + njSkip(2); + switch (nj.pos[-1]) { + case 0xC0: njDecodeSOF(); break; + case 0xC4: njDecodeDHT(); break; + case 0xDB: njDecodeDQT(); break; + case 0xDD: njDecodeDRI(); break; + case 0xDA: njDecodeScan(); break; + case 0xFE: njSkipMarker(); break; + default: + if ((nj.pos[-1] & 0xF0) == 0xE0) + njSkipMarker(); + else + return NJ_UNSUPPORTED; + } + } + if (nj.error != __NJ_FINISHED) return nj.error; + nj.error = NJ_OK; + njConvert(); + return nj.error; +} + +int njGetWidth(void) { return nj.width; } +int njGetHeight(void) { return nj.height; } +int njIsColor(void) { return (nj.ncomp != 1); } +unsigned char* njGetImage(void) { return (nj.ncomp == 1) ? nj.comp[0].pixels : nj.rgb; } +int njGetImageSize(void) { return nj.width * nj.height * nj.ncomp; } + +#endif // _NJ_INCLUDE_HEADER_ONLY diff --git a/common/nanojpeg.h b/common/nanojpeg.h new file mode 100644 index 0000000..64ea7c2 --- /dev/null +++ b/common/nanojpeg.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////// +// HEADER SECTION // +// copy and pase this into nanojpeg.h if you want // +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _NANOJPEG_H +#define _NANOJPEG_H + +// nj_result_t: Result codes for njDecode(). +typedef enum _nj_result { + NJ_OK = 0, // no error, decoding successful + NJ_NO_JPEG, // not a JPEG file + NJ_UNSUPPORTED, // unsupported format + NJ_OUT_OF_MEM, // out of memory + NJ_INTERNAL_ERR, // internal error + NJ_SYNTAX_ERROR, // syntax error + __NJ_FINISHED, // used internally, will never be reported +} nj_result_t; + +// njInit: Initialize NanoJPEG. +// For safety reasons, this should be called at least one time before using +// using any of the other NanoJPEG functions. +void njInit(void); + +// njDecode: Decode a JPEG image. +// Decodes a memory dump of a JPEG file into internal buffers. +// Parameters: +// jpeg = The pointer to the memory dump. +// size = The size of the JPEG file. +// Return value: The error code in case of failure, or NJ_OK (zero) on success. +nj_result_t njDecode(const void* jpeg, const int size); + +// njGetWidth: Return the width (in pixels) of the most recently decoded +// image. If njDecode() failed, the result of njGetWidth() is undefined. +int njGetWidth(void); + +// njGetHeight: Return the height (in pixels) of the most recently decoded +// image. If njDecode() failed, the result of njGetHeight() is undefined. +int njGetHeight(void); + +// njIsColor: Return 1 if the most recently decoded image is a color image +// (RGB) or 0 if it is a grayscale image. If njDecode() failed, the result +// of njGetWidth() is undefined. +int njIsColor(void); + +// njGetImage: Returns the decoded image data. +// Returns a pointer to the most recently image. The memory layout it byte- +// oriented, top-down, without any padding between lines. Pixels of color +// images will be stored as three consecutive bytes for the red, green and +// blue channels. This data format is thus compatible with the PGM or PPM +// file formats and the OpenGL texture formats GL_LUMINANCE8 or GL_RGB8. +// If njDecode() failed, the result of njGetImage() is undefined. +unsigned char* njGetImage(void); + +// njGetImageSize: Returns the size (in bytes) of the image data returned +// by njGetImage(). If njDecode() failed, the result of njGetImageSize() is +// undefined. +int njGetImageSize(void); + +// njDone: Uninitialize NanoJPEG. +// Resets NanoJPEG's internal state and frees all memory that has been +// allocated at run-time by NanoJPEG. It is still possible to decode another +// image after a njDone() call. +void njDone(void); + +#endif//_NANOJPEG_H diff --git a/common/nro.h b/common/nro.h new file mode 100644 index 0000000..6ad2cd7 --- /dev/null +++ b/common/nro.h @@ -0,0 +1,43 @@ +#pragma once + +#define NROHEADER_MAGICNUM 0x304f524e + +#define ASSETHEADER_MAGICNUM 0x54455341 +#define ASSETHEADER_VERSION 0 + +typedef struct { + u32 FileOff; + u32 Size; +} NsoSegment; + +typedef struct { + u32 unused; + u32 modOffset; + u8 Padding[8]; +} NroStart; + +typedef struct { + u32 Magic; + u32 Unk1; + u32 size; + u32 Unk2; + NsoSegment Segments[3]; + u32 bssSize; + u32 Unk3; + u8 BuildId[0x20]; + u8 Padding[0x20]; +} NroHeader; + +typedef struct { + u64 offset; + u64 size; +} AssetSection; + +typedef struct { + u32 magic; + u32 version; + AssetSection icon; + AssetSection nacp; + AssetSection romfs; +} AssetHeader; + diff --git a/common/text.c b/common/text.c new file mode 100644 index 0000000..6fa4b51 --- /dev/null +++ b/common/text.c @@ -0,0 +1,15 @@ +#include "text.h" + +//TODO: Update this once libnx supports settings get-language. + +static int s_textLang = /*CFG_LANGUAGE_EN*/1; + +int textGetLang(void) { + return s_textLang; +} + +const char* textGetString(StrId id) { + const char* str = g_strings[id][s_textLang]; + if (!str) str = g_strings[id][/*CFG_LANGUAGE_EN*/1]; + return str; +} diff --git a/common/text.h b/common/text.h new file mode 100644 index 0000000..6258e35 --- /dev/null +++ b/common/text.h @@ -0,0 +1,6 @@ +#pragma once +#include "common.h" +#include "language.h" + +int textGetLang(void); +const char* textGetString(StrId id); diff --git a/common/ui.c b/common/ui.c new file mode 100644 index 0000000..244c838 --- /dev/null +++ b/common/ui.c @@ -0,0 +1,18 @@ +#include "common.h" + +static bool s_shouldExit; + +void uiExitLoop(void) { + s_shouldExit = true; +} + +bool menuUpdate(void); + +bool uiUpdate(void) { + bool exitflag=0; + + exitflag = !menuUpdate(); + if (!exitflag) return exitflag; + + return !s_shouldExit; +} diff --git a/common/ui.h b/common/ui.h new file mode 100644 index 0000000..21df0d8 --- /dev/null +++ b/common/ui.h @@ -0,0 +1,6 @@ +#pragma once +#include "common.h" + +void uiExitLoop(void); + +bool uiUpdate(void); diff --git a/data/folder_icon.bin b/data/folder_icon.bin new file mode 100644 index 0000000..0ef96de --- /dev/null +++ b/data/folder_icon.bin @@ -0,0 +1 @@ +šׯثͤɦɪġ۝ƖƤרƠ·¤ӦƽͤڜѤۨͣןƻ̧իƻʨآʨӫ̥ȚͣŢͣśͥǝ̥Ȟ̥ȣͦǠͥʤˣǖͥƛ³ˤ̌żŞxzz{{xvxxzz{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{z{zzxvvtttvyz}}|{yxywɅŧäŞƛƛĠä§§äĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĤĢġàâäŝқƝĞ᥻ĞҙĞŠŠ¨ŠħĠâĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĠàĞĠŝĢŝĠĞĞĠĞäääåĢåĢåǥţƦţ£ݡə™Ϟˣʠ߫ſřƖŗŗŕĔŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŕŘÖ×ŗƚ› \ No newline at end of file diff --git a/data/switchicon_questionmark.bin b/data/switchicon_questionmark.bin new file mode 100644 index 0000000..6aba456 --- /dev/null +++ b/data/switchicon_questionmark.bin @@ -0,0 +1 @@ +ſϡbbbXXXMMMHHHHHHIIIIIIHHHIIIIIIIIIIIIIIIIIIIIIIIIGGG\\\BBB?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????;;;CCCAAAhhh@@@@@@@@@@@@@@@@@@@@@@@@===???BBBDDDDDDHHHUUUbbb֍OOODDD@@@BBBAAA@@@AAAAAA@@@??????????????????????????????DDD___===@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@@@>>>>>>XXX@@@@@@@@@@@@@@@@@@@@@@@@CCC???===???@@@AAAAAABBB???===IIIyyy쿿lll???BBBCCC???@@@@@@@@@@@@@@@???>>>@@@BBBAAAAAAAAAAAAAAAAAAAAAAAA@@@]]]FFF???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>BBBAAA===ZZZ@@@@@@@@@@@@@@@@@@@@@@@@>>>???AAABBBCCCAAA???>>>DDD>>>>>>@@@AAA]]]~~~CCC@@@AAA>>>@@@>>>AAA??????@@@BBBBBBAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CCC\\\>>>@@@@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@@@@@@AAA???ZZZ@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA@@@>>>>>>???@@@@@@>>>AAA>>>@@@CCC<<>>@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CCC񏏏BBBBBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAABBB===BBBAAAAAADDD<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDD>>>>>>AAACCC:::EEE>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CCClllEEE===>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>AAACCC>>>@@@BBB===AAA????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@BBB@@@??????@@@DDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>>>>fff采???@@@DDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???BBB;;;AAAAAA???@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<<>>eeeBBB???CCC@@@<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??????@@@EEEAAA<<>>AAAqqqCCC@@@???>>>CCCCCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAABBB???>>>>>>BBB===DDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA===???<<>>AAA@@@<<>>??????>>>CCC@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA:::GGG<<<@@@>>>DDDAAA???CCC<<>>CCC???>>>FFF???@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@AAA@@@BBB===DDD???@@@@@@@@@AAA@@@===BBB???>>>CCC@@@@@@@@@@@@@@@@@@@@@@@@CCCAAA???@@@AAA@@@@@@@@@@@@>>>CCC???===BBB???@@@???>>>AAA===BBB@@@>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@>>>AAA>>>AAA<<>>@@@@@@@@@@@@@@@@@@@@@@@@jjjZZZ??????@@@AAA@@@@@@@@@AAACCC???BBBAAAAAABBB>>>@@@;;;IIIAAAAAA===AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@AAA@@@DDD@@@EEEᱱMMMCCC======FFF@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>AAA???@@@AAAAAA@@@??????@@@<<<@@@>>>??????>>>AAA@@@AAA>>>;;;@@@DDD===AAA???@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@>>>BBB<<>>CCC@@@;;;@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB쨨@@@@@@@@@@@@???????????????@@@AAAAAA>>>AAACCC@@@@@@BBB???DDDDDD;;;CCC???>>>@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB???QQQ>>>>>>EEE<<<@@@@@@@@@@@@@@@@@@@@@@@@???nnnzzzAAA@@@@@@???>>>???@@@AAA@@@BBB===DDD>>><<>>DDD@@@@@@CCC@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@>>>BBBAAArrr@@@???BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@===RRR___@@@???@@@@@@??????AAAAAA@@@<<>>???@@@@@@@@@@@@@@@@@@@@@@@@CCCBBBSSS??????AAAAAA@@@@@@@@@@@@???AAA???MMMWWWBBB@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@BBB<<>>AAA@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@??????BBB@@@???AAAAAAAAAAAA@@@CCC===<<>>CCC>>>CCCBBB===@@@???FFF<<<@@@BBBBBB>>>===BBB@@@AAABBBAAA===BBB===AAA@@@@@@BBB@@@@@@@@@@@@AAA@@@>>>BBBAAADDDGGG>>>@@@???BBBCCC===@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggҮ\\\DDD===@@@@@@CCC>>>AAACCC>>>???```@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???FFF===AAA>>>>>>AAACCC>>>;;;DDDAAA@@@{{{ИGGGAAA@@@AAABBB>>>AAA>>><<<@@@CCC>>>CCCAAA@@@@@@BBB@@@@@@???@@@AAA???@@@@@@???nnn񛛛AAA???CCC>>>???AAA@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggddd@@@======@@@BBBBBBAAAAAA???@@@???@@@???BBB@@@>>>???RRR@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYBBB<<>>===>>>YYYcccBBBAAA>>>@@@AAA===@@@@@@BBB@@@@@@???@@@??????DDD??????GGG@@@CCC???>>>BBB>>>BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg❝IIICCCCCCBBBCCCBBB?????????@@@CCC???BBBAAACCC===??????BBB???>>>===NNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAA>>>@@@DDDaaaAAAAAA???BBB?????????BBBCCC@@@谰@@@@@@DDD>>>BBB@@@@@@BBB@@@@@@>>>@@@@@@???BBB???SSSnnnBBB<<>>AAABBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggddd===BBBBBB<<<<<>>BBB???AAABBBCCC<<>>BBB;;;BBB}}}휜BBB<<>>???BBB>>>===AAAppp???>>>AAA@@@===BBBBBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggBBBCCC<<>>===BBB@@@:::@@@@@@===>>>@@@@@@XXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY===>>>CCCsss@@@AAAAAA<<>>AAA{{{잞:::DDDBBB@@@@@@>>>BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggfff===@@@EEE:::>>>@@@===@@@BBB>>>===@@@AAAAAA?????????@@@???AAACCC>>>CCC>>>DDD@@@???@@@TTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYDDD@@@>>>񀀀AAA===AAACCC===@@@BBBGGGPPP???@@@@@@@@@@@@BBB@@@>>>CCCAAA>>>AAABBB>>>vvv힞CCC>>>???@@@AAA@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggfffAAAAAA???EEE???>>>BBB^^^fffBBB<<>>BBB>>>>>>BBB@@@>>>ooo@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY>>>???AAA^^^>>>BBB@@@===???CCC???AAAHHH@@@???BBB@@@@@@BBB@@@AAA@@@@@@BBBAAA@@@FFFOOOyyy===@@@AAA???@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggooo???@@@BBB@@@RRRDŽ???AAA@@@AAA>>>@@@BBB>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???BBB@@@ddd𳳳>>>DDDAAA===AAAAAA@@@BBB???쩩BBBCCC===AAA@@@@@@BBB@@@AAA???@@@AAA@@@===???DDDOOO@@@AAA???BBB===AAABBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggBBB@@@OOOܻMMM>>>???>>>??????DDD???BBBNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???AAA???>>>ooo괴AAACCC===<<>>???uuu===AAA@@@AAA@@@???@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggmmmPPP@@@FFF@@@>>>AAA>>>AAA999@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYBBB???===@@@CCCDDDssswwwYYY>>>DDD>>>BBBBBBVVVmmmBBB@@@@@@:::DDDfffyyyDDDBBB@@@@@@BBB???@@@@@@BBB@@@@@@@@@@@@@@@@@@AAABBBAAA???PPPBBB@@@@@@@@@???AAA@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg൵???<<>>@@@FFFVVV@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???@@@@@@??????CCC<<<>>>@@@CCC@@@???HHHccc???@@@DDD===@@@???BBB@@@<<>>AAA@@@@@@BBB@@@@@@AAAAAA??????@@@AAA@@@DDDTTTjjj>>>>>>@@@AAA<<>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???>>>CCC>>>AAAAAAAAADDD???@@@<<>>AAA@@@BBBAAA???===AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@???AAAAAA@@@======???@@@@@@XXX𣣣===???DDD<<>>BBBAAA@@@@@@BBB@@@??????@@@AAAAAA@@@@@@AAABBBAAA@@@GGG⬬III???@@@===EEE???>>>DDD===@@@>>>BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggggggBBBAAA;;;AAA???EEE???ppp@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???EEE???<<<@@@???CCCBBBBBB???@@@uuu@@@BBBAAAAAABBB>>>CCC@@@???BBB===BBB@@@@@@BBB@@@BBB@@@???@@@@@@??????@@@>>>EEE===>>>EEEAAAiii|||III@@@AAACCC??????AAA@@@@@@???AAA@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg㊊???BBB???@@@@@@>>>???UUU@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAA===BBBBBB???@@@@@@>>>===DDD???fffAAA>>>AAA>>>???BBB===AAAAAA<<>>>>>@@@AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg尰@@@>>>BBBAAA@@@AAA???KKK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@AAA>>>AAABBBkkk>>>BBB???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA@@@>>>???@@@AAAAAA@@@>>>??????@@@BBBBBB@@@===@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@BBB@@@???AAA???BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@???BBB;;;BBBaaa@@@???>>>GGG;;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>???AAAAAA@@@???>>>AAACCCBBB@@@??????@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@BBB@@@???@@@@@@===AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@AAA???AAADDD???NNNɭccc===BBBEEEAAA>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@??????AAAAAA??????AAA@@@===???AAAAAA@@@???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg@@@===BBB@@@AAA===AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@BBBBBB===;;;AAA@@@???AAA@@@AAA@@@AAA<<<@@@:::FFF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAA@@@>>>>>>@@@BBBAAACCCAAA???@@@AAAAAA@@@>>>@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggAAA===AAA@@@AAA???AAAHHH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@>>>@@@DDD@@@AAA@@@===@@@>>>EEE???CCC???AAABBB<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@???BBBAAA===<<<===>>>???@@@??????@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggBBBAAA???@@@>>>CCC<<>>AAA@@@AAA???AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>BBB???@@@DDD???===FFFBBBAAA@@@AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ggg⡡AAABBB???@@@>>>@@@@@@ppp@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@>>>BBB@@@BBB@@@@@@AAA@@@BBBDDD@@@BBB???===DDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@???CCC???>>>AAA<<>>???BBBAAA???@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gggႂ@@@===AAAAAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@???BBB@@@===AAACCC???@@@>>>BBB===???BBBAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>@@@BBB===AAASSSbbb@@@???AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA>>>BBB???dddIIIAAA@@@AAA??????@@@CCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@AAAAAA@@@>>>???CCC???@@@???@@@AAA??????CCCBBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA@@@@@@CCCOOOAAA???>>>@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???@@@???eee䨨<<>>>>>AAA@@@???BBB@@@DDD===BBB???<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@AAABBBBBB;;;iii򚚚??????DDD@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???@@@AAAhhhRRRAAA???CCC>>>>>>>>>AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???>>>BBB===BBBBBB======@@@BBB<<>>???<<<@@@FFF@@@EEE<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@AAABBB@@@AAA@@@EEEDDDDDDEEEEEEBBB>>>>>>AAA@@@<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>DDDAAA???ooo򰰰@@@DDDAAA@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@>>>???ccc|||>>>CCCBBBBBBAAA======999yyy@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@===>>>BBB@@@ͧUUUDDDDDD???AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@???CCC;;;AAAJJJmmmAAA===???@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA@@@???@@@aaa䫫YYY@@@<<>>FFF===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@===CCCBBB@@@hhhDDDCCC??????@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???@@@@@@???BBBbbbǗUUU@@@CCCAAAAAAAAAAAA>>>CCC??????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@HHHCCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB>>>BBB???<<>>BBBBBB<<>>??????CCC>>>BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@齽AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@AAA?????????EEEwwwNNNAAA===???AAABBBBBB?????????AAA???SSSsssAAACCC???===CCCBBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc⣣AAAAAA???AAAAAA@@@>>>DDDAAA?????????AAA>>>BBBAAA>>>BBBAAA@@@@@@>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAAAAA>>>BBBAAA@@@???XXX섄@@@===???AAA>>>BBB???@@@@@@@@@BBB@@@>>>@@@>>>EEEDDDXXXFFF?????????>>>???DDDBBB>>>ZZZꫫ???:::DDD<<>>BBB<<>>AAAAAA===AAA@@@@@@BBB@@@@@@CCCCCC;;;{{{>>>CCCBBB???@@@???@@@===FFF|||AAAEEE???BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccclll>>>@@@AAA???AAA@@@CCC???CCC@@@@@@===AAA\\\@@@???@@@AAA???@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@???DDD===@@@BBBHHHqqqBBB@@@BBBAAA>>>@@@@@@@@@@@@BBB@@@AAA======BBB___>>>??????AAA@@@BBB@@@\\\񼼼???>>>@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccclll@@@AAA???BBBAAA===>>>DDD>>>IIIeeeAAA@@@AAAAAA???@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@??????CCC???@@@\\\ꠠ>>>>>>DDD>>>>>>BBB@@@@@@@@@BBB@@@???AAADDD===```AAADDD>>>???@@@;;;FFF{{{빹CCC???BBBBBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccrrrAAA???@@@>>>???CCC@@@AAA@@@@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???@@@===EEE??????jjj@@@AAA???===CCC???AAA@@@@@@BBB@@@@@@AAA>>>===WWW@@@===@@@???EEE>>>>>>WWW񰰰AAA;;;CCCBBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccsssAAA===BBBDDD>>>@@@BBBAAA@@@???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???AAA???AAA???@@@fff믯???BBBAAA===CCC???@@@@@@@@@BBB@@@>>>AAA???DDDccc===CCC>>>AAA@@@===@@@??????ddd@@@BBB===BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccuuuAAA@@@AAA<<<@@@@@@CCC???AAA??????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@???AAATTT򙙙>>>???DDD???@@@@@@???@@@@@@BBB@@@CCC>>>@@@???AAA}}}쫫HHHBBB>>>CCC???@@@CCC>>>???BBBFFF~~~BBB>>>@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccxxx???DDD<<>>̼;;;BBB@@@@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAA@@@???CCC???AAAEEEhhhAAA@@@>>>CCC???>>>BBB@@@@@@BBB@@@@@@AAA??????AAA???LLLeeesssSSSBBB>>>@@@DDD\\\FFF@@@DDDAAA???UUUwwwdddLLL???===???@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc|||@@@AAA???@@@AAA@@@JJJ̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAA<<>>===FFF???:::AAABBB>>>]]]999AAACCC@@@DDDAAA???@@@AAAAAA@@@???BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc}}}@@@AAA???@@@AAA@@@MMM̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY>>>BBBCCC??????BBB:::IIIrrrAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@???BBB@@@>>>BBB@@@<<<<<>>@@@@@@???>>>@@@BBBBBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc@@@AAA???@@@@@@@@@RRR̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@CCC>>>???>>>AAACCC???dddEEE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@???BBB@@@===???AAABBBCCC@@@???===@@@jjj<<<@@@@@@AAAAAA@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccĉ@@@@@@@@@@@@@@@@@@XXX̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@>>>DDDAAA===BBBAAA>>>rrr쭭DDD>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@???AAAAAA@@@???>>>???AAA???AAABBB???뀀EEE@@@AAA>>>>>>>>>@@@AAABBB@@@???BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc̅AAA@@@@@@@@@@@@AAA^^^̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???@@@@@@???BBBAAA>>>===BBBAAASSSہ@@@BBBBBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@AAA@@@@@@AAAAAA???????????????@@@CCCkkk===??????AAABBBBBB@@@??????@@@AAABBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc̈AAA@@@@@@@@@@@@AAAddd̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAAAAAAAA;;;BBBBBB???EEE>>>AAA@@@@@@[[[ótttFFF@@@CCC===>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@AAA??????@@@@@@BBBCCCAAAEEE<<>>@@@@@@CCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@>>>???AAAAAA???@@@AAA>>>===CCC>>>AAABBBjjjRRRCCC===AAA@@@@@@AAA@@@>>>>>>@@@AAA@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc̋AAA???@@@@@@@@@AAAkkk̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@AAAAAA===AAA@@@DDD???BBB@@@@@@<<>>EEE>>>@@@BBB??????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???@@@CCC<<>>AAA>>>AAABBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc˼hhhLLLFFFAAAHHHddd̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???AAA???@@@BBBBBBBBB>>>AAA@@@@@@AAA@@@???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>BBBCCC>>>AAAAAA<<>>AAA??????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB???AAA???>>>BBBBBB>>>@@@======AAABBB===???@@@???BBBAAA===<<>>CCC<<>>@@@>>>???CCC@@@>>>@@@DDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA<<<@@@CCC???>>>AAABBB>>>CCCAAA???AAA>>>AAAAAABBB>>>???BBBAAA???DDD===BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???AAA??????@@@DDD>>>CCC===JJJDDD<<>>AAA???>>>@@@AAA@@@<<<@@@CCC<<>>@@@AAA;;;AAAaaabbb???@@@DDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDD>>><<<@@@AAABBBBBBAAA:::DDDDDD>>>AAAAAACCC===BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@DDD<<>>???BBB??????BBBAAA===@@@===CCCBBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc²̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAA>>>BBB===CCCHHHFFFCCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>BBBAAA@@@DDD@@@<<>>@@@AAABBB===@@@EEEvvv̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY?????????CCCAAAppp???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAADDDCCC???@@@<<>>>>>CCC̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAA@@@@@@@@@@@@aaaSSSDDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??????BBBBBB===??????CCC@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccɈAAADDD;;;CCCBBB===CCCAAA???̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY>>>AAA???<<>>AAAAAABBB>>>AAABBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccˁ@@@>>>BBB@@@>>>BBB??????@@@̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY???CCC>>>AAA<<>>DDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@DDD===@@@DDD@@@>>>BBB===>>>@@@???===EEE???BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???ccc̀@@@???BBB???===BBB@@@@@@@@@̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@BBBAAA>>>>>>AAAFFFAAA===BBB???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAAAAABBB???>>>DDD===???CCCCCC@@@>>>BBB<<<@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccʇ???EEE<<>>̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY>>>AAA>>>BBBBBBDDD@@@CCC>>>???BBBCCC>>>BBBEEE<<<@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA===AAAAAA???AAA???<<>>>>>DDD???<<>>===AAA===??????BBB===BBB<<>>AAA>>>AAABBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccFFF===AAAAAAAAA???AAAAAAooo̻AAA@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYYAAA===CCCBBB;;;DDD@@@AAA???BBB>>>@@@AAA===@@@AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@SSS@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???cccɒFFF<<>>>>>CCC@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@===DDD>>>AAAAAAHHH@@@CCC>>>;;;>>>AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@```;AAA@@@AAAEEE===@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAABBBDDD===AAA===DDD압>>>BBBCCCCCC???AAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA@@@===@@@BBB[[[DDD???===BBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@===@@@??????DDD???KKKeee@@@<<>>AAA>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??????DDD<<>>AAAGGGCCC???AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??????@@@===CCCFFF>>>CCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA@@@>>>AAA@@@BBB??????@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CCC@@@DDD>>>>>>@@@@@@??????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@???AAA======@@@>>>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@BBBDDD?????????CCC>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA>>>>>>eee뤤FFF>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@===BBBDDD@@@???CCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>>>===BBB@@@AAA===CCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???AAA???YYY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CCC>>>bbbEEEAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA===CCC<<>>CCC>>>>>>AAA???AAAAAA@@@@@@@@@???@@@@@@AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@___===EEE???@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAA???>>>BBBWWW@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAA???===BBBAAABBB===@@@@@@@@@eeeqqq>>>AAACCC@@@???@@@???@@@BBBCCCAAA>>>===>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@BBB]]]BBB<<>>\\\@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@>>>???@@@AAA???===AAABBB>>>@@@???CCC@@@EEE櫫PPP===>>>???CCC@@@@@@>>>===???BBBCCCAAA???@@@@@@@@@@@@@@@@@@@@@@@@AAA```???EEE>>>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAWWW@@@@@@@@@@@@@@@@@@@@@@@@===@@@CCCBBB@@@???@@@CCCAAA;;;@@@BBB>>><<<^^^KKKBBB???>>>AAAAAABBBAAA>>>===>>>AAA????????????????????????CCC]]]>>><<>>[[[@@@@@@@@@@@@@@@@@@@@@@@@BBB@@@======???AAA@@@??????AAAEEE;;;TTT뱱yyyQQQ???>>>???AAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@EEE^^^CCC???===AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBB;;;BBBYYY@@@@@@@@@@@@@@@@@@@@@@@@>>>???@@@@@@@@@@@@AAAAAABBBCCClll뼼wwwkkkaaaWWWQQQTTTTTTTTTTTTTTTTTTTTTTTTYYY```GGGDDDIIIDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCDDDGGGCCCvvvRRRRRRRRRRRRRRRRRRRRRRRRPPPSSSTTTRRRRRR\\\ppp \ No newline at end of file diff --git a/data/tahoma12.nxfnt b/data/tahoma12.nxfnt new file mode 100644 index 0000000000000000000000000000000000000000..f709e54b7e7db9ee3a3d4f2a72b0260f7a18a1c3 GIT binary patch literal 79960 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, sizeof(args->buf)); + Result rc = envSetNextLoad(path, (char*)argBuf); + if(R_FAILED(rc)) fatalSimple(rc);//TODO: How should failing be handled? + uiExitLoop(); +} + +const loaderFuncs_s loader_builtin = +{ + .name = "builtin", + .init = init, + .deinit = deinit, + .launchFile = launchFile, +}; + diff --git a/nx_main/main.c b/nx_main/main.c new file mode 100644 index 0000000..682b455 --- /dev/null +++ b/nx_main/main.c @@ -0,0 +1,88 @@ +#include +#include +#include + +#include "../common/common.h" + +uint8_t* g_framebuf; + +int main(int argc, char **argv) +{ + gfxInitDefault(); + + appletSetScreenShotPermission(1); + + menuStartup(); + + launchInit(); + + while (appletMainLoop()) + { + //Scan all the inputs. This should be done once for each frame + hidScanInput(); + + g_framebuf = gfxGetFramebuffer(NULL, NULL); + memset(g_framebuf, 237, gfxGetFramebufferSize()); + if (!uiUpdate()) break; + menuLoop(); + + gfxFlushBuffers(); + gfxSwapBuffers(); + gfxWaitForVsync(); + } + + launchExit(); + + gfxExit(); + return 0; +} + +void launchMenuEntryTask(menuEntry_s* arg); + +//This is implemented here due to the hid code. +bool menuUpdate(void) { + bool exitflag = 0; + menu_s* menu = menuGetCurrent(); + u32 down = hidKeysDown(CONTROLLER_P1_AUTO); + + if (down & KEY_A) + { + if (menu->nEntries > 0) + { + int i; + menuEntry_s* me; + for (i = 0, me = menu->firstEntry; i != menu->curEntry; i ++, me = me->next); + launchMenuEntryTask(me); + //workerSchedule(launchMenuEntryTask, me); + } + } + else if (down & KEY_B) + { + //workerSchedule(changeDirTask, ".."); + menuScan(".."); + } + else if (down & KEY_PLUS) + { + exitflag = 1; + } + /*else if (down & KEY_Y) + { + workerSchedule(netloaderTask, NULL); + }*/ + else if (menu->nEntries > 0) + { + int move = 0; + + if (down & KEY_LEFT) move--; + if (down & KEY_RIGHT) move++; + if (down & KEY_DOWN) move-=4; + if (down & KEY_UP) move+=4; + + int newEntry = menu->curEntry + move; + if (newEntry < 0) newEntry = 0; + if (newEntry >= menu->nEntries) newEntry = menu->nEntries-1; + menu->curEntry = newEntry; + } + + return exitflag; +} diff --git a/nx_main/nx_launch.c b/nx_main/nx_launch.c new file mode 100644 index 0000000..d5420fa --- /dev/null +++ b/nx_main/nx_launch.c @@ -0,0 +1,75 @@ +#include "../common/common.h" + +static const loaderFuncs_s* s_loader; + +void launchInit(void) { +#define ADD_LOADER(_name) do \ + { \ + extern const loaderFuncs_s _name; \ + if (_name.init()) \ + { \ + s_loader = &_name; \ + return; \ + } \ + } while(0) + + ADD_LOADER(loader_builtin); + + // Shouldn't happen + fatalSimple(-1);//TODO: What value should be used for this? +} + +void launchExit(void) { + s_loader->deinit(); +} + +const loaderFuncs_s* launchGetLoader(void) { + return s_loader; +} + +void launchMenuEntry(menuEntry_s* me) { + /*bool canUseTitles = loaderCanUseTitles(); + if (me->descriptor.numTargetTitles && canUseTitles) + { + // Update the list of available titles + titlesCheckUpdate(false, UI_STATE_NULL); + + int i; + for (i = 0; i < me->descriptor.numTargetTitles; i ++) + if (titlesExists(me->descriptor.targetTitles[i].tid, me->descriptor.targetTitles[i].mediatype)) + break; + + if (i == me->descriptor.numTargetTitles) + { + errorScreen(s_loader->name, textGetString(StrId_MissingTargetTitle)); + return; + } + + // Use the title + s_loader->useTitle(me->descriptor.targetTitles[i].tid, me->descriptor.targetTitles[i].mediatype); + } else if (me->descriptor.selectTargetProcess) + { + if (!canUseTitles) + { + errorScreen(s_loader->name, textGetString(StrId_NoTargetTitleSupport)); + return; + } + + // Launch the title selector + if (!me->titleSelected) + { + titleSelectInit(me); + return; + } + + // Use the title + s_loader->useTitle(me->titleId, me->titleMediatype); + }*/ + + // Scan the executable if needed + /*if (loaderHasFlag(LOADER_NEED_SCAN)) + descriptorScanFile(&me->descriptor, me->path);*/ + + // Launch it + s_loader->launchFile(me->path, &me->args); +} diff --git a/pc_main/main.cpp b/pc_main/main.cpp new file mode 100644 index 0000000..5d38289 --- /dev/null +++ b/pc_main/main.cpp @@ -0,0 +1,56 @@ +#include +#include +#include + +extern "C" { + +#include "../common/common.h" + +} + +color_t pixels[720][1280]; + +int main() +{ + sf::RenderWindow window(sf::VideoMode(1280, 720), "Test"); + window.setFramerateLimit(60); + + menuStartup(); + + while (window.isOpen()) + { + sf::Event event; + while (window.pollEvent(event)) + { + if (event.type == sf::Event::Closed) + { + window.close(); + break; + } + } + + memset(pixels, 237, sizeof(pixels)); + + if (!uiUpdate()) break; + menuLoop(); + window.clear(); + + sf::Image image; + image.create(1280, 720, (const unsigned char*)pixels); + + sf::Texture texture; + texture.loadFromImage(image); + + sf::Sprite sprite; + sprite.setTexture(texture); + + window.draw(sprite); + window.display(); + } + + return 0; +} + +extern "C" bool menuUpdate(void) { + return 0; +} diff --git a/pc_main/pc_launch.c b/pc_main/pc_launch.c new file mode 100644 index 0000000..d9d76d7 --- /dev/null +++ b/pc_main/pc_launch.c @@ -0,0 +1,19 @@ +#include "../common/common.h" + +static const loaderFuncs_s* s_loader; + +void launchInit(void) { + +} + +void launchExit(void) { + //s_loader->deinit(); +} + +const loaderFuncs_s* launchGetLoader(void) { + return s_loader; +} + +void launchMenuEntry(menuEntry_s* me) { + +} diff --git a/resources/folder_icon_.jpg b/resources/folder_icon_.jpg new file mode 100644 index 0000000000000000000000000000000000000000..938dfce3642ae3a1fb4f804106502953a20cff24 GIT binary patch literal 4294 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 literal 0 HcmV?d00001 diff --git a/resources/switchicon-questionmark.jpg b/resources/switchicon-questionmark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53307b42fd683888fcec94ec58ef8de7d328408e GIT binary patch literal 8965 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