diff options
author | chai <chaifix@163.com> | 2018-10-23 12:23:58 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-10-23 12:23:58 +0800 |
commit | 40fc27154fe754181934dc7ee31375e6bdfb33fc (patch) | |
tree | 897ad98d759bc308ef66561181ba88b85f2ccd47 /src/lua | |
parent | 1480c9445100075c9e1a894eb07c0ef727b509a1 (diff) |
*merge from minimal
Diffstat (limited to 'src/lua')
53 files changed, 3554 insertions, 5627 deletions
diff --git a/src/lua/common/Proxy.h b/src/lua/common/Proxy.h index 8323ead..5ebb5b2 100644 --- a/src/lua/common/Proxy.h +++ b/src/lua/common/Proxy.h @@ -3,46 +3,65 @@ #include "Reference.hpp" -namespace jin +namespace JinEngine { -namespace lua -{ - - class Proxy + namespace Lua { - public: - void bind(RefBase* ref) - { - if (ref == nullptr) - return; - reference = ref; - } - void release() + class Proxy { - if (reference != nullptr) + public: + void bind(RefBase* ref) { - reference->release(); - reference = nullptr; + if (ref == nullptr) + return; + reference = ref; } - } - template<class T> - Ref<T>& getRef() - { - return *(Ref<T>*) reference; - } + void release() + { + if (reference != nullptr) + { + reference->release(); + reference = nullptr; + } + } - const char* getObjectType() - { - return reference->type; - } + void retain() + { + if (reference != nullptr) + reference->retain(); + } + + void setUserdata(void* data) + { + if (reference != nullptr) + reference->setUserdata(data); + } + + template<class T> + Ref<T>& getRef() + { + return *(Ref<T>*) reference; + } + + template<class T> + T* getObject() + { + Ref<T>& ref = getRef<T>(); + return ref.getObject(); + } + + const char* getObjectType() + { + return reference->type; + } - RefBase* reference; + RefBase* reference; - }; + }; -} // lua -} // jin + } // namespace Lua +} // namespace JinEngine #endif // __JIN_COMMON_PROXY_H
\ No newline at end of file diff --git a/src/lua/common/Reference.hpp b/src/lua/common/Reference.hpp index feb96bb..ba918bb 100644 --- a/src/lua/common/Reference.hpp +++ b/src/lua/common/Reference.hpp @@ -1,78 +1,88 @@ #ifndef __JIN_COMMON_REFERENCE_H #define __JIN_COMMON_REFERENCE_H -namespace jin +namespace JinEngine { -namespace lua -{ - - /*abstract*/class RefBase + namespace Lua { - public: - void retain() - { - ++count; - } - void release() + /*abstract*/class RefBase { - if (--count <= 0) - delete this; - } - - // object type string - const char* const type; - - protected: - RefBase(void* obj, const char* t) - : count(1) - , object(obj) - , type(t) - { - } - - RefBase(const RefBase&); - - virtual ~RefBase() - { - } - - void* object; - int count; - - }; - - template<class T> - class Ref : public RefBase - { - public: - Ref(T* obj, const char* type) - : RefBase(obj, type) + public: + void retain() + { + ++count; + } + + void release() + { + if (--count <= 0) + delete this; + } + + // object type string + const char* const type; + + void setUserdata(void* data) + { + userdata = data; + } + + void* getUserdata() + { + return userdata; + } + + protected: + RefBase(void* obj, const char* t) + : count(1) + , object(obj) + , type(t) + { + } + + RefBase(const RefBase&); + + virtual ~RefBase() + { + } + + void* object; + int count; + void* userdata; + }; + + template<class T> + class Ref : public RefBase { - } - - ~Ref() - { - T* obj = (T*)object; - delete obj; - } - - T* operator->() - { - return (T*)object; - } - - T* getObject() - { - return (T*)object; - } - - private: - Ref(const Ref<T>& ref); - - }; - -} + public: + Ref(T* obj, const char* type) + : RefBase(obj, type) + { + } + + ~Ref() + { + T* obj = static_cast<T*>(object); + delete obj; + } + + T* operator->() + { + return (T*)object; + } + + T* getObject() + { + return (T*)object; + } + + private: + Ref(const Ref<T>& ref); + + }; + + } } #endif
\ No newline at end of file diff --git a/src/lua/common/common.h b/src/lua/common/common.h index 536b897..0ee72cc 100644 --- a/src/lua/common/common.h +++ b/src/lua/common/common.h @@ -3,5 +3,6 @@ #include "Proxy.h" #include "Reference.hpp" +#include "error.h" #endif
\ No newline at end of file diff --git a/src/lua/common/error.h b/src/lua/common/error.h new file mode 100644 index 0000000..c254486 --- /dev/null +++ b/src/lua/common/error.h @@ -0,0 +1,28 @@ +#ifndef __JIN_ERROR_H +#define __JIN_ERROR_H +#include "../../luax.h" +#include "../jin.h" +#include <string.h> + +namespace JinEngine +{ +namespace Lua +{ + + static const int FORMAT_MSG_BUFFER_SIZE = 2048; + + inline void error(lua_State* L, const char* fmt, ...) + { + char err[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 }; + va_list args; + va_start(args, fmt); + vsnprintf(err + strlen(err), FORMAT_MSG_BUFFER_SIZE, fmt, args); + va_end(args); + luax_getglobal(L, MODULE_NAME); + luax_setfieldstring(L, "error", err); + } + +} +} + +#endif
\ No newline at end of file diff --git a/src/lua/modules/embed/boot.lua.h b/src/lua/embed/boot.lua.h index d84ca21..99e657b 100644 --- a/src/lua/modules/embed/boot.lua.h +++ b/src/lua/embed/boot.lua.h @@ -1,8 +1,8 @@ /* boot.lua */ static const char* boot_lua = R"( -jin._argv[2] = jin._argv[2] or '.' +jin.args[2] = jin.args[2] or '.' jin.filesystem.init() -jin.filesystem.mount(jin._argv[2]) +jin.filesystem.mount(jin.args[2]) ------------------------------------------------------------------------- -- Config game @@ -14,10 +14,11 @@ if jin.filesystem.exist("config.lua") then end jin.config.width = jin.config.width or 576 jin.config.height = jin.config.height or 448 -jin.config.vsync = jin.config.vsync or false -jin.config.title = jin.config.title or ("jin v" .. jin.version()) +jin.config.vsync = jin.config.vsync or true +jin.config.title = jin.config.title or ("jin v" .. jin.version) jin.config.resizable = jin.config.resizable or false jin.config.fullscreen = jin.config.fullscreen or false +jin.config.fps = jin.config.fps or 60 ------------------------------------------------------------------------- -- Initialize sub systems @@ -25,6 +26,7 @@ jin.config.fullscreen = jin.config.fullscreen or false jin.graphics.init(jin.config) jin.audio.init() +-- TODO: ϵͳģ ------------------------------------------------------------------------- -- Default game loop @@ -36,49 +38,30 @@ local function call(func, ...) end end -jin.core.setHandler = function(handler) - if handler == nil then - return - end - jin.core.onLoad = handler.onLoad - jin.core.onEvent = handler.onEvent - jin.core.onUpdate = handler.onUpdate - jin.core.onDraw = handler.onDraw -end - function jin.core.run() call(jin.core.onLoad) + jin.graphics.reset() local dt = 0 local previous = jin.time.second() local current = previous while jin.core.running() do for _, e in pairs(jin.event.poll()) do - if e.type == "keydown" then + if e.type == "KeyDown" then jin.keyboard.set(e.key, true) - elseif e.type == "keyup" then + elseif e.type == "KeyUp" then jin.keyboard.set(e.key, false) end call(jin.core.onEvent, e) end - previous = current current = jin.time.second() dt = current - previous - - call(jin.core.onUpdate, dt) - - if jin.graphics then - jin.graphics.unbindCanvas() - jin.graphics.clear() - jin.graphics.setColor() - jin.graphics.setFont() - call(jin.core.onDraw) - jin.graphics.present() - end - - if jin.time then - jin.time.sleep(0.001) - end + call(jin.core.onUpdate, dt) + jin.graphics.clear() + call(jin.core.onDraw) + jin.graphics.present() + -- Sleep 1 ms + jin.time.sleep(0.001) end end @@ -86,6 +69,17 @@ end -- No game handler ------------------------------------------------------------------------- +jin.core.setHandler = function(handler) + if handler == nil then + return + end + jin.core.onLoad = handler.onLoad + jin.core.onEvent = handler.onEvent + jin.core.onUpdate = handler.onUpdate + jin.core.onDraw = handler.onDraw +end + +-- TODO: Ĭͼbase64 jin.nogame = { cs = 64, sw = jin.graphics.getWidth(), @@ -103,11 +97,12 @@ jin.nogame = { nogame.t = nogame.ww - 1 end, onEvent = function(e) - if e.type == 'quit' then + if e.type == 'Quit' then jin.core.stop() end end, onUpdate = function(dt) + print(dt) local nogame = jin.nogame nogame.t = nogame.t + dt * nogame.speed if nogame.t > nogame.ww2 then @@ -144,27 +139,29 @@ jin.nogame = { ------------------------------------------------------------------------- local function onError(msg) - local tab = ' ' - print("Error:\n" .. msg) - function jin.core.onEvent(e) - if e.type == 'quit' then - jin.core.stop() + jin.graphics.reset() + jin.graphics.setClearColor(100, 100, 100, 255) + jin.graphics.clear() + jin.graphics.print("Error:\n" .. msg .. "\n" .. debug.traceback(), 5, 5) + jin.graphics.present() + while jin.core.running() do + for _, e in pairs(jin.event.poll()) do + if e.type == "Quit" then + jin.core.stop() + end end - end - local ww, wh = jin.graphics.getSize() - function jin.core.onDraw() - jin.graphics.write("Error: ", 10, 10, 30, 3, 30) - jin.graphics.write(msg, 10, 50) - end + jin.time.sleep(0.001) + end + jin.core.quit() end local function boot() if jin.filesystem.exist("main.lua") then - -- require main game script + -- Require main game script xpcall(function() require"main" end, onError) - jin.core.run() + xpcall(function() jin.core.run() end, onError) else - -- no game + -- No game jin.core.setHandler(jin.nogame) jin.core.run() end @@ -175,4 +172,4 @@ end xpcall(boot, onError) -)"; +)";
\ No newline at end of file diff --git a/src/lua/modules/embed/embed.h b/src/lua/embed/embed.h index 18ed1d8..18373c8 100644 --- a/src/lua/modules/embed/embed.h +++ b/src/lua/embed/embed.h @@ -2,14 +2,11 @@ #define __JIN_LUA_EMBED_H #include <cstring> -namespace jin +namespace JinEngine { namespace embed { - /** - * embed lua script to context. - */ #define embed(L, script, name)\ if(luax_loadbuffer(L, script, strlen(script), name) == 0)\ lua_call(L, 0, 0); @@ -25,25 +22,25 @@ namespace embed static void boot(lua_State* L) { // embed scripts - #include "graphics.lua.h" // graphics - #include "keyboard.lua.h" // keyboard - #include "mouse.lua.h" // mouse - #include "boot.lua.h" // boot + #include "graphics.lua.h" + #include "keyboard.lua.h" + #include "mouse.lua.h" + #include "boot.lua.h" - // embed scripts + // in order const jin_Embed scripts[] = { - { "graphics.lua", graphics_lua }, - { "keyboard.lua", keyboard_lua }, - { "mouse.lua", mouse_lua }, - { "boot.lua", boot_lua }, - { 0, 0 } + { "graphics.lua", graphics_lua }, + { "keyboard.lua", keyboard_lua }, + { "mouse.lua", mouse_lua }, + { "boot.lua", boot_lua }, + { 0, 0 } }; - // load all emebd lua scripts for (int i = 0; scripts[i].file; ++i) embed(L, scripts[i].source, scripts[i].file); } -} -} + +} // embed +} // namespace JinEngine #endif
\ No newline at end of file diff --git a/src/lua/embed/graphics.lua.h b/src/lua/embed/graphics.lua.h new file mode 100644 index 0000000..5fa5dad --- /dev/null +++ b/src/lua/embed/graphics.lua.h @@ -0,0 +1,46 @@ +/* graphics.lua */ +static const char* graphics_lua = R"( +jin.graphics = jin.graphics or {} + +local default_shader = nil +local default_shader_source = [[ +#VERTEX_SHADER + +Vertex vert(Vertex v) +{ + return v; +} + +#END_VERTEX_SHADER + +#FRAGMENT_SHADER + +Color frag(Color col, Texture tex, Vertex v) +{ + return col * texel(tex, v.uv); +} + +#END_FRAGMENT_SHADER +]] + +local _init = jin.graphics.init + +jin.graphics.init = function(setting) + _init(setting); + default_shader = jin.graphics.newShader(default_shader_source) + jin.graphics.useShader(default_shader) +end + +jin.graphics.unuseShader = function() + jin.graphics.useShader(default_shader) +end + +-- Reset all attributes to default value. +jin.graphics.reset = function() + jin.graphics.setColor(255, 255, 255, 255) + jin.graphics.setClearColor(0, 0, 0, 255) + jin.graphics.clear() + jin.graphics.unsetFont() +end + +)"; diff --git a/src/lua/modules/embed/keyboard.lua.h b/src/lua/embed/keyboard.lua.h index 77bf3a9..ee8428f 100644 --- a/src/lua/modules/embed/keyboard.lua.h +++ b/src/lua/embed/keyboard.lua.h @@ -4,7 +4,7 @@ jin.keyboard = jin.keyboard or {} local keys = {} -function jin.keyboard.isDown(k) +function jin.keyboard.isPressed(k) return keys[k] end diff --git a/src/lua/modules/embed/mouse.lua.h b/src/lua/embed/mouse.lua.h index 3c222f3..3c222f3 100644 --- a/src/lua/modules/embed/mouse.lua.h +++ b/src/lua/embed/mouse.lua.h diff --git a/src/lua/modules/embed/net.lua.h b/src/lua/embed/net.lua.h index 4d89dc7..4d89dc7 100644 --- a/src/lua/modules/embed/net.lua.h +++ b/src/lua/embed/net.lua.h diff --git a/src/lua/modules/embed/path.lua.h b/src/lua/embed/path.lua.h index 648adf8..648adf8 100644 --- a/src/lua/modules/embed/path.lua.h +++ b/src/lua/embed/path.lua.h diff --git a/src/lua/jin.cpp b/src/lua/jin.cpp new file mode 100644 index 0000000..faae9b2 --- /dev/null +++ b/src/lua/jin.cpp @@ -0,0 +1,110 @@ +#include "jin.h" +#include "lua/modules/luax.h" +#include "embed/embed.h" + +namespace JinEngine +{ + namespace Lua + { + + extern int luaopen_core(lua_State* L); + extern int luaopen_graphics(lua_State* L); + extern int luaopen_audio(lua_State* L); + extern int luaopen_net(lua_State* L); + extern int luaopen_event(lua_State* L); + extern int luaopen_time(lua_State* L); + extern int luaopen_mouse(lua_State* L); + extern int luaopen_keyboard(lua_State* L); + extern int luaopen_filesystem(lua_State* L); + extern int luaopen_joypad(lua_State* L); + extern int luaopen_math(lua_State* L); + extern int luaopen_thread(lua_State* L); + extern int luaopen_bit(lua_State* L); + + static int l_getversion(lua_State* L) + { + luax_pushstring(L, VERSION); + return 1; + } + + static int l_getAuthor(lua_State* L) + { + luax_pushstring(L, AUTHOR); + return 1; + } + + static int l_getOS(lua_State* L) + { + #ifdef _WIN32 + luax_pushstring(L, "windows"); + #elif defined __unix__ + luax_pushstring(L, "unix"); + #elif defined __APPLE__ + luax_pushstring(L, "macos"); + #endif + return 1; + } + + static int l_revision(lua_State* L) + { + luax_pushnumber(L, REVISION); + return 1; + } + + static const luax_Str s[] = { + { "version", VERSION }, + { "author", AUTHOR }, + { "codename", CODE_NAME }, + { 0, 0 } + }; + + static const luax_Num n[] = { + { "revision", REVISION }, + { 0, 0 } + }; + + /* sub modules */ + static const luax_Ref mods[] = { + { "core", luaopen_core }, + { "event", luaopen_event }, + { "graphics", luaopen_graphics }, + { "time", luaopen_time }, + { "mouse", luaopen_mouse }, + { "keyboard", luaopen_keyboard }, + { "filesystem", luaopen_filesystem }, + { "net", luaopen_net }, + { "audio", luaopen_audio }, + { "joypad", luaopen_joypad }, + { "math", luaopen_math }, + { "thread", luaopen_thread }, + { "bit", luaopen_bit }, + //{"ai", luaopen_ai }, + { 0, 0 } + }; + + /* register jin module, keep it on the top of stack */ + int luaopen_jin(lua_State* L) + { + luax_globaltable(L, MODULE_NAME); + + /* register values */ + luax_setfieldstrings(L, s); + luax_setfieldnumbers(L, n); + + /* register submodules */ + for (int i = 0; mods[i].name; ++i) + { + mods[i].func(L); + luax_setfield(L, -2, mods[i].name); + } + + return 1; + } + + void boot(lua_State* L) + { + JinEngine::embed::boot(L); + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/jin.h b/src/lua/jin.h new file mode 100644 index 0000000..71ad51b --- /dev/null +++ b/src/lua/jin.h @@ -0,0 +1,34 @@ +/** +* Copyright (C) 2016~2018 chai +*/ + +#ifndef __JIN_M_JIN_H +#define __JIN_M_JIN_H +#include "luax.h" + +#define MODULE_NAME "jin" +#define CODE_NAME "Side Part" +#define VERSION "0.1.1" +#define REVISION_S "101" +#define REVISION 101 +#define AUTHOR "chai" + +namespace JinEngine +{ + namespace Lua + { + + /// + /// open jin module. + /// + int luaopen_jin(lua_State* L); + + /// + /// Boot jin. + /// + void boot(lua_State* L); + + } // namespace JinEngine +} // namespace Lua + +#endif // __JIN_M_JIN_H
\ No newline at end of file diff --git a/src/lua/libraries/luax/luax.h b/src/lua/libraries/luax/luax.h index 56023b3..fd10737 100644 --- a/src/lua/libraries/luax/luax.h +++ b/src/lua/libraries/luax/luax.h @@ -39,13 +39,18 @@ #define luax_dostring luaL_dostring #define luax_pcall lua_pcall #define luax_setglobal lua_setglobal +#define luax_setglobali(L, i, name)\ +lua_pushvalue(L, i);\ +lua_setglobal(L, name); #define luax_pop lua_pop #define luax_newtable lua_newtable #define luax_getglobal lua_getglobal + +#define luax_clear(L) lua_settop(L, 0) /** * */ -#define luax_setglobal_string(L, n, v) (lua_pushstring(L, v), lua_setglobal(L, n)) +#define luax_setglobalstring(L, n, v) (lua_pushstring(L, v), lua_setglobal(L, n)) /** * Get number of args @@ -82,6 +87,7 @@ inline bool luax_checkbool(lua_State *L, int numArg) /** * Oprating tables. */ +/* get value and leaves it on top of stack */ #define luax_rawgetnumber(L, i, k) (lua_rawgeti(L,i, k), lua_tonumber(L, -1)) /** @@ -104,6 +110,7 @@ inline bool luax_checkbool(lua_State *L, int numArg) #define luax_pushinteger lua_pushinteger #define luax_pushboolean lua_pushboolean #define luax_pushlightuserdata lua_pushlightuserdata +#define luax_pushnil lua_pushnil //inline void luax_pushuserdata(lua_State* L, void* p) //{ @@ -124,37 +131,38 @@ inline bool luax_checkbool(lua_State *L, int numArg) #define luax_setfield_(T, L, k, v)\ do { lua_push##T(L, v); lua_setfield(L, -2, k); } while (0) -#define luax_setfield_number(L, k, v) luax_setfield_(number, L, k, v) -#define luax_setfield_string(L, k, v) luax_setfield_(string, L, k, v) -#define luax_setfield_bool(L, k, v) luax_setfield_(boolean, L, k, v) -#define luax_setfield_udata(L, k, v) luax_setfield_(lightuserdata, L, k, v) -#define luax_setfield_cfunc(L, k, v) luax_setfield_(cfunction, L, k, v) -#define luax_setfield_fstring(L, k, ...)\ +#define luax_setfieldnumber(L, k, v) luax_setfield_(number, L, k, v) +#define luax_setfieldinteger(L, k, v) luax_setfield_(integer, L, k, v) +#define luax_setfieldstring(L, k, v) luax_setfield_(string, L, k, v) +#define luax_setfieldbool(L, k, v) luax_setfield_(boolean, L, k, v) +#define luax_setfieldudata(L, k, v) luax_setfield_(lightuserdata, L, k, v) +#define luax_setfieldcfunc(L, k, v) luax_setfield_(cfunction, L, k, v) +#define luax_setfieldfstring(L, k, ...)\ do { lua_pushfstring(L, __VA_ARGS__); lua_setfield(L, -2, k); } while (0) /** * If nosuch field push a nil at the top of stack. */ #define luax_getfield(L, I, N) lua_getfield(L, I, N) -inline float luax_getfield_number(lua_State* L, int I, const char* N) +inline float luax_getfieldnumber(lua_State* L, int I, const char* N) { luax_getfield(L, I, N); float n = luax_checknumber(L, -1); return n; } -inline int luax_getfield_integer(lua_State* L, int I, const char* N) +inline int luax_getfieldinteger(lua_State* L, int I, const char* N) { luax_getfield(L, I, N); int bin = luax_checkinteger(L, -1); return bin; } -inline const char* luax_getfield_string(lua_State* L, int I, const char* N) +inline const char* luax_getfieldstring(lua_State* L, int I, const char* N) { luax_getfield(L, I, N); const char* str = luax_checkstring(L, -1); return str; } -inline char luax_getfield_bool(lua_State* L, int I, const char* N) +inline char luax_getfieldbool(lua_State* L, int I, const char* N) { luax_getfield(L, I, N); char bin = lua_toboolean(L, -1); @@ -164,12 +172,12 @@ inline char luax_getfield_bool(lua_State* L, int I, const char* N) /** * Set raw */ -#define luax_setraw_(T, L, idx, i, v)\ +#define luax_setraw(T, L, idx, i, v)\ (lua_push##T(L, v), lua_rawseti(L, idx, i)) -#define luax_setraw_string(L, idx, i, v) luax_setraw_(string, L, idx, i, v) -#define luax_setraw_number(L, idx, i, v) luax_setraw_(number, L, idx, i, v) -#define luax_setraw_bool(L, idx, i, v) luax_setraw_(boolean, L, idx, i, v) +#define luax_setrawstring(L, idx, i, v) luax_setraw(string, L, idx, i, v) +#define luax_setrawnumber(L, idx, i, v) luax_setraw(number, L, idx, i, v) +#define luax_setrawbool(L, idx, i, v) luax_setraw(boolean, L, idx, i, v) /** * @@ -315,7 +323,7 @@ inline int luax_tableidxlen(lua_State* L, int i) } /** -* Get table hash size +* Get table hash size inline int luax_tbalehashlen(lua_State* L, int i) { @@ -323,20 +331,20 @@ inline int luax_tbalehashlen(lua_State* L, int i) */ /** -* Get table hash and index size +* Get table hash and index size inline int luax_tablelen(lua_State* L, int i) { } */ -/** -* Set value i in stack a global value called v, and -* don't pop it. -*/ -#define luax_justglobal(L, i, v) (lua_pushvalue(L, i), lua_setglobal(L, v)) +/* create a global tbale and stay it on the top of stack */ +#define luax_globaltable(L, name)\ +lua_newtable(L);\ +lua_pushvalue(L, 1);\ +lua_setglobal(L, name); -inline int luax_table_insert(lua_State * L, int tindex, int vindex, int pos) +inline int luax_tableinsert(lua_State * L, int tindex, int vindex, int pos) { if (tindex < 0) tindex = lua_gettop(L) + 1 + tindex; @@ -363,7 +371,7 @@ inline int luax_table_insert(lua_State * L, int tindex, int vindex, int pos) /** * Add the package loader to the package.loaders table. */ -inline int luax_register_searcher(lua_State * L, lua_CFunction f, int pos) +inline int luax_registersearcher(lua_State * L, lua_CFunction f, int pos) { lua_getglobal(L, "package"); @@ -376,11 +384,41 @@ inline int luax_register_searcher(lua_State * L, lua_CFunction f, int pos) return luaL_error(L, "Can't register searcher: package.loaders table does not exist."); lua_pushcfunction(L, f); - luax_table_insert(L, -2, -1, pos); + luax_tableinsert(L, -2, -1, pos); lua_pop(L, 3); return 0; } +typedef struct luax_Str +{ + const char* name; + const char* value; +} luax_Str; + +inline void luax_setfieldstrings(lua_State* L, const luax_Str* strs) +{ + for (int i = 0; strs[i].name != 0; ++i) + { + luax_setfieldstring(L, strs[i].name, strs[i].value); + } +} + +typedef struct luax_Num +{ + const char* name; + float number; +}; + +inline void luax_setfieldnumbers(lua_State* L, const luax_Num* strs) +{ + for (int i = 0; strs[i].name != 0; ++i) + { + luax_setfieldnumber(L, strs[i].name, strs[i].number); + } +} + +typedef luaL_Reg luax_Ref; + #endif // #if LUA_VERSION_NUM == 501 #endif // __LUAX_H
\ No newline at end of file diff --git a/src/lua/luax.h b/src/lua/luax.h new file mode 100644 index 0000000..89e456e --- /dev/null +++ b/src/lua/luax.h @@ -0,0 +1,7 @@ +#ifndef __JIN_LUA_LUAX_H +#define __JIN_LUA_LUAX_H + +#include "LuaJIT/lua.hpp" +#include "lua/libraries/luax/luax.h" + +#endif
\ No newline at end of file diff --git a/src/lua/main.cpp b/src/lua/main.cpp new file mode 100644 index 0000000..95862ec --- /dev/null +++ b/src/lua/main.cpp @@ -0,0 +1,44 @@ +#ifdef _WIN32 + #include <SDL2/SDL_Main.h> + #include <direct.h> +#endif + +#include "luax.h" +#include "jin.h" +#include "libjin/jin.h" +#include <Windows.h> + +using namespace JinEngine::Lua; +using namespace JinEngine::Filesystem; + +int main(int argc, char* argv[]) +{ + lua_State* L = luax_newstate(); + + /* open lua standard module */ + luax_openlibs(L); + /* open jin module */ + luaopen_jin(L); + /* add args to field */ + luax_newtable(L); + for (int i = 0; i < argc; ++i) + luax_setrawstring(L, -2, i + 1, argv[i]); + luax_setfield(L, -2, "args"); + /* push current working directory */ + /* absolute directory */ + Buffer cwd = Buffer(1024); +#ifdef _WIN32 + _getcwd((char*)&cwd, cwd.size()); +#elif defined __unix__ +#elif defined __APPLE__ +#endif + luax_setfieldstring(L, "cwd", (char*)&cwd); + luax_clear(L); + + /* boot jin and run it */ + boot(L); + + luax_close(L); + + return 0; +}
\ No newline at end of file diff --git a/src/lua/modules/audio/audio.cpp b/src/lua/modules/audio/audio.cpp index 8e11b88..198323d 100644 --- a/src/lua/modules/audio/audio.cpp +++ b/src/lua/modules/audio/audio.cpp @@ -3,108 +3,121 @@ #include "lua/common/common.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ + namespace Lua + { - using namespace jin::audio; - using namespace jin::filesystem; + using namespace JinEngine::Audio; + using namespace JinEngine::Filesystem; - typedef SDLAudio Audio; - typedef SDLSource Source; + typedef SDLAudio Audio; + typedef SDLSource Source; - static int l_init(lua_State* L) - { - Audio::Setting setting; - setting.samplerate = 44100; - setting.samples = 44100; - if (!Audio::get()->init(&setting)) + static int l_init(lua_State* L) { - luax_error(L, "could not init audio"); - luax_pushboolean(L, false); + Audio::Setting setting; + setting.samplerate = 44100; + setting.samples = 44100; + if (!Audio::get()->init(&setting)) + { + luax_error(L, "could not init audio"); + luax_pushboolean(L, false); + return 1; + } + luax_pushboolean(L, true); return 1; } - luax_pushboolean(L, true); - return 1; - } - - static int l_play(lua_State* L) - { - Audio::get()->play(); - return 0; - } - - static int l_stop(lua_State* L) - { - Audio::get()->stop(); - return 0; - } - - static int l_pause(lua_State* L) - { - Audio::get()->pause(); - return 0; - } - - static int l_resume(lua_State* L) - { - Audio::get()->resume(); - return 0; - } - - static int l_setVolume(lua_State* L) - { - float volume = luax_checknumber(L, 1); - Audio::get()->setVolume(volume); - return 0; - } - - static int l_newSource(lua_State* L) - { - Filesystem* fs = Filesystem::get(); - const char* f = luax_checkstring(L, 1); - if (!fs->exists(f)) + + static int l_play(lua_State* L) + { + Audio::get()->play(); + return 0; + } + + static int l_stop(lua_State* L) + { + Audio::get()->stop(); + return 0; + } + + static int l_pause(lua_State* L) + { + Audio::get()->pause(); + return 0; + } + + static int l_resume(lua_State* L) + { + Audio::get()->resume(); + return 0; + } + + static int l_setVolume(lua_State* L) + { + float volume = luax_checknumber(L, 1); + Audio::get()->setVolume(volume); + return 0; + } + + static int l_newSource(lua_State* L) { - printf("Error: no such image %s\n", f); - exit(1); + AssetDatabase* fs = AssetDatabase::get(); + const char* f = luax_checkstring(L, 1); + Buffer b; + if (!fs->exists(f)) + { + error(L, "No such image %s", f); + goto fail; + } + if (!fs->read(f, b)) + { + error(L, "Failed to read source file %s", f); + goto fail; + } + Source* src = Source::createSource((void*)&b, b.size()); + if (src == nullptr) + { + error(L, "Failed to decode source file %s", f); + goto fail; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_AUDIO_SOURCE, sizeof(Proxy)); + proxy->bind(new Ref<Source>(src, JIN_AUDIO_SOURCE)); + return 1; + fail: + luax_pushnil(L); + return 1; } - Buffer b; - fs->read(f, &b); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_AUDIO_SOURCE, sizeof(Proxy)); - Source* src = Source::createSource(b.data, b.size); - proxy->bind(new Ref<Source>(src, JIN_AUDIO_SOURCE)); - return 1; - } - static int l_destroy(lua_State* L) - { - Audio* audio = Audio::get(); - audio->quit(); - return 0; - } - - static const luaL_Reg f[] = { - { "init", l_init }, - { "play", l_play }, - { "stop", l_stop }, - { "pause", l_pause }, - { "resume", l_resume }, - { "setVolume", l_setVolume }, - { "newSource", l_newSource }, - { "destroy", l_destroy }, - { 0, 0 } - }; - - extern int luaopen_Source(lua_State* L); - - int luaopen_audio(lua_State* L) - { - luaopen_Source(L); - - luax_newlib(L, f); - - return 1; - } -} -}
\ No newline at end of file + static int l_destroy(lua_State* L) + { + Audio* audio = Audio::get(); + audio->quit(); + return 0; + } + + static const luaL_Reg f[] = { + { "init", l_init }, + { "play", l_play }, + { "stop", l_stop }, + { "pause", l_pause }, + { "resume", l_resume }, + { "setVolume", l_setVolume }, + { "newSource", l_newSource }, + { "destroy", l_destroy }, + { 0, 0 } + }; + + extern int luaopen_Source(lua_State* L); + + int luaopen_audio(lua_State* L) + { + luaopen_Source(L); + + luax_newlib(L, f); + + return 1; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/audio/source.cpp b/src/lua/modules/audio/source.cpp index 1953121..bf43ceb 100644 --- a/src/lua/modules/audio/source.cpp +++ b/src/lua/modules/audio/source.cpp @@ -3,114 +3,114 @@ #include "lua/common/common.h" #include "lua/modules/types.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - using namespace jin::audio; - - typedef Ref<Source>& SourceRef; - - static inline SourceRef checkSource(lua_State* L) + namespace Lua { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); - return proxy->getRef<Source>(); - } - static int l_play(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->play(); - return 0; - } - - static int l_stop(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->stop(); - return 0; - } - - static int l_pause(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->pause(); - return 0; - } - - static int l_rewind(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->rewind(); - return 0; - } - - static int l_resume(lua_State* L) - { - SourceRef ref = checkSource(L); - ref->resume(); - return 0; - } - - static int l_isStop(lua_State* L) - { - SourceRef ref = checkSource(L); - bool isStop = ref->isStopped(); - luax_pushboolean(L, isStop); - return 1; - } - - static int l_isPaused(lua_State* L) - { - SourceRef ref = checkSource(L); - bool isPaused = ref->isPaused(); - luax_pushboolean(L, isPaused); - return 1; - } - - static int l_setVolume(lua_State* L) - { - SourceRef ref = checkSource(L); - float volume = luax_checknumber(L, 2); - ref->setVolume(volume); - return 0; - } - - static int l_setLoop(lua_State* L) - { - SourceRef ref = checkSource(L); - bool loop = luax_checkbool(L, 2); - ref->setLoop(loop); - return 0; - } - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); - proxy->release(); - return 0; - } - - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "play", l_play }, - { "stop", l_stop }, - { "pause", l_pause }, - { "resume", l_resume }, - { "rewind", l_rewind }, - { "isStop", l_isStop }, - { "isPaused", l_isPaused }, - { "setVolume", l_setVolume }, - { "setLoop", l_setLoop }, - { 0, 0 } - }; + using namespace JinEngine::Audio; + + typedef Ref<Source>& SourceRef; + + static inline SourceRef checkSource(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); + return proxy->getRef<Source>(); + } + + static int l_play(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->play(); + return 0; + } + + static int l_stop(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->stop(); + return 0; + } + + static int l_pause(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->pause(); + return 0; + } + + static int l_rewind(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->rewind(); + return 0; + } + + static int l_resume(lua_State* L) + { + SourceRef ref = checkSource(L); + ref->resume(); + return 0; + } + + static int l_isStop(lua_State* L) + { + SourceRef ref = checkSource(L); + bool isStop = ref->isStopped(); + luax_pushboolean(L, isStop); + return 1; + } + + static int l_isPaused(lua_State* L) + { + SourceRef ref = checkSource(L); + bool isPaused = ref->isPaused(); + luax_pushboolean(L, isPaused); + return 1; + } + + static int l_setVolume(lua_State* L) + { + SourceRef ref = checkSource(L); + float volume = luax_checknumber(L, 2); + ref->setVolume(volume); + return 0; + } + + static int l_setLoop(lua_State* L) + { + SourceRef ref = checkSource(L); + bool loop = luax_checkbool(L, 2); + ref->setLoop(loop); + return 0; + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE); + proxy->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "play", l_play }, + { "stop", l_stop }, + { "pause", l_pause }, + { "resume", l_resume }, + { "rewind", l_rewind }, + { "isStop", l_isStop }, + { "isPaused", l_isPaused }, + { "setVolume", l_setVolume }, + { "setLoop", l_setLoop }, + { 0, 0 } + }; - int luaopen_Source(lua_State* L) - { - luax_newtype(L, JIN_AUDIO_SOURCE, f); - return 0; - } - -} // lua -} // jin
\ No newline at end of file + int luaopen_Source(lua_State* L) + { + luax_newtype(L, JIN_AUDIO_SOURCE, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/bit/bit.cpp b/src/lua/modules/bit/bit.cpp index 5b18125..cedd60a 100644 --- a/src/lua/modules/bit/bit.cpp +++ b/src/lua/modules/bit/bit.cpp @@ -2,83 +2,83 @@ #include "libjin/jin.h" #include <cstdlib> -namespace jin +namespace JinEngine { -namespace lua -{ - - static int l_and(lua_State* L) + namespace Lua { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a & b); - return 1; - } - static int l_or(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a | b); - return 1; - } + static int l_and(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a & b); + return 1; + } - static int l_xor(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a ^ b); - return 1; - } + static int l_or(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a | b); + return 1; + } - static int l_not(lua_State* L) - { - int n = luax_checkinteger(L, 1); - luax_pushinteger(L, ~n); - return 1; - } + static int l_xor(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a ^ b); + return 1; + } - static int l_lshift(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a << b); - return 1; - } + static int l_not(lua_State* L) + { + int n = luax_checkinteger(L, 1); + luax_pushinteger(L, ~n); + return 1; + } - static int l_rshift(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushinteger(L, a >> b); - return 1; - } + static int l_lshift(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a << b); + return 1; + } - static int l_include(lua_State* L) - { - int a = luax_checkinteger(L, 1); - int b = luax_checkinteger(L, 2); - luax_pushboolean(L, (a & b) == b); - return 1; - } + static int l_rshift(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushinteger(L, a >> b); + return 1; + } - static const luaL_Reg f[] = { - { "bAnd", l_and }, - { "bOr" , l_or }, - { "bXor", l_xor }, - { "bNot", l_not }, - { "bLs", l_lshift }, - { "bRs", l_rshift }, - { "bInc", l_include }, - { 0, 0 } - }; + static int l_include(lua_State* L) + { + int a = luax_checkinteger(L, 1); + int b = luax_checkinteger(L, 2); + luax_pushboolean(L, (a & b) == b); + return 1; + } - int luaopen_bit(lua_State* L) - { - luax_newlib(L, f); + static const luaL_Reg f[] = { + { "bAnd", l_and }, + { "bOr" , l_or }, + { "bXor", l_xor }, + { "bNot", l_not }, + { "bLs", l_lshift }, + { "bRs", l_rshift }, + { "bInc", l_include }, + { 0, 0 } + }; + + int luaopen_bit(lua_State* L) + { + luax_newlib(L, f); - return 1; - } + return 1; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/core/core.cpp b/src/lua/modules/core/core.cpp index 0243554..a576bec 100644 --- a/src/lua/modules/core/core.cpp +++ b/src/lua/modules/core/core.cpp @@ -1,44 +1,46 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ - using namespace jin::core; - - static int l_running(lua_State* L) + namespace Lua { - static Game* game = Game::get(); - bool running = game->running(); - luax_pushboolean(L, running); - return 1; - } - static int l_stop(lua_State* L) - { - Game::get()->stop(); - return 0; - } + using namespace JinEngine::Core; - static int l_quit(lua_State* L) - { - Game::get()->quit(); - return 0; - } - - static const luaL_Reg f[] = { - {"running", l_running }, - {"stop", l_stop }, - {"quit", l_quit }, - {0, 0 } - }; - - int luaopen_core(lua_State* L) - { - luax_newlib(L, f); + static int l_running(lua_State* L) + { + static Game* game = Game::get(); + bool running = game->running(); + luax_pushboolean(L, running); + return 1; + } + + static int l_stop(lua_State* L) + { + Game::get()->stop(); + return 0; + } + + static int l_quit(lua_State* L) + { + Game::get()->quit(); + return 0; + } + + static const luaL_Reg f[] = { + { "running", l_running }, + { "stop", l_stop }, + { "quit", l_quit }, + { 0, 0 } + }; + + int luaopen_core(lua_State* L) + { + luax_newlib(L, f); + + return 1; + } - return 1; - } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/embed/graphics.lua.h b/src/lua/modules/embed/graphics.lua.h deleted file mode 100644 index 1414efc..0000000 --- a/src/lua/modules/embed/graphics.lua.h +++ /dev/null @@ -1,4 +0,0 @@ -/* graphics.lua */ -static const char* graphics_lua = R"( -jin.graphics = jin.graphics or {} -)"; diff --git a/src/lua/modules/event/event.cpp b/src/lua/modules/event/event.cpp index af9f8fc..9f565d0 100644 --- a/src/lua/modules/event/event.cpp +++ b/src/lua/modules/event/event.cpp @@ -4,103 +4,127 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::input; + using namespace JinEngine; + using namespace JinEngine::Input; - /** - * Load event poll, return a iterator(a table). - */ - static int l_event_poll(lua_State *L) - { - // table to store events - luax_newtable(L); - static Event e; - int i = 1; - poll: - while (pollEvent(&e)) + /** + * Load event poll, return a iterator(a table). + */ + static int l_event_poll(lua_State *L) { - // each event is a table + /* table to store events */ luax_newtable(L); - switch (e.type) + static Event e; + int i = 1; + poll: + while (pollEvent(&e)) { - case EventType::QUIT: - luax_setfield_string(L, "type", "quit"); - break; + /** + * TODO: ڴСıʱҪtransform + * + */ + luax_newtable(L); + switch (e.type) + { + case EventType::QUIT: + luax_setfieldstring(L, "type", "Quit"); + break; - case EventType::KEY_DOWN: - luax_setfield_string(L, "type", "keydown"); - luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym)); - break; - - case EventType::KEY_UP: - luax_setfield_string(L, "type", "keyup"); - luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym)); - break; + case EventType::KEY_DOWN: + case EventType::KEY_UP: + luax_setfieldstring(L, "type", e.type == EventType::KEY_DOWN ? "KeyDown" : "KeyUp"); + luax_setfieldstring(L, "key", getKeyName(e.key.keysym.sym)); + break; - case EventType::MOUSE_MOTION: - luax_setfield_string(L, "type", "mousemotion"); - luax_setfield_number(L, "x", e.motion.x); - luax_setfield_number(L, "y", e.motion.y); - break; + case EventType::MOUSE_MOTION: + luax_setfieldstring(L, "type", "MouseMotion"); + luax_setfieldnumber(L, "x", e.motion.x); + luax_setfieldnumber(L, "y", e.motion.y); + break; - case EventType::MOUSE_BUTTON_DOWN: - luax_setfield_string(L, "type", "mousebuttondown"); - luax_setfield_string(L, "button", getButtonName(e.button.button)); - luax_setfield_number(L, "x", e.button.x); - luax_setfield_number(L, "y", e.button.y); - break; + case EventType::MOUSE_BUTTON_DOWN: + case EventType::MOUSE_BUTTON_UP: + luax_setfieldstring(L, "type", e.type == EventType::MOUSE_BUTTON_DOWN ? "MouseButtonDown" : "MouseButtonUp"); + luax_setfieldstring(L, "button", getButtonName(e.button.button)); + luax_setfieldnumber(L, "x", e.button.x); + luax_setfieldnumber(L, "y", e.button.y); + break; - case EventType::MOUSE_BUTTON_UP: - luax_setfield_string(L, "type", "mousebuttonup"); - luax_setfield_string(L, "button", getButtonName(e.button.button)); - luax_setfield_number(L, "x", e.button.x); - luax_setfield_number(L, "y", e.button.y); - break; + case EventType::MOUSE_WHEEL: + luax_setfieldstring(L, "type", "Wheel"); + if(e.wheel.x == -1) + luax_setfieldstring(L, "x", "Left"); + else if(e.wheel.x == 1) + luax_setfieldstring(L, "x", "Right"); + else + luax_setfieldstring(L, "x", "None"); + if (e.wheel.y == -1) + luax_setfieldstring(L, "y", "Near"); + else if (e.wheel.y == 1) + luax_setfieldstring(L, "y", "Far"); + else + luax_setfieldstring(L, "y", "None"); + break; - case EventType::MOUSE_WHEEL: - luax_setfield_string(L, "type", "wheel"); - if(e.wheel.x == -1) - luax_setfield_string(L, "x", "left"); - else if(e.wheel.x == 1) - luax_setfield_string(L, "x", "right"); - else - luax_setfield_string(L, "x", "none"); - if (e.wheel.y == -1) - luax_setfield_string(L, "y", "near"); - else if (e.wheel.y == 1) - luax_setfield_string(L, "y", "far"); - else - luax_setfield_string(L, "y", "none"); - break; - - default: - /* ignore other events */ - luax_pop(L, 1); // pop table out - goto poll; - break; + case EventType::JOYBUTTONDOWN: + case EventType::JOYBUTTONUP: + luax_setfieldstring(L, "type", e.type == EventType::JOYBUTTONDOWN ? "JoyButtonDown" : "JoyButtonUp"); + luax_setfieldinteger(L, "which", e.jbutton.which); + luax_setfieldstring(L, "button", Input::getJoyButtonName(e.jbutton.button)); + break; + + case EventType::JOYAXISMOTION: + luax_setfieldstring(L, "type", "JoyAxisMotion"); + luax_setfieldinteger(L, "which", e.jaxis.which); + luax_setfieldfstring(L, "axis", Input::getJoyAxisName(e.jaxis.axis)); + break; + + case EventType::JOYBALLMOTION: + case EventType::JOYHATMOTION: + + case EventType::JOYDEVICEADDED: + case EventType::JOYDEVICEREMOVED: + luax_setfieldfstring(L, "type", e.type == EventType::JOYDEVICEADDED ? "JoyDeviceAdded" : "JoyDeviceRemoved"); + luax_setfieldinteger(L, "which", e.jdevice.which); + break; + + //https://stackoverflow.com/questions/50022316/what-is-sdl-joystick-and-what-is-sdl-gamecontroller-what-are-the-relationships + case EventType::CONTROLLERBUTTONDOWN: + case EventType::CONTROLLERBUTTONUP: + + + case EventType::CONTROLLERAXISMOTION: + + + default: + /* ignore other events */ + luax_pop(L, 1); // pop table out + goto poll; + break; + } + luax_rawseti(L, -2, i++); } - luax_rawseti(L, -2, i++); + return 1; } - return 1; - } - static const luaL_Reg f[] = { - { "poll", l_event_poll }, - { 0, 0 } - }; + static const luaL_Reg f[] = { + { "poll", l_event_poll }, + { 0, 0 } + }; - /** - * load event module - */ - int luaopen_event(lua_State* L) - { - luax_newlib(L, f); - return 1; - } + /** + * load event module + */ + int luaopen_event(lua_State* L) + { + luax_newlib(L, f); + return 1; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/filesystem/filesystem.cpp b/src/lua/modules/filesystem/filesystem.cpp index 55f4c06..7466ce8 100644 --- a/src/lua/modules/filesystem/filesystem.cpp +++ b/src/lua/modules/filesystem/filesystem.cpp @@ -2,136 +2,139 @@ #include "libjin/jin.h" #include <string> -using namespace jin::filesystem; +using namespace JinEngine::Filesystem; -namespace jin +namespace JinEngine { -namespace lua -{ - - static struct + namespace Lua { - Filesystem* fs; - } context; - static int l_init(lua_State* L) - { - context.fs = Filesystem::get(); - return 0; - } - - /** - * set current game root, like - * C:/jin/games/tank/ - */ - static int l_mount(lua_State* L) - { - const char* path = luax_checkstring(L, 1); - context.fs->mount(path); - return 0; - } - - /** - * - */ - static int l_isDir(lua_State *L) - { - const char* path = luax_checkstring(L, 1); - int r = context.fs->isDir(path); - luax_pushboolean(L, r); - return 1; - } - - /** - * - */ - static int l_exist(lua_State * L) - { - const char* path = luax_checkstring(L, 1); - int r = context.fs->exists(path); - luax_pushboolean(L, r); - return 1; - } + static struct + { + AssetDatabase* fs; + } context; - static int l_isdir(lua_State* L) - { - const char* path = luax_checkstring(L, 1); - int r = context.fs->isDir(path); - luax_pushboolean(L, r); - return 1; - } - - // load but dont run it - static int loadf(lua_State* L) - { - const char* filename = lua_tostring(L, -1); - Buffer bf; - context.fs->read(filename, &bf); - luax_loadbuffer(L, (const char*)bf.data, bf.size, filename); - return 1; - } - - static int loader(lua_State* L) - { - const char * filename = lua_tostring(L, -1); + static int l_init(lua_State* L) + { + context.fs = AssetDatabase::get(); + return 0; + } - std::string tmp(filename); - tmp += ".lua"; + static int l_mount(lua_State* L) + { + const char* path = luax_checkstring(L, 1); + context.fs->mount(path); + return 0; + } - int size = tmp.size(); + static int l_exist(lua_State * L) + { + const char* path = luax_checkstring(L, 1); + int r = context.fs->exists(path); + luax_pushboolean(L, r); + return 1; + } - for (int i = 0; i<size - 4; ++i) + static int l_isDir(lua_State* L) { - if (tmp[i] == '.') - { - tmp[i] = '/'; - } + const char* path = luax_checkstring(L, 1); + int r = context.fs->isDir(path); + luax_pushboolean(L, r); + return 1; } - if (context.fs->exists(tmp.c_str())) + static int l_isFile(lua_State* L) { - lua_pop(L, 1); - lua_pushstring(L, tmp.c_str()); - return loadf(L); + const char* path = luax_checkstring(L, 1); + int r = context.fs->isFile(path); + luax_pushboolean(L, r); + return 1; } - tmp = filename; - size = tmp.size(); - for (int i = 0; i<size; ++i) + static int loadbuffer(lua_State* L) { - if (tmp[i] == '.') - tmp[i] = '/'; + const char* filename = lua_tostring(L, -1); + Buffer bf; + context.fs->read(filename, bf); + luax_loadbuffer(L, (const char*)&bf, bf.size(), filename); + return 1; } - if (context.fs->isDir(tmp.c_str())) + static int loader(lua_State* L) { - tmp += "/init.lua"; + const char * filename = lua_tostring(L, -1); + + std::string tmp(filename); + tmp += ".lua"; + + int size = tmp.size(); + + for (int i = 0; i<size - 4; ++i) + { + if (tmp[i] == '.') + { + tmp[i] = '/'; + } + } + if (context.fs->exists(tmp.c_str())) { lua_pop(L, 1); lua_pushstring(L, tmp.c_str()); - return loadf(L); + return loadbuffer(L); + } + + tmp = filename; + size = tmp.size(); + for (int i = 0; i<size; ++i) + { + if (tmp[i] == '.') + tmp[i] = '/'; } - } - lua_pushfstring(L, "\n\tno file \"%s\" in jin game directories.\n", (tmp + ".lua").c_str()); - return 1; - } + if (context.fs->isDir(tmp.c_str())) + { + tmp += "/init.lua"; + if (context.fs->exists(tmp.c_str())) + { + lua_pop(L, 1); + lua_pushstring(L, tmp.c_str()); + return loadbuffer(L); + } + } - static const luaL_Reg f[] = { - { "init", l_init }, - { "mount", l_mount }, - { "isdir", l_isDir }, - { "exist", l_exist }, - { 0, 0 } - }; + lua_pushfstring(L, "\n\tno file \"%s\" in jin game directories.\n", (tmp + ".lua").c_str()); + return 1; + } - int luaopen_filesystem(lua_State* L) - { - luax_newlib(L, f); - luax_register_searcher(L, loader, 1); - return 0; - } + static int l_read(lua_State* L) + { + AssetDatabase* fs = context.fs; + const char* file = luax_checkstring(L, 1); + unsigned int len; + Buffer buffer; + fs->read(file, buffer); + luax_pushstring(L, (char*)&buffer); + luax_pushinteger(L, buffer.size()); + return 2; + } + + static const luaL_Reg f[] = { + { "init", l_init }, + { "mount", l_mount }, + { "isDirectory", l_isDir }, + { "isFile", l_isFile }, + { "exist", l_exist }, + { "read", l_read }, + { 0, 0 } + }; + + int luaopen_filesystem(lua_State* L) + { + luax_newlib(L, f); + luax_registersearcher(L, loader, 1); + return 0; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/bitmap.cpp b/src/lua/modules/graphics/bitmap.cpp new file mode 100644 index 0000000..13517f9 --- /dev/null +++ b/src/lua/modules/graphics/bitmap.cpp @@ -0,0 +1,113 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Bitmap>& BitmapRef; + + static inline BitmapRef checkBitmap(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP); + return proxy->getRef<Bitmap>(); + } + + static int l_gc(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + ref.release(); + return 0; + } + + static int l_getWidth(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int w = ref->getWidth(); + luax_pushinteger(L, w); + return 1; + } + + static int l_getHeight(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int h = ref->getHeight(); + luax_pushinteger(L, h); + return 1; + } + + static int l_getSize(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int w = ref->getWidth(); + int h = ref->getHeight(); + luax_pushinteger(L, w); + luax_pushinteger(L, h); + return 2; + } + + static int l_getPixel(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int x = luax_checkinteger(L, 2); + int y = luax_checkinteger(L, 3); + Color col = ref->getPixel(x, y); + luax_pushinteger(L, col.r); + luax_pushinteger(L, col.g); + luax_pushinteger(L, col.b); + luax_pushinteger(L, col.a); + return 4; + } + + static int l_setPixel(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + int x = luax_checkinteger(L, 2); + int y = luax_checkinteger(L, 3); + if (!luax_istable(L, 4)) + { + luax_typerror(L, 4, "table"); + return 1; + } + unsigned int r = luax_rawgetnumber(L, 4, 1); + unsigned int g = luax_rawgetnumber(L, 4, 2); + unsigned int b = luax_rawgetnumber(L, 4, 3); + unsigned int a = luax_rawgetnumber(L, 4, 4); + ref->setPixel(Color(r, g, b, a), x, y); + return 0; + } + + static int l_clone(lua_State* L) + { + BitmapRef ref = checkBitmap(L); + Bitmap* bitmap = ref.getObject(); + Bitmap* b = Bitmap::clone(bitmap); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_BITMAP, sizeof(Proxy)); + proxy->bind(new Ref<Bitmap>(b, JIN_GRAPHICS_BITMAP)); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "getSize", l_getSize }, + { "getPixel", l_getPixel }, + { "setPixel", l_setPixel }, + { "clone", l_clone }, + { 0, 0 } + }; + + int luaopen_Bitmap(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_BITMAP, f); + return 0; + } + + } // graphics +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/canvas.cpp b/src/lua/modules/graphics/canvas.cpp index f42dfba..e49e209 100644 --- a/src/lua/modules/graphics/canvas.cpp +++ b/src/lua/modules/graphics/canvas.cpp @@ -3,73 +3,63 @@ #include "lua/common/common.h" #include "libjin/jin.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::graphics; + using namespace JinEngine::Graphics; - typedef Ref<Canvas>& CanvasRef; + typedef Ref<Canvas>& CanvasRef; - static inline CanvasRef checkCanvas(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); - return proxy->getRef<Canvas>(); - } - - static int l_getWidth(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - luax_pushnumber(L, ref->getWidth()); - return 1; - } + static inline CanvasRef checkCanvas(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); + return proxy->getRef<Canvas>(); + } - static int l_getHeight(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - luax_pushnumber(L, ref->getHeight()); - return 1; - } + static int l_getWidth(lua_State* L) + { + CanvasRef ref = checkCanvas(L); + luax_pushnumber(L, ref->getWidth()); + return 1; + } - static int l_getSize(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - luax_pushnumber(L, ref->getWidth()); - luax_pushnumber(L, ref->getHeight()); - return 2; - } + static int l_getHeight(lua_State* L) + { + CanvasRef ref = checkCanvas(L); + luax_pushnumber(L, ref->getHeight()); + return 1; + } - static int l_setAnchor(lua_State* L) - { - CanvasRef ref = checkCanvas(L); - int x = luax_checknumber(L, 1); - int y = luax_checknumber(L, 2); - ref->setAnchor(x, y); - return 0; - } + static int l_getSize(lua_State* L) + { + CanvasRef ref = checkCanvas(L); + luax_pushnumber(L, ref->getWidth()); + luax_pushnumber(L, ref->getHeight()); + return 2; + } - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); - proxy->release(); - return 0; - } + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); + proxy->release(); + return 0; + } - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "getWidth", l_getWidth }, - { "getHeight", l_getHeight }, - { "getSize", l_getSize }, - { "setAnchor", l_setAnchor }, - { 0, 0 } - }; + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "getSize", l_getSize }, + { 0, 0 } + }; - int luaopen_Canvas(lua_State* L) - { - luax_newtype(L, JIN_GRAPHICS_CANVAS, f); - return 0; - } + int luaopen_Canvas(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_CANVAS, f); + return 0; + } -}// lua -}// jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/font.cpp b/src/lua/modules/graphics/font.cpp deleted file mode 100644 index 926f2cc..0000000 --- a/src/lua/modules/graphics/font.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "lua/modules/luax.h" -#include "lua/modules/types.h" -#include "lua/common/common.h" -#include "libjin/jin.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::graphics; - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_FONT); - proxy->release(); - return 0; - } - - static int l_box(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_FONT, sizeof(Proxy)); - Ref<Font>& ref = proxy->getRef<Font>(); - const char* text = luax_checkstring(L, 2); - int fheight = luax_checknumber(L, 3); - int spacing = luax_checknumber(L, 4); - int lheight = luax_checknumber(L, 5); - int w, h; - ref->box(text, fheight, lheight, spacing, &w, &h); - luax_pushnumber(L, w); - luax_pushnumber(L, h); - return 2; - } - - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "box", l_box }, - { 0, 0 } - }; - - int luaopen_Font(lua_State* L) - { - luax_newtype(L, JIN_GRAPHICS_FONT, f); - - return 0; - } - -} // lua -} // jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/graphics.cpp b/src/lua/modules/graphics/graphics.cpp index 9c1d404..8b2d7cd 100644 --- a/src/lua/modules/graphics/graphics.cpp +++ b/src/lua/modules/graphics/graphics.cpp @@ -1,516 +1,819 @@ +#include <iostream> +#include <fstream> + +#include "libjin/jin.h" #include "lua/modules/luax.h" #include "lua/modules/types.h" -#include "libjin/jin.h" #include "lua/common/common.h" -#include "lua/modules/embed/graphics.lua.h" -namespace jin -{ -namespace lua -{ - using namespace jin::graphics; - using jin::filesystem::Filesystem; - using jin::filesystem::Buffer; - - typedef Texture Image; +using namespace std; +using namespace JinEngine; +using namespace JinEngine::Graphics; +using JinEngine::Filesystem::AssetDatabase; +using JinEngine::Filesystem::Buffer; - static struct +namespace JinEngine +{ + namespace Lua { - color curRenderColor; - color curClearColor; - Font* curFont = nullptr; - Font* defaultFont = nullptr; - } context; - static int l_init(lua_State* L) - { - Window* wnd = Window::get(); - Window::Setting setting; - setting.width = luax_getfield_integer(L, 1, "width"); - setting.height = luax_getfield_integer(L, 1, "height"); - setting.title = luax_getfield_string(L, 1, "title"); - setting.vsync = luax_getfield_bool(L, 1, "vsync"); - setting.fullscreen = luax_getfield_bool(L, 1, "fullscreen"); - setting.resizable= luax_getfield_bool(L, 1, "resizable"); - if (!wnd->init(&setting)) - { - luax_pushboolean(L, false); - return 1; - } - luax_pushboolean(L, true); - return 1; - } +#include "../../resources/font.ttf.h" - static int l_destroy(lua_State* L) - { - Window* wnd = Window::get(); - wnd->quit(); - return 0; - } - - static int l_getSize(lua_State* L) - { - Window* wnd = Window::get(); - luax_pushnumber(L, wnd->getW()); - luax_pushnumber(L, wnd->getH()); - return 2; - } + static struct + { + Color curRenderColor; + Color curClearColor; + Font* curFont = nullptr; + Font* defaultFont = nullptr; + } context; - static int l_getWidth(lua_State* L) - { - Window* wnd = Window::get(); - luax_pushnumber(L, wnd->getW()); - return 1; - } + static int l_init(lua_State* L) + { + Window* wnd = Window::get(); + Window::Setting setting; + setting.width = luax_getfieldinteger(L, 1, "width"); + setting.height = luax_getfieldinteger(L, 1, "height"); + setting.title = luax_getfieldstring(L, 1, "title"); + setting.vsync = luax_getfieldbool(L, 1, "vsync"); + setting.fullscreen = luax_getfieldbool(L, 1, "fullscreen"); + setting.resizable = luax_getfieldbool(L, 1, "resizable"); + if (!wnd->init(&setting)) + { + luax_pushboolean(L, false); + return 1; + } + { + /* load default font */ + Bitmap* bitmap = Bitmap::createBitmap(default_font_bitmap, sizeof(default_font_bitmap)); + const Color* pixels = bitmap->getPixels(); + ofstream f = ofstream(); + f.open("font.pixels", ios_base::app); + for (int y = 0; y < bitmap->getHeight(); ++y) + { + for (int x = 0; x < bitmap->getWidth(); ++x) + { + Color c = pixels[x + y * bitmap->getWidth()]; + f << (int)c.r << ","; + f << (int)c.g << ","; + f << (int)c.b << ","; + f << (int)c.a << ","; + } + } + + TextureFont* tf = TextureFont::createTextureFont(bitmap, Text(Encode::UTF8, default_charset), default_font_split, bitmap->getHeight()); + context.defaultFont = tf; + delete bitmap; + } + context.curFont = context.defaultFont; - static int l_getHeight(lua_State* L) - { - Window* wnd = Window::get(); - luax_pushnumber(L, wnd->getH()); - return 1; - } + luax_pushboolean(L, true); + return 1; + } - static int l_newImage(lua_State* L) - { - Filesystem* fs = Filesystem::get(); - const char* f = luax_checkstring(L, 1); - if (!fs->exists(f)) + static int l_setTitle(lua_State* L) { - printf("Error: no such image %s\n", f); - exit(1); + Window* wnd = Window::get(); + const char* title = luax_checkstring(L, 1); + wnd->setTitle(title); + return 0; } - Buffer b; - fs->read(f, &b); - - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_IMAGE, sizeof(Proxy)); - Image* img = Image::createTexture(b.data, b.size); - proxy->bind(new Ref<Image>(img, JIN_GRAPHICS_IMAGE)); - return 1; - } - static int l_newShader(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy)); - const char* program = luax_checkstring(L, 1); - JSLProgram* jsl = JSLProgram::createJSLProgram(program); - proxy->bind(new Ref<JSLProgram>(jsl, JIN_GRAPHICS_SHADER)); - return 1; - } - - static int l_newCanvas(lua_State* L) - { - int w = luax_checknumber(L, 1); - int h = luax_checknumber(L, 2); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_CANVAS, sizeof(Proxy)); - Canvas* cvs = Canvas::createCanvas(w, h); - proxy->bind(new Ref<Canvas>(cvs, JIN_GRAPHICS_CANVAS)); - return 1; - } - - static int l_clear(lua_State* L) - { - if (luax_gettop(L) == 0) - { - glClearColor(0, 0, 0, 1); - } - else - { - int r = luax_checknumber(L, 1); - int g = luax_checknumber(L, 2); - int b = luax_checknumber(L, 3); - int a = luax_checknumber(L, 4); - glClearColor(r / 255.f, g / 255.f, b / 255.f, a / 255.f); - } - glClear(GL_COLOR_BUFFER_BIT); - return 0; - } - - static int l_setClearColor(lua_State* L) - { - if (luax_gettop(L) == 0) - { - glClearColor(1, 1, 1, 1); - return 0; - } - - context.curClearColor.rgba.r = luax_checknumber(L, 1); - context.curClearColor.rgba.g = luax_checknumber(L, 2); - context.curClearColor.rgba.b = luax_checknumber(L, 3); - context.curClearColor.rgba.a = luax_checknumber(L, 4); - - glClearColor(context.curClearColor.rgba.r / 255.f, - context.curClearColor.rgba.g / 255.f, - context.curClearColor.rgba.b / 255.f, - context.curClearColor.rgba.a / 255.f); - return 0; - } - - static int l_present(lua_State* L) - { - Window::get()->swapBuffers(); - return 0; - } + static int l_destroy(lua_State* L) + { + Window* wnd = Window::get(); + wnd->quit(); + return 0; + } - static int l_draw(lua_State* L) - { - int x = luax_optnumber(L, 2, 0); - int y = luax_optnumber(L, 3, 0); - float sx = luax_optnumber(L, 4, 1); - float sy = luax_optnumber(L, 5, 1); - float r = luax_optnumber(L, 6, 0); - if (luax_istype(L, 1, JIN_GRAPHICS_IMAGE)) + static int l_getSize(lua_State* L) { - Proxy* proxy = (Proxy*)luax_toudata(L, 1); - Ref<Image>& tex = proxy->getRef<Image>(); - tex->draw(x, y, sx, sy, r); + Window* wnd = Window::get(); + luax_pushnumber(L, wnd->getW()); + luax_pushnumber(L, wnd->getH()); + return 2; } - else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + + static int l_getWidth(lua_State* L) { - Proxy* proxy = (Proxy*)luax_toudata(L, 1); - Ref<Canvas>& p = proxy->getRef<Canvas>(); - p->draw(x, y, sx, sy, r); + Window* wnd = Window::get(); + luax_pushnumber(L, wnd->getW()); + return 1; } - else + + static int l_getHeight(lua_State* L) { - /* wrong type */ - luax_typerror(L, 1, "image or canvas"); + Window* wnd = Window::get(); + luax_pushnumber(L, wnd->getH()); + return 1; } - return 0; - } - static int l_setColor(lua_State* L) - { - if (luax_gettop(L) == 0) + static int l_newBitmap(lua_State* L) { - glColor4f(1, 1, 1, 1); - return 0; + Bitmap* bitmap = nullptr; + if (luax_gettop(L) == 2) + { + int w = luax_checkinteger(L, 1); + int h = luax_checkinteger(L, 2); + bitmap = Bitmap::createBitmap(w, h); + } + else if (luax_gettop(L) == 3) + { + int w = luax_checkinteger(L, 1); + int h = luax_checkinteger(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + unsigned int r = luax_rawgetnumber(L, 3, 1); + unsigned int g = luax_rawgetnumber(L, 3, 2); + unsigned int b = luax_rawgetnumber(L, 3, 3); + unsigned int a = luax_rawgetnumber(L, 3, 4); + bitmap = Bitmap::createBitmap(w, h, Color(r, g, b, a)); + } + else + { + const char* f = luax_checkstring(L, 1); + AssetDatabase* fs = AssetDatabase::get(); + if (!fs->exists(f)) + { + error(L, "No such image file %s", f); + goto fail; + } + Buffer b; + if (!fs->read(f, b)) + { + error(L, "Failed to read image %s", f); + goto fail; + } + bitmap = Bitmap::createBitmap(&b, b.size()); + if (bitmap == nullptr) + { + error(L, "Failed to decode image file %s", f); + goto fail; + } + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_BITMAP, sizeof(Proxy)); + proxy->bind(new Ref<Bitmap>(bitmap, JIN_GRAPHICS_BITMAP)); + return 1; + fail: + luax_pushnil(L); + return 1; } - context.curRenderColor.rgba.r = luax_checknumber(L, 1); - context.curRenderColor.rgba.g = luax_checknumber(L, 2); - context.curRenderColor.rgba.b = luax_checknumber(L, 3); - context.curRenderColor.rgba.a = luax_checknumber(L, 4); + /* jin.graphics.newTexture(bitmap) */ + static int l_newTexture(lua_State* L) + { + Texture* texture = nullptr; + if (luax_istype(L, 1, JIN_GRAPHICS_BITMAP)) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP); + Ref<Bitmap>& refBitmap = p->getRef<Bitmap>(); + Bitmap* bitmap = refBitmap.getObject(); + texture = Texture::createTexture(bitmap); + } + else if (luax_isstring(L, 1)) + { + const char* path = luax_checkstring(L, 1); + texture = Texture::createTexture(path); + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXTURE, sizeof(Proxy)); + proxy->bind(new Ref<Texture>(texture, JIN_GRAPHICS_TEXTURE)); + return 1; + } - glColor4f(context.curRenderColor.rgba.r / 255.f, - context.curRenderColor.rgba.g / 255.f, - context.curRenderColor.rgba.b / 255.f, - context.curRenderColor.rgba.a / 255.f); - return 0; - } + static int l_newShader(lua_State* L) + { + const char* program = luax_checkstring(L, 1); + Shader* jsl = Shader::createShader(program); + if (jsl == nullptr) + { + error(L, "Failed to compile shader"); + luax_pushnil(L); + return 1; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy)); + proxy->bind(new Ref<Shader>(jsl, JIN_GRAPHICS_SHADER)); + return 1; + } - static int l_getColor(lua_State * L) - { - luax_pushnumber(L, context.curRenderColor.rgba.r); - luax_pushnumber(L, context.curRenderColor.rgba.g); - luax_pushnumber(L, context.curRenderColor.rgba.b); - luax_pushnumber(L, context.curRenderColor.rgba.a); - return 4; - } + static int l_newShaderf(lua_State* L) + { + const char* path = luax_checkstring(L, 1); + AssetDatabase* fs = AssetDatabase::get(); + if (!fs->exists(path)) + { + error(L, "No such shader file %s\n", path); + luax_pushnil(L); + return 1; + } + Buffer b; + fs->read(path, b); + Shader* jsl = Shader::createShader((char*)&b); + if (jsl == nullptr) + { + error(L, "Failed to compile shader"); + luax_pushnil(L); + return 1; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy)); + proxy->bind(new Ref<Shader>(jsl, JIN_GRAPHICS_SHADER)); + return 1; + } + + static int l_newCanvas(lua_State* L) + { + int w = luax_checknumber(L, 1); + int h = luax_checknumber(L, 2); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_CANVAS, sizeof(Proxy)); + Canvas* cvs = Canvas::createCanvas(w, h); + proxy->bind(new Ref<Canvas>(cvs, JIN_GRAPHICS_CANVAS)); + return 1; + } - static int l_bindCanvas(lua_State* L) - { - if (luax_gettop(L) == 0) + static int l_clear(lua_State* L) { - // bind to default canvas - Canvas::unbind(); + glClear(GL_COLOR_BUFFER_BIT); return 0; } - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); - Ref<Canvas>& ref = proxy->getRef<Canvas>(); - ref->bind(); - return 0; - } - - static int l_unbindCanvas(lua_State* L) - { - Canvas::unbind(); - return 0; - } - static int l_useShader(lua_State* L) - { - if (luax_gettop(L) == 0) + static int l_setClearColor(lua_State* L) + { + if (luax_gettop(L) == 0) + { + glClearColor(0, 0, 0, 1); + return 0; + } + + context.curClearColor.r = luax_checknumber(L, 1); + context.curClearColor.g = luax_checknumber(L, 2); + context.curClearColor.b = luax_checknumber(L, 3); + context.curClearColor.a = luax_checknumber(L, 4); + + gl.setClearColor(context.curClearColor.r, + context.curClearColor.g, + context.curClearColor.b, + context.curClearColor.a); + return 0; + } + + static int l_present(lua_State* L) { - JSLProgram::unuse(); + Window::get()->swapBuffers(); return 0; } - if (luax_istype(L, 1, JIN_GRAPHICS_SHADER)) + + static void l_draw_texture(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_TEXTURE)) + return; + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + float sx = luax_optnumber(L, 4, 1); + float sy = luax_optnumber(L, 5, 1); + float r = luax_optnumber(L, 6, 0); + float ox = luax_optnumber(L, 7, 0); + float oy = luax_optnumber(L, 8, 0); + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Texture>& tex = proxy->getRef<Texture>(); + tex->draw(x, y, sx, sy, r, ox, oy); + } + + static void l_draw_canvas(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + return; + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + float sx = luax_optnumber(L, 4, 1); + float sy = luax_optnumber(L, 5, 1); + float r = luax_optnumber(L, 6, 0); + float ox = luax_optnumber(L, 7, 0); + float oy = luax_optnumber(L, 8, 0); + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Canvas>& p = proxy->getRef<Canvas>(); + p->draw(x, y, sx, sy, r, ox, oy); + } + + /* jin.graphics.draw(text, font, x, y) */ + static void l_draw_text(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_TEXT)) + return; + Proxy* p = (Proxy*)luax_toudata(L, 1); + Text* text = p->getObject<Text>(); + int x = luax_optnumber(L, 3, 0); + int y = luax_optnumber(L, 4, 0); + int spacing = luax_optnumber(L, 6, 0); + Font* font = nullptr; + Proxy* p2 = (Proxy*)luax_toudata(L, 2); + if (luax_istype(L, 2, JIN_GRAPHICS_TEXTUREFONT)) + { + TextureFont* tf = p2->getObject<TextureFont>(); + font = tf; + } + else if (luax_istype(L, 2, JIN_GRAPHICS_TTF)) + { + TTF* ttf = p2->getObject<TTF>(); + font = ttf; + } + else + { + font = context.defaultFont; + } + int lineheight = luax_optnumber(L, 5, font->getFontSize()); + font->print(*text, x, y, lineheight, spacing); + } + + /* jin.graphics.draw(page, x, y) */ + static void l_draw_page(lua_State* L) + { + if (!luax_istype(L, 1, JIN_GRAPHICS_PAGE)) + return; + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + Proxy* p = (Proxy*)luax_toudata(L, 1); + Page* page = p->getObject<Page>(); + Font* font = page->font; + font->print(page, x, y); + } + + static int l_draw(lua_State* L) { - Proxy* proxy = (Proxy*)luax_toudata(L, 1); - Ref<JSLProgram>& jsl = proxy->getRef<JSLProgram>(); - jsl->use(); + if (luax_istype(L, 1, JIN_GRAPHICS_TEXTURE)) + l_draw_texture(L); + else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + l_draw_canvas(L); + else if (luax_istype(L, 1, JIN_GRAPHICS_TEXT)) + l_draw_text(L); + else if (luax_istype(L, 1, JIN_GRAPHICS_PAGE)) + l_draw_page(L); + else + { + luax_typerror(L, 1, "texture or canvas"); + return 1; + } + return 0; } - else + + // draw(tex, quad, x, y, sx, sy, r, ax, ay) + static int l_drawq(lua_State* L) { - luax_typerror(L, 1, "JSL shader"); + if (!luax_istable(L, 2)) + { + luax_typerror(L, 2, "table"); + return 1; + } + Math::Quad q; + q.x = luax_rawgetnumber(L, 2, 1); + q.y = luax_rawgetnumber(L, 2, 2); + q.w = luax_rawgetnumber(L, 2, 3); + q.h = luax_rawgetnumber(L, 2, 4); + luax_pop(L, 4); + int x = luax_optnumber(L, 3, 0); + int y = luax_optnumber(L, 4, 0); + float sx = luax_optnumber(L, 5, 1); + float sy = luax_optnumber(L, 6, 1); + float r = luax_optnumber(L, 7, 0); + float ox = luax_optnumber(L, 8, 0); + float oy = luax_optnumber(L, 9, 0); + + if (luax_istype(L, 1, JIN_GRAPHICS_TEXTURE)) + { + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Texture>& tex = proxy->getRef<Texture>(); + tex->draw(q, x, y, sx, sy, r, ox, oy); + } + else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS)) + { + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Canvas>& p = proxy->getRef<Canvas>(); + p->draw(q, x, y, sx, sy, r, ox, oy); + } + else + { + luax_typerror(L, 1, "texture or canvas"); + } } - return 0; - } - - static int l_unuseShader(lua_State* L) - { - JSLProgram::unuse(); - return 0; - } - static int l_setBlend(lua_State* L) - { - - return 0; - } + /* print(string, x, y, lineheight, spacing) */ + /* need set font */ + static int l_print(lua_State* L) + { + Font* font = context.curFont; + if (font == nullptr) + return 0; + unsigned length; + const char* str = luax_checklstring(L, 1, &length); + Text text(Encode::UTF8, str, length); + int x = luax_optnumber(L, 2, 0); + int y = luax_optnumber(L, 3, 0); + int lineheight = luax_optnumber(L, 4, font->getFontSize()); + int spacing = luax_optnumber(L, 5, 0); + font->print(text, x, y, lineheight, spacing); + return 0; + } - static RENDER_MODE strtomode(const char* str) - { - std::string s = std::string(str); - if (s == "fill") return RENDER_MODE::FILL; - else if (s == "line") return RENDER_MODE::LINE; - else return RENDER_MODE::NONE; - } + static int l_setColor(lua_State* L) + { + if (luax_gettop(L) == 0) + { + glColor4f(1, 1, 1, 1); + return 0; + } - static int l_drawpoint(lua_State* L) - { - int x = luax_checknumber(L, 1); - int y = luax_checknumber(L, 2); - jin::graphics::point(x, y); - - return 0; - } - - static int l_drawLine(lua_State* L) - { - int x1 = luax_checknumber(L, 1); - int y1 = luax_checknumber(L, 2); - int x2 = luax_checknumber(L, 3); - int y2 = luax_checknumber(L, 4); - jin::graphics::line(x1, y1, x2, y2); - - return 0; - } + context.curRenderColor.r = luax_checknumber(L, 1); + context.curRenderColor.g = luax_checknumber(L, 2); + context.curRenderColor.b = luax_checknumber(L, 3); + if (luax_gettop(L) == 4) + context.curRenderColor.a = luax_checknumber(L, 4); + else + context.curRenderColor.a = 255; + glColor4f(context.curRenderColor.r / 255.f, + context.curRenderColor.g / 255.f, + context.curRenderColor.b / 255.f, + context.curRenderColor.a / 255.f); + return 0; + } - static int l_drawRect(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_getColor(lua_State * L) { - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - int w = luax_checknumber(L, 4); - int h = luax_checknumber(L, 5); - rect(mode, x, y, w, h); + luax_pushnumber(L, context.curRenderColor.r); + luax_pushnumber(L, context.curRenderColor.g); + luax_pushnumber(L, context.curRenderColor.b); + luax_pushnumber(L, context.curRenderColor.a); + return 4; } - else + + static int l_bindCanvas(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; + if (luax_gettop(L) == 0) + { + // bind to default canvas + Canvas::unbind(); + return 0; + } + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS); + Ref<Canvas>& ref = proxy->getRef<Canvas>(); + Canvas::bind(ref.getObject()); + return 0; } - return 0; - } + static int l_unbindCanvas(lua_State* L) + { + Canvas::unbind(); + return 0; + } - static int l_drawCircle(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_useShader(lua_State* L) { - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - float r = luax_checknumber(L, 4); - circle(mode, x, y, r); + if (luax_gettop(L) == 0) + { + Shader::unuse(); + return 0; + } + if (luax_istype(L, 1, JIN_GRAPHICS_SHADER)) + { + Proxy* proxy = (Proxy*)luax_toudata(L, 1); + Ref<Shader>& jsl = proxy->getRef<Shader>(); + jsl->use(); + } + else + { + luax_typerror(L, 1, "JSL shader"); + } + return 0; } - else + + static int l_setBlend(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; + + return 0; } - return 0; - } + static RenderMode strtomode(const char* str) + { + std::string s = std::string(str); + if (s == "fill") return RenderMode::FILL; + else if (s == "line") return RenderMode::LINE; + else return RenderMode::NONE; + } - static int l_drawTriangle(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_point(lua_State* L) { - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); + int x = luax_checknumber(L, 1); + int y = luax_checknumber(L, 2); + JinEngine::Graphics::point(x, y); + return 0; + } + + static int l_line(lua_State* L) + { + int x1 = luax_checknumber(L, 1); + int y1 = luax_checknumber(L, 2); int x2 = luax_checknumber(L, 3); int y2 = luax_checknumber(L, 4); + JinEngine::Graphics::line(x1, y1, x2, y2); + + return 0; + } - int x3 = luax_checknumber(L, 5); - int y3 = luax_checknumber(L, 6); + static int l_rect(lua_State* L) + { + const char* modestr = luax_checkstring(L, 1); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) + { + int x = luax_checknumber(L, 2); + int y = luax_checknumber(L, 3); + int w = luax_checknumber(L, 4); + int h = luax_checknumber(L, 5); + rect(mode, x, y, w, h); + } + else + { + luax_typerror(L, 1, "'fill' or 'line'"); + return 1; + } - triangle(mode, x, y, x2, y2, x3, y3); + return 0; } - else + + static int l_circle(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; + const char* modestr = luax_checkstring(L, 1); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) + { + int x = luax_checknumber(L, 2); + int y = luax_checknumber(L, 3); + float r = luax_checknumber(L, 4); + circle(mode, x, y, r); + } + else + { + luax_typerror(L, 1, "'fill' or 'line'"); + return 1; + } + + return 0; } - return 0; - } - - static int l_drawPolygon(lua_State* L) - { - const char* modestr = luax_checkstring(L, 1); - int n = luax_checknumber(L, 2); - RENDER_MODE mode = strtomode(modestr); - if (mode != RENDER_MODE::NONE) + static int l_triangle(lua_State* L) { - if (!luax_istable(L, 3)) + const char* modestr = luax_checkstring(L, 1); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) { - luax_typerror(L, 3, "table"); - return 1; + int x = luax_checknumber(L, 2); + int y = luax_checknumber(L, 3); + + int x2 = luax_checknumber(L, 3); + int y2 = luax_checknumber(L, 4); + + int x3 = luax_checknumber(L, 5); + int y3 = luax_checknumber(L, 6); + + triangle(mode, x, y, x2, y2, x3, y3); } - int tn = luax_tableidxlen(L, 3); - if (tn != n * 2) + else { - static char* emsg = \ - "number of polygon vertices doesn't match " \ - "provided n, expect %d numbers but get %d"; - luax_error(L, emsg, n * 2, tn); + luax_typerror(L, 1, "'fill' or 'line'"); return 1; } - float* p = new float[2 * n]; - for (int i = 1; i <= 2 * n; ++i) - p[i - 1] = luax_rawgetnumber(L, 3, i); - polygon(mode, p, n); - delete[] p; + + return 0; } - else + + static int l_polygon(lua_State* L) { - luax_typerror(L, 1, "'fill' or 'line'"); - return 1; - } + const char* modestr = luax_checkstring(L, 1); + int n = luax_checknumber(L, 2); + RenderMode mode = strtomode(modestr); + if (mode != RenderMode::NONE) + { + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + int tn = luax_tableidxlen(L, 3); + if (tn != n * 2) + { + static char* emsg = \ + "number of polygon vertices doesn't match " \ + "provided n, expect %d numbers but get %d"; + luax_error(L, emsg, n * 2, tn); + return 1; + } + float* p = (float*)alloca(2 * n * sizeof(float)); + for (int i = 1; i <= 2 * n; ++i) + p[i - 1] = luax_rawgetnumber(L, 3, i); + polygon(mode, p, n); + } + else + { + luax_typerror(L, 1, "'fill' or 'line'"); + return 1; + } - return 0; - } + return 0; + } - static int l_newFont(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_FONT, sizeof(Proxy)); - Font* font = new Font(); + static int l_newTTFData(lua_State* L) { - const char* path = luax_checkstring(L, 1); - Filesystem* fs = Filesystem::get(); - Buffer b = {}; - if (!fs->exists(path)) + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TTFDATA, sizeof(Proxy)); + TTFData* fd = nullptr; { - printf("Error: no such font %s\n", path); - exit(1); + const char* path = luax_checkstring(L, 1); + AssetDatabase* fs = AssetDatabase::get(); + if (!fs->exists(path)) + { + error(L, "No such font %s\n", path); + luax_pushnil(L); + return 1; + } + Buffer b; + fs->read(path, b); + fd = TTFData::createTTFData(&b, b.size()); } - fs->read(path, &b); - font->loadb((const unsigned char*)b.data); + proxy->bind(new Ref<TTFData>(fd, JIN_GRAPHICS_TTFDATA)); + return 1; } - proxy->bind(new Ref<Font>(font, JIN_GRAPHICS_FONT)); - return 1; - } - static int l_study(lua_State* L) - { - int n = luax_gettop(L); - if (n == 0) - { - if (context.defaultFont == 0) + /* newText(str[, encode]) */ + static int l_newText(lua_State* L) + { + Encode encode = Encode::UTF8; + if (luax_gettop(L) == 2) + { + const char* e = luax_checkstring(L, 2); + if (strcmp(e, "UTF8") == 0) encode = Encode::UTF8; + //else if (strcmp(e, "UTF16") == 0) encode = Encode::UTF16; + else if (strcmp(e, "ASCII") == 0) encode = Encode::ASCII; + else + { + luax_error(L, "wrong text encode %s", e); + return 0; + } + } + unsigned length; + const char* data = luax_checklstring(L, 1, &length); + Text* text = new Text(encode, data, length); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXT, sizeof(Proxy)); + proxy->bind(new Ref<Text>(text, JIN_GRAPHICS_TEXT)); + return 1; + } + + /* newTextureFont(bitmap, text, color | cellw, cellh) */ + static int l_newTextureFont(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP); + Bitmap* bitmap = p->getObject<Bitmap>(); + Text* text; + if (luax_istype(L, 2, JIN_GRAPHICS_TEXT)) { - #include "lua/resources/font.ttf.h" - // load default font - context.defaultFont = new Font(); - context.defaultFont->loadb(font_ttf); + Proxy* pt = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT); + text = pt->getObject<Text>(); } + else if (luax_isstring(L, 2)) + { + unsigned len; + const char* str = luax_checklstring(L, 2, &len); + text = new Text(Encode::UTF8, str, len); + } + else + { + luax_typerror(L, 2, "Text or string"); + return 1; + } + float cellh = luax_checknumber(L, 4); + TextureFont* textureFont = nullptr; + if (luax_istable(L, 3)) + { + unsigned int r = luax_rawgetnumber(L, 3, 1); + unsigned int g = luax_rawgetnumber(L, 3, 2); + unsigned int b = luax_rawgetnumber(L, 3, 3); + unsigned int a = luax_rawgetnumber(L, 3, 4); + textureFont = TextureFont::createTextureFont(bitmap, *text, Color(r, g, b, a), cellh); + } + else if (luax_isnumber(L, 3)) + { + float cellw = luax_checknumber(L, 3); + textureFont = TextureFont::createTextureFont(bitmap, *text, cellw, cellh); + } + else + { + luax_error(L, "bad arguments #3 to 'newTextureFont', need to be table or number"); + return 0; + } + if (luax_isstring(L, 2)) + { + // Delete temporary text. + delete text; + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXTUREFONT, sizeof(Proxy)); + proxy->bind(new Ref<TextureFont>(textureFont, JIN_GRAPHICS_TEXTUREFONT)); + return 1; + } + + /* setFont(font) */ + static int l_setFont(lua_State* L) + { + if (luax_istype(L, 1, JIN_GRAPHICS_TTF)) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF); + TTF* ttf = p->getObject<TTF>(); + context.curFont = ttf; + } + else if (luax_istype(L, 1, JIN_GRAPHICS_TEXTUREFONT)) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT); + TextureFont* tf = p->getObject<TextureFont>(); + context.curFont = tf; + } + return 0; + } + + static int l_unsetFont(lua_State* L) + { context.curFont = context.defaultFont; return 0; } - Font* font = (Font*)luax_checktype(L, 1, JIN_GRAPHICS_FONT); - context.curFont = font; - return 0; - } - - static int l_write(lua_State* L) - { - if (context.curFont == 0) - return 0; - - const char* text = luax_checkstring(L, 1); - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - - int fh = luax_optnumber(L, 4, 15); - int spacing = luax_optnumber(L, 5, 1); - int lh = luax_optnumber(L, 6, 18); - - context.curFont->render(text, x, y, fh, spacing, lh); - return 0; - } - - static int l_box(lua_State* L) - { - const char* text = luax_checkstring(L, 1); - int fontheight = luax_checknumber(L, 2); - int spacing = luax_checknumber(L, 3); - int lineheight = luax_checknumber(L, 4); - int w, h; - context.curFont->box(text, fontheight, spacing, lineheight, &w, &h); - luax_pushnumber(L, w); - luax_pushnumber(L, h); - return 2; - } - - static const luaL_Reg f[] = { - { "init", l_init }, - { "getSize", l_getSize }, - { "getWidth", l_getWidth }, - { "getHeight", l_getHeight }, - { "newImage", l_newImage }, - { "newShader", l_newShader }, - { "newCanvas", l_newCanvas }, - { "newFont", l_newFont }, - { "box", l_box }, - { "write", l_write }, - { "setClearColor", l_setClearColor }, - { "clear", l_clear }, - { "draw", l_draw }, - { "setColor", l_setColor }, - { "palette", l_getColor }, - { "present", l_present }, - { "setFont", l_study }, - { "bindCanvas", l_bindCanvas }, - { "unbindCanvas", l_unbindCanvas }, - { "useShader", l_useShader }, - { "unuseShader", l_unuseShader }, - { "point", l_drawpoint }, - { "line", l_drawLine }, - { "rect", l_drawRect }, - { "circle", l_drawCircle }, - { "triangle", l_drawTriangle }, - { "polygon", l_drawPolygon }, - { "destroy", l_destroy }, - { 0, 0 } - }; - - extern int luaopen_Image(lua_State* L); - extern int luaopen_Font(lua_State* L); - extern int luaopen_Canvas(lua_State* L); - extern int luaopen_JSL(lua_State* L); + static const luaL_Reg f[] = { + /* window */ + { "init", l_init }, + { "setTitle", l_setTitle }, + { "getSize", l_getSize }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "destroy", l_destroy }, + /* creators */ + { "newBitmap", l_newBitmap }, + { "newTexture", l_newTexture }, + { "newShader", l_newShader }, + { "newShaderf", l_newShaderf }, + { "newCanvas", l_newCanvas }, + { "newTTFData", l_newTTFData }, + { "newText", l_newText }, + { "newTextureFont", l_newTextureFont }, + /* render */ + { "setClearColor", l_setClearColor }, + { "clear", l_clear }, + { "draw", l_draw }, + { "print", l_print }, + { "drawq", l_drawq }, + { "setColor", l_setColor }, + { "getColor", l_getColor }, + { "present", l_present }, + /* canvas */ + { "bindCanvas", l_bindCanvas }, + { "unbindCanvas", l_unbindCanvas }, + /* shader */ + { "useShader", l_useShader }, + /* shapes */ + { "point", l_point }, + { "line", l_line }, + { "rect", l_rect }, + { "circle", l_circle }, + { "triangle", l_triangle }, + { "polygon", l_polygon }, + /* font */ + { "setFont", l_setFont }, + { "unsetFont", l_unsetFont }, + { 0, 0 } + }; + + extern int luaopen_Texture(lua_State* L); + extern int luaopen_Text(lua_State* L); + extern int luaopen_TTF(lua_State* L); + extern int luaopen_TextureFont(lua_State* L); + extern int luaopen_TTFData(lua_State* L); + extern int luaopen_Page(lua_State* L); + extern int luaopen_Canvas(lua_State* L); + extern int luaopen_JSL(lua_State* L); + extern int luaopen_Bitmap(lua_State* L); - int luaopen_graphics(lua_State* L) - { - // register types - luaopen_Image(L); - luaopen_Canvas(L); - luaopen_Font(L); - luaopen_JSL(L); - - // load whole lib - luax_newlib(L, f); + int luaopen_graphics(lua_State* L) + { + // register types + luaopen_Bitmap(L); + luaopen_Texture(L); + luaopen_Canvas(L); + luaopen_TTFData(L); + luaopen_TTF(L); + luaopen_Text(L); + luaopen_TextureFont(L); + luaopen_Page(L); + luaopen_JSL(L); + + // load whole lib + luax_newlib(L, f); - return 1; - } + return 1; + } -}// lua -}// jin
\ No newline at end of file + }// lua +}// jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/image.cpp b/src/lua/modules/graphics/image.cpp deleted file mode 100644 index 5824660..0000000 --- a/src/lua/modules/graphics/image.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "lua/modules/luax.h" -#include "lua/modules/types.h" -#include "lua/common/common.h" -#include "libjin/jin.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::graphics; - - typedef Texture Image; - - static inline Ref<Image>& checkImage(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_IMAGE); - return proxy->getRef<Image>(); - } - - static int l_getWidth(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - luax_pushnumber(L, ref->getWidth()); - return 1; - } - - static int l_getHeight(lua_State *L) - { - Ref<Image>& ref = checkImage(L); - luax_pushnumber(L, ref->getHeight()); - return 1; - } - - static int l_getPixel(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - color c = ref->getPixel(x, y); - luax_pushnumber(L, c.rgba.r); - luax_pushnumber(L, c.rgba.g); - luax_pushnumber(L, c.rgba.b); - luax_pushnumber(L, c.rgba.a); - return 4; - } - - static int l_setAnchor(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - int x = luax_checknumber(L, 2); - int y = luax_checknumber(L, 3); - ref->setAnchor(x, y); - return 0; - } - - static int l_getSize(lua_State* L) - { - Ref<Image>& ref = checkImage(L); - luax_pushnumber(L, ref->getWidth()); - luax_pushnumber(L, ref->getHeight()); - return 2; - } - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_IMAGE); - proxy->release(); - return 0; - } - - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "getWidth", l_getWidth }, - { "getHeight", l_getHeight }, - { "getSize", l_getSize }, - { "getPixel", l_getPixel }, - { "setAnchor", l_setAnchor }, - { 0, 0 } - }; - - int luaopen_Image(lua_State* L) - { - luax_newtype(L, JIN_GRAPHICS_IMAGE, f); - return 0; - } - -}// graphics -}// jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/jsl.cpp b/src/lua/modules/graphics/jsl.cpp deleted file mode 100644 index ccd9ebd..0000000 --- a/src/lua/modules/graphics/jsl.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "lua/modules/luax.h" -#include "lua/modules/types.h" -#include "lua/common/common.h" -#include "libjin/jin.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::graphics; - - typedef Texture Image; - - static inline Ref<JSLProgram>& checkJSLProgram(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); - return proxy->getRef<JSLProgram>(); - } - - static enum VARIABLE_TYPE - { - INVALID = 0, - - NUMBER, - IMAGE, - CANVAS, - VEC2, - VEC3, - VEC4, - COLOR, - }; - - static VARIABLE_TYPE strToType(const char* str) - { - std::string s = std::string(str); - if (s == "number") return NUMBER; - else if (s == "Image") return IMAGE; - else if (s == "Canvas") return CANVAS; - else if (s == "vec2") return VEC2; - else if (s == "vec3") return VEC3; - else if (s == "vec4") return VEC4; - else if (s == "Color") return COLOR; - else return INVALID; - } - - /** - * Use send function send variables to JSL program. - */ - static int l_send(lua_State* L) - { - Ref<JSLProgram>& ref = checkJSLProgram(L); - // number Image Texel - const char* typestr = luax_checkstring(L, 2); - // variable name - const char* variable = luax_checkstring(L, 3); - if (typestr != nullptr) - { - int type = strToType(typestr); - switch (type) - { - case NUMBER: - { - float number = luax_checknumber(L, 4); - ref->sendFloat(variable, number); - break; - } - case IMAGE: - { - Proxy* proxy = (Proxy*)luax_checktype(L, 4, JIN_GRAPHICS_IMAGE); - Ref<Image>& tex = proxy->getRef<Image>(); - ref->sendTexture(variable, tex.getObject()); - break; - } - case CANVAS: - { - Proxy* proxy = (Proxy*)luax_checktype(L, 4, JIN_GRAPHICS_CANVAS); - Ref<Canvas>& canvas = proxy->getRef<Canvas>(); - ref->sendCanvas(variable, canvas.getObject()); - break; - } - case VEC2: - { - float x = luax_checknumber(L, 4); - float y = luax_checknumber(L, 5); - ref->sendVec2(variable, x, y); - break; - } - case VEC3: - { - float x = luax_checknumber(L, 4); - float y = luax_checknumber(L, 5); - float z = luax_checknumber(L, 6); - ref->sendVec3(variable, x, y, z); - break; - } - case VEC4: - { - float x = luax_checknumber(L, 4); - float y = luax_checknumber(L, 5); - float z = luax_checknumber(L, 6); - float w = luax_checknumber(L, 7); - ref->sendVec4(variable, x, y, z, w); - break; - } - case COLOR: - { - color col; - col.rgba.r = luax_checkinteger(L, 4); - col.rgba.g = luax_checkinteger(L, 5); - col.rgba.b = luax_checkinteger(L, 6); - col.rgba.a = luax_checkinteger(L, 7); - ref->sendColor(variable, &col); - break; - } - default: - return 0; - } - } - return 1; - } - - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); - proxy->release(); - return 0; - } - - static const luaL_Reg f[] = { - { "__gc", l_gc }, - { "send", l_send }, - { 0, 0 } - }; - - /** - * JSL program - */ - int luaopen_JSL(lua_State* L) - { - luax_newtype(L, JIN_GRAPHICS_SHADER, f); - return 0; - } - -} -}
\ No newline at end of file diff --git a/src/lua/modules/graphics/page.cpp b/src/lua/modules/graphics/page.cpp new file mode 100644 index 0000000..8c9e918 --- /dev/null +++ b/src/lua/modules/graphics/page.cpp @@ -0,0 +1,73 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +#include <iostream> + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Font>& FontRef; + + Page* getPage(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_PAGE); + return proxy->getObject<Page>(); + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_PAGE); + { + /* release font */ + Ref<Page>* page = &proxy->getRef<Page>(); + RefBase* font = (RefBase*)page->getUserdata(); + font->release(); + } + proxy->release(); + return 0; + } + + static int l_getSize(lua_State* L) + { + Page* page = getPage(L); + luax_pushinteger(L, page->size.w); + luax_pushinteger(L, page->size.h); + return 2; + } + + static int l_getWidth(lua_State* L) + { + Page* page = getPage(L); + luax_pushinteger(L, page->size.w); + return 1; + } + + static int l_getHeight(lua_State* L) + { + Page* page = getPage(L); + luax_pushinteger(L, page->size.h); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getSize", l_getSize }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { 0, 0 } + }; + + int luaopen_Page(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_PAGE, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/shader.cpp b/src/lua/modules/graphics/shader.cpp new file mode 100644 index 0000000..d7733d4 --- /dev/null +++ b/src/lua/modules/graphics/shader.cpp @@ -0,0 +1,135 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Shader>& ShaderRef; + + static inline ShaderRef checkShader(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); + return proxy->getRef<Shader>(); + } + + /** + * jsl:sendNumber("variable", 0.1) + */ + static int l_sendNumber (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + float number = luax_checknumber(L, 3); + ref->sendFloat(variable, number); + return 0; + } + + static int l_sendTexture (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + Proxy* proxy = (Proxy*)luax_checktype(L, 3, JIN_GRAPHICS_TEXTURE); + Ref<Texture>& tex = proxy->getRef<Texture>(); + ref->sendTexture(variable, tex.getObject()); + return 0; + } + + static int l_sendCanvas (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + Proxy* proxy = (Proxy*)luax_checktype(L, 3, JIN_GRAPHICS_CANVAS); + Ref<Canvas>& canvas = proxy->getRef<Canvas>(); + ref->sendCanvas(variable, canvas.getObject()); + return 0; + } + + static int l_sendVec2 (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + float x = luax_rawgetnumber(L, 3, 1); + float y = luax_rawgetnumber(L, 3, 2); + ref->sendVec2(variable, x, y); + return 0; + } + + static int l_sendVec3 (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + float x = luax_rawgetnumber(L, 3, 1); + float y = luax_rawgetnumber(L, 3, 2); + float z = luax_rawgetnumber(L, 3, 3); + ref->sendVec3(variable, x, y, z); + return 0; + } + + static int l_sendVec4 (lua_State* L) + { + ShaderRef ref = checkShader(L); + const char* variable = luax_checkstring(L, 2); + if (!luax_istable(L, 3)) + { + luax_typerror(L, 3, "table"); + return 1; + } + float x = luax_rawgetnumber(L, 3, 1); + float y = luax_rawgetnumber(L, 3, 2); + float z = luax_rawgetnumber(L, 3, 3); + float w = luax_rawgetnumber(L, 3, 4); + ref->sendVec4(variable, x, y, z, w); + return 0; + } + + static int l_sendColor (lua_State* L) + { + return l_sendVec4(L); + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER); + proxy->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "sendNumber", l_sendNumber }, + { "sendTexture", l_sendTexture }, + { "sendCanvas", l_sendCanvas }, + { "sendVec2", l_sendVec2 }, + { "sendVec3", l_sendVec3 }, + { "sendVec4", l_sendVec4 }, + { "sendColor", l_sendColor }, + { 0, 0 } + }; + + /** + * JSL program + */ + int luaopen_JSL(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_SHADER, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/text.cpp b/src/lua/modules/graphics/text.cpp new file mode 100644 index 0000000..cbc82f1 --- /dev/null +++ b/src/lua/modules/graphics/text.cpp @@ -0,0 +1,32 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_gc(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXT); + p->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { 0, 0 } + }; + + int luaopen_Text(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TEXT, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/texture.cpp b/src/lua/modules/graphics/texture.cpp new file mode 100644 index 0000000..61bfaee --- /dev/null +++ b/src/lua/modules/graphics/texture.cpp @@ -0,0 +1,65 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + typedef Ref<Texture>& TextureRef; + + static inline TextureRef checkTexture(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTURE); + return proxy->getRef<Texture>(); + } + + static int l_getWidth(lua_State* L) + { + TextureRef ref = checkTexture(L); + luax_pushnumber(L, ref->getWidth()); + return 1; + } + + static int l_getHeight(lua_State *L) + { + TextureRef ref = checkTexture(L); + luax_pushnumber(L, ref->getHeight()); + return 1; + } + + static int l_getSize(lua_State* L) + { + TextureRef ref = checkTexture(L); + luax_pushnumber(L, ref->getWidth()); + luax_pushnumber(L, ref->getHeight()); + return 2; + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTURE); + proxy->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "getWidth", l_getWidth }, + { "getHeight", l_getHeight }, + { "getSize", l_getSize }, + { 0, 0 } + }; + + int luaopen_Texture(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TEXTURE, f); + return 0; + } + + }// lua +}// jin
\ No newline at end of file diff --git a/src/lua/modules/graphics/texture_font.cpp b/src/lua/modules/graphics/texture_font.cpp new file mode 100644 index 0000000..a2e88ba --- /dev/null +++ b/src/lua/modules/graphics/texture_font.cpp @@ -0,0 +1,67 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT); + proxy->release(); + return 0; + } + + /* typeset(Text | string, lineheight, spacing) */ + static int l_typeset(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT); + TextureFont* tf = p->getObject<TextureFont>(); + int lineheight = luax_checkinteger(L, 3); + int spacing = luax_optnumber(L, 4, 0); + Page* page = nullptr; + if (luax_isstring(L, 2)) + { + unsigned length; + const char* str = luax_checklstring(L, 2, &length); + Text text(Encode::UTF8, str, length); + page = tf->typeset(text, lineheight, spacing); + } + else if (luax_istype(L, 2, JIN_GRAPHICS_TEXT)) + { + Proxy* p2 = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT); + Text* text = p2->getObject<Text>(); + page = tf->typeset(*text, lineheight, spacing); + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_PAGE, sizeof(Proxy)); + Ref<Page>* refPage = new Ref<Page>(page, JIN_GRAPHICS_PAGE); + { + /* retain related ttf */ + Ref<TextureFont>& refTF = p->getRef<TextureFont>(); + refTF.retain(); + refPage->setUserdata(&refTF); + } + proxy->bind(refPage); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "typeset", l_typeset }, + { 0, 0 } + }; + + int luaopen_TextureFont(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TEXTUREFONT, f); + + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/ttf.cpp b/src/lua/modules/graphics/ttf.cpp new file mode 100644 index 0000000..414c7eb --- /dev/null +++ b/src/lua/modules/graphics/ttf.cpp @@ -0,0 +1,73 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF); + { + /* release ttf data */ + Ref<TTF>* ttf = &proxy->getRef<TTF>(); + RefBase* data = (RefBase*)ttf->getUserdata(); + data->release(); + } + proxy->release(); + return 0; + } + + /* typeset(Text | string, lineheight, spacing) */ + static int l_typeset(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF); + TTF* ttf = p->getObject<TTF>(); + int lineheight = luax_optnumber(L, 3, ttf->getFontSize()); + int spacing = luax_optnumber(L, 4, 0); + Page* page = nullptr; + if (luax_isstring(L, 2)) + { + unsigned length; + const char* str = luax_checklstring(L, 2, &length); + Text text(Encode::UTF8, str, length); + page = ttf->typeset(text, lineheight, spacing); + } + else if (luax_istype(L, 2, JIN_GRAPHICS_TEXT)) + { + Proxy* p2 = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT); + Text* text = p2->getObject<Text>(); + page = ttf->typeset(*text, lineheight, spacing); + } + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_PAGE, sizeof(Proxy)); + Ref<Page>* refPage = new Ref<Page>(page, JIN_GRAPHICS_PAGE); + { + /* retain related ttf */ + Ref<TTF>& refTTF = p->getRef<TTF>(); + refTTF.retain(); + refPage->setUserdata(&refTTF); + } + proxy->bind(refPage); + return 1; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "typeset", l_typeset }, + { 0, 0 } + }; + + int luaopen_TTF(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TTF, f); + + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/graphics/ttfData.cpp b/src/lua/modules/graphics/ttfData.cpp new file mode 100644 index 0000000..43c3613 --- /dev/null +++ b/src/lua/modules/graphics/ttfData.cpp @@ -0,0 +1,51 @@ +#include "lua/modules/luax.h" +#include "lua/modules/types.h" +#include "lua/common/common.h" +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + using namespace JinEngine::Graphics; + + static int l_newTTF(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTFDATA); + int fontsize = luax_checkinteger(L, 2); + Ref<TTFData>& refFontData = p->getRef<TTFData>(); + TTFData* fontData = refFontData.getObject(); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TTF, sizeof(Proxy)); + TTF* font = fontData->createTTF(fontsize); + Ref<TTF>* refTTF = new Ref<TTF>(font, JIN_GRAPHICS_TTF); + { + Ref<TTFData>& refTTFData = p->getRef<TTFData>(); + refTTFData.retain(); + refTTF->setUserdata(&refTTFData); + } + proxy->bind(refTTF); + return 1; + } + + static int l_gc(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTFDATA); + p->release(); + return 0; + } + + static const luaL_Reg f[] = { + { "__gc", l_gc }, + { "newTTF", l_newTTF }, + { 0, 0 } + }; + + int luaopen_TTFData(lua_State* L) + { + luax_newtype(L, JIN_GRAPHICS_TTFDATA, f); + return 0; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/jin.cpp b/src/lua/modules/jin.cpp deleted file mode 100644 index a25ec6c..0000000 --- a/src/lua/modules/jin.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "jin.h" -#include "lua/modules/luax.h" -#include "embed/embed.h" - -namespace jin -{ -namespace lua -{ - - extern int luaopen_core(lua_State* L); - extern int luaopen_graphics(lua_State* L); - extern int luaopen_audio(lua_State* L); - extern int luaopen_net(lua_State* L); - extern int luaopen_event(lua_State* L); - extern int luaopen_time(lua_State* L); - extern int luaopen_mouse(lua_State* L); - extern int luaopen_keyboard(lua_State* L); - extern int luaopen_filesystem(lua_State* L); - extern int luaopen_joypad(lua_State* L); - extern int luaopen_math(lua_State* L); - extern int luaopen_thread(lua_State* L); - extern int luaopen_bit(lua_State* L); - - static int l_getversion(lua_State* L) - { - luax_pushstring(L, VERSION); - return 1; - } - - static int l_getAuthor(lua_State* L) - { - luax_pushstring(L, AUTHOR); - return 1; - } - - static int l_getOS(lua_State* L) - { - #ifdef _WIN32 - luax_pushstring(L, "windows"); - #elif defined __unix__ - luax_pushstring(L, "unix"); - #elif defined __APPLE__ - luax_pushstring(L, "macos"); - #endif - return 1; - } - - static int l_revision(lua_State* L) - { - luax_pushnumber(L, REVISION); - return 1; - } - - static const luaL_Reg f[] = { - { "version", l_getversion }, - { "revision", l_revision }, - { "author", l_getAuthor }, - { "os", l_getOS }, - { 0, 0 } - }; - - // submodules - static const luaL_Reg mods[] = { - { "core", luaopen_core }, - { "event", luaopen_event }, - { "graphics", luaopen_graphics }, - { "time", luaopen_time }, - { "mouse", luaopen_mouse }, - { "keyboard", luaopen_keyboard }, - { "filesystem", luaopen_filesystem }, - { "net", luaopen_net }, - { "audio", luaopen_audio }, - { "joypad", luaopen_joypad }, - { "math", luaopen_math }, - { "thread", luaopen_thread }, - { "bit", luaopen_bit }, - { 0, 0 } - }; - - int luaopen_jin(lua_State* L) - { - // jin module is on top of the stack - luax_newlib(L, f); - - // set to global field - luax_justglobal(L, -1, MODULE_NAME); - - // register submodules - for (int i = 0; mods[i].name; ++i) - { - mods[i].func(L); - luax_setfield(L, -2, mods[i].name); - } - - return 1; - } - - void boot(lua_State* L) - { - jin::embed::boot(L); - } - -} // lua -} // jin
\ No newline at end of file diff --git a/src/lua/modules/jin.h b/src/lua/modules/jin.h deleted file mode 100644 index 07531b2..0000000 --- a/src/lua/modules/jin.h +++ /dev/null @@ -1,42 +0,0 @@ -/** -* Copyright (C) 2016~2018 chai -* -* Permission is hereby granted, free of charge, to any person obtaining a copyof -* 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. -*/ - -#ifndef __JIN_M_JIN_H -#define __JIN_M_JIN_H -#include "luax.h" - -#define MODULE_NAME "jin" -#define VERSION "0.1.1" -#define REVISION 101 -#define AUTHOR "chai" - -namespace jin -{ -namespace lua -{ - - int luaopen_jin(lua_State* L); - void boot(lua_State* L); - -} // jin -} // lua - -#endif // __JIN_M_JIN_H
\ No newline at end of file diff --git a/src/lua/modules/joypad/joypad.cpp b/src/lua/modules/joypad/joypad.cpp index d305878..d67a624 100644 --- a/src/lua/modules/joypad/joypad.cpp +++ b/src/lua/modules/joypad/joypad.cpp @@ -1,21 +1,21 @@ #include "libjin/jin.h" #include "lua/modules/luax.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - static const luaL_Reg f[] = { - { 0, 0 } - }; - - int luaopen_joypad(lua_State* L) + namespace Lua { - luax_newlib(L, f); - return 1; - } + static const luaL_Reg f[] = { + { 0, 0 } + }; + + int luaopen_joypad(lua_State* L) + { + luax_newlib(L, f); -} -}
\ No newline at end of file + return 1; + } + /*SDL_JoystickGetButton*/ + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/keyboard/keyboard.cpp b/src/lua/modules/keyboard/keyboard.cpp index 9d27a4f..727a51e 100644 --- a/src/lua/modules/keyboard/keyboard.cpp +++ b/src/lua/modules/keyboard/keyboard.cpp @@ -1,16 +1,16 @@ #include "lua/modules/luax.h" -#include "lua/modules/embed/keyboard.lua.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - int luaopen_keyboard(lua_State* L) + namespace Lua { - luax_newlib(L, 0); - return 1; - } + //https://wiki.libsdl.org/SDL_Keycode + + int luaopen_keyboard(lua_State* L) + { + luax_newlib(L, 0); + return 1; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/luax.h b/src/lua/modules/luax.h index 89e456e..f45af39 100644 --- a/src/lua/modules/luax.h +++ b/src/lua/modules/luax.h @@ -1,7 +1,6 @@ -#ifndef __JIN_LUA_LUAX_H -#define __JIN_LUA_LUAX_H +#ifndef __JIN_MODULES_LUAX_H +#define __JIN_MODULES_LUAX_H -#include "LuaJIT/lua.hpp" -#include "lua/libraries/luax/luax.h" +#include "../luax.h" #endif
\ No newline at end of file diff --git a/src/lua/modules/math/math.cpp b/src/lua/modules/math/math.cpp index fa59e04..4891762 100644 --- a/src/lua/modules/math/math.cpp +++ b/src/lua/modules/math/math.cpp @@ -1,30 +1,30 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - static int l_mod(lua_State* L) + namespace Lua { - int n = luax_checkinteger(L, 1); - int m = luax_checkinteger(L, 2); - int mod = n % m; - luax_pushinteger(L, mod); - return 1; - } - static const luaL_Reg f[] = { - { "mod", l_mod }, - { 0, 0 } - }; + static int l_mod(lua_State* L) + { + int n = luax_checkinteger(L, 1); + int m = luax_checkinteger(L, 2); + int mod = n % m; + luax_pushinteger(L, mod); + return 1; + } - int luaopen_math(lua_State* L) - { - luax_newlib(L, f); - return 1; - } + static const luaL_Reg f[] = { + { "mod", l_mod }, + { 0, 0 } + }; + + int luaopen_math(lua_State* L) + { + luax_newlib(L, f); + return 1; + } -} -}
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/mouse/mouse.cpp b/src/lua/modules/mouse/mouse.cpp index f907abb..9d45178 100644 --- a/src/lua/modules/mouse/mouse.cpp +++ b/src/lua/modules/mouse/mouse.cpp @@ -1,31 +1,42 @@ #include "lua/modules/luax.h" #include "libjin/jin.h" -namespace jin +namespace JinEngine { -namespace lua -{ - using namespace jin::input; - - static int l_pos(lua_State* L) + namespace Lua { - static Mouse* mouse = Mouse::get(); - int x, y; - mouse->getState(&x, &y); - luax_pushnumber(L, x); - luax_pushnumber(L, y); - return 2; - } - static const luaL_Reg f[] = { - { "position", l_pos }, - { 0, 0 } - }; + using namespace JinEngine::Input; + + static int l_pos(lua_State* L) + { + static Mouse* mouse = Mouse::get(); + int x, y; + mouse->getState(&x, &y); + luax_pushnumber(L, x); + luax_pushnumber(L, y); + return 2; + } + + static int l_setVisible(lua_State* L) + { + bool visible = luax_checkbool(L, 1); + Mouse* mouse = Mouse::get(); + mouse->setVisible(visible); + return 0; + } + + static const luaL_Reg f[] = { + { "position", l_pos }, + { "setVisible", l_setVisible }, + { 0, 0 } + }; - int luaopen_mouse(lua_State* L) - { - luax_newlib(L, f); - return 1; - } -} -}
\ No newline at end of file + int luaopen_mouse(lua_State* L) + { + luax_newlib(L, f); + return 1; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/net/Buffer.cpp b/src/lua/modules/net/Buffer.cpp index 3354518..ddfbd6b 100644 --- a/src/lua/modules/net/Buffer.cpp +++ b/src/lua/modules/net/Buffer.cpp @@ -4,133 +4,139 @@ #include "libjin/jin.h" #include "Buffer.h" -namespace jin +namespace JinEngine { -namespace lua -{ -namespace net -{ - - static inline Ref<Buffer>& checkNetBuffer(lua_State* L) + namespace Lua { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); - return proxy->getRef<Buffer>(); - } - - // net.Buffer:append(value) -> value_length - static int l_append(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - const int vp = 2; - if (luax_isintegerstrict(L, vp)) - { - int n = luax_checkinteger(L, vp); - int size = sizeof(n); - ref->append(&n, size); - luax_pushinteger(L, size); - return 1; - } - else if (luax_isfloatstrict(L, vp)) - { - float n = luax_checknumber(L, vp); - int size = sizeof(n); - ref->append(&n, size); - luax_pushinteger(L, size); - return 1; - } - else if (luax_isbooleanstrict(L, vp)) - { - bool n = luax_checkbool(L, vp); - int size = sizeof(n); - ref->append(&n, size); - luax_pushinteger(L, size); - return 1; - } - else if (luax_isstringstrict(L, vp)) + namespace Net { - const char* str = luax_checkstring(L, vp); - int size = strlen(str) + 1; - ref->append(str, size); - luax_pushinteger(L, size); - return 1; - } - else - { - luax_typerror(L, vp, "number, bool or string"); - return 0; - } - } - // net.Buffer:grabString(offset) -> string, length - static int l_grabString(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - const char* str = ref->grabString(&len, offset); - luax_pushstring(L, str); - luax_pushinteger(L, len); - return 2; - } + using namespace JinEngine; - // net.Buffer:grabInteger(offset) -> integer, length - static int l_grabInteger(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - int integer = ref->grabInteger(&len, offset); - luax_pushinteger(L, integer); - luax_pushinteger(L, len); - return 2; - } + typedef Ref<Buffer>& BufferRef; - static int l_grabFloat(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - float floatv = ref->grabFloat(&len, offset); - luax_pushnumber(L, floatv); - luax_pushinteger(L, len); - return 2; - } + static inline BufferRef checkNetBuffer(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); + return proxy->getRef<Buffer>(); + } - static int l_grabBoolean(lua_State* L) - { - Ref<Buffer>& ref = checkNetBuffer(L); - int offset = luax_checkinteger(L, 2); - int len; - bool boolean = ref->grabBoolean(&len, offset); - luax_pushboolean(L, boolean); - luax_pushinteger(L, len); - return 2; - } + // net.Buffer:append(value) -> value_length + static int l_append(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + const int vp = 2; + if (luax_isintegerstrict(L, vp)) + { + int n = luax_checkinteger(L, vp); + int size = sizeof(n); + ref->append(&n, size); + luax_pushinteger(L, size); + return 1; + } + else if (luax_isfloatstrict(L, vp)) + { + float n = luax_checknumber(L, vp); + int size = sizeof(n); + ref->append(&n, size); + luax_pushinteger(L, size); + return 1; + } + else if (luax_isbooleanstrict(L, vp)) + { + bool n = luax_checkbool(L, vp); + int size = sizeof(n); + ref->append(&n, size); + luax_pushinteger(L, size); + return 1; + } + else if (luax_isstringstrict(L, vp)) + { + const char* str = luax_checkstring(L, vp); + int size = strlen(str) + 1; + ref->append(str, size); + luax_pushinteger(L, size); + return 1; + } + else + { + luax_typerror(L, vp, "number, bool or string"); + return 0; + } + } - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); - proxy->release(); - return 0; - } + // net.Buffer:grabString(offset) -> string, length + static int l_grabString(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + unsigned int len; + char* data = ref->grabString(&len, offset); + Array<char> str; + str.bind(data, len); + luax_pushstring(L, &str); + luax_pushinteger(L, str.count()); + return 2; + } - static const luaL_Reg netbuffer_function[] = { - { "__gc", l_gc }, - { "append", l_append }, - { "grabString", l_grabString }, - { "grabInteger", l_grabInteger }, - { "grabBoolean", l_grabBoolean }, - { "grabFloat", l_grabFloat }, - { 0, 0 } - }; + // net.Buffer:grabInteger(offset) -> integer, length + static int l_grabInteger(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + int len; + int integer = ref->grabInteger(&len, offset); + luax_pushinteger(L, integer); + luax_pushinteger(L, len); + return 2; + } -} // net + static int l_grabFloat(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + int len; + float floatv = ref->grabFloat(&len, offset); + luax_pushnumber(L, floatv); + luax_pushinteger(L, len); + return 2; + } - int luaopen_Buffer(lua_State* L) - { - luax_newtype(L, JIN_NETWORK_BUFFER, net::netbuffer_function); - return 0; - } + static int l_grabBoolean(lua_State* L) + { + BufferRef ref = checkNetBuffer(L); + int offset = luax_checkinteger(L, 2); + int len; + bool boolean = ref->grabBoolean(&len, offset); + luax_pushboolean(L, boolean); + luax_pushinteger(L, len); + return 2; + } + + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER); + proxy->release(); + return 0; + } + + static const luaL_Reg netbuffer_function[] = { + { "__gc", l_gc }, + { "append", l_append }, + { "grabString", l_grabString }, + { "grabInteger", l_grabInteger }, + { "grabBoolean", l_grabBoolean }, + { "grabFloat", l_grabFloat }, + { 0, 0 } + }; + + } // namespace Net + + int luaopen_Buffer(lua_State* L) + { + luax_newtype(L, JIN_NETWORK_BUFFER, Net::netbuffer_function); + return 0; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/net/Buffer.h b/src/lua/modules/net/Buffer.h index 31e6df8..8733778 100644 --- a/src/lua/modules/net/Buffer.h +++ b/src/lua/modules/net/Buffer.h @@ -5,92 +5,93 @@ #include <cstdlib> #include "lua/common/common.h" -namespace jin +namespace JinEngine { -namespace lua -{ -namespace net -{ - - class Buffer + namespace Lua { - public: - Buffer(size_t s = 0) - : size(s) + namespace Net { - buffer = new char[size]; - memset(buffer, 0, size); - } - Buffer(const char* data, size_t s) - : size(s) - { - buffer = new char[size]; - memcpy(buffer, data, size); - } - - ~Buffer() - { - if (buffer != nullptr) + class Buffer { - delete[] buffer; - buffer = nullptr; - size = 0; - } - } + public: + Buffer(size_t s = 0) + : size(s) + { + buffer = new char[size]; + memset(buffer, 0, size); + } - void append(const void* data, size_t s) - { - if (data == nullptr) - return; - char* buf = buffer; - buffer = new char[size + s]; - memcpy(buffer, buf, size); - memcpy(buffer + size, data, s); - delete[] buf; - size += s; - return; - } + Buffer(const char* data, size_t s) + : size(s) + { + buffer = new char[size]; + memcpy(buffer, data, size); + } - const char* grabString(int* length, int offset = 0) - { - int l = offset; - for (; l < size; ++l) - { - if (buffer[l] == 0) - break; - } - *length = l - offset + 1; - char* str = (char*)malloc(*length); - memcpy(str, buffer + offset, *length); - return str; - } + ~Buffer() + { + if (buffer != nullptr) + { + delete[] buffer; + buffer = nullptr; + size = 0; + } + } - int grabInteger(int* length, int offset = 0) - { - *length = sizeof(int); - return *((int*)(buffer + offset)); - } + void append(const void* data, size_t s) + { + if (data == nullptr) + return; + char* buf = buffer; + buffer = new char[size + s]; + memcpy(buffer, buf, size); + memcpy(buffer + size, data, s); + delete[] buf; + size += s; + return; + } - float grabFloat(int* length, int offset = 0) - { - *length = sizeof(float); - return *((float*)(buffer + offset)); - } + /* grab and create a string */ + char* grabString(unsigned int* length, int offset = 0) + { + int l = offset; + for (; l < size; ++l) + { + if (buffer[l] == 0) + break; + } + *length = l - offset + 1; + char* str = (char*)malloc(*length); + memcpy(str, buffer + offset, *length); + return str; + } - bool grabBoolean(int* length, int offset = 0) - { - *length = sizeof(bool); - return *((bool*)(buffer + offset)); - } + int grabInteger(int* length, int offset = 0) + { + *length = sizeof(int); + return *((int*)(buffer + offset)); + } + + float grabFloat(int* length, int offset = 0) + { + *length = sizeof(float); + return *((float*)(buffer + offset)); + } + + bool grabBoolean(int* length, int offset = 0) + { + *length = sizeof(bool); + return *((bool*)(buffer + offset)); + } - char* buffer; - size_t size; + char* buffer; + size_t size; - }; + }; -} // net -} // lua -} // jin + } // namespace Net + } // namespace Lua +} // namespace JinEngine #endif
\ No newline at end of file diff --git a/src/lua/modules/net/net.cpp b/src/lua/modules/net/net.cpp index a984920..4ef9ece 100644 --- a/src/lua/modules/net/net.cpp +++ b/src/lua/modules/net/net.cpp @@ -4,16 +4,17 @@ #include "lua/common/common.h" #include "Buffer.h" -namespace jin +namespace JinEngine { -namespace lua +namespace Lua { - using namespace jin::lua::net; - using namespace jin::net; + + using namespace JinEngine::Lua::Net; + using namespace JinEngine::Net; static int l_initNetwork(lua_State* L) { - jin::net::Net::get()->init(); + JinEngine::Net::NetManager::get()->init(); return 1; } @@ -56,7 +57,7 @@ namespace lua { int size = luax_checkinteger(L, 1); Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); - net::Buffer* buffer = new net::Buffer(size); + Net::Buffer* buffer = new Net::Buffer(size); proxy->bind(new Ref<Buffer>(buffer, JIN_NETWORK_BUFFER)); return 1; } @@ -81,5 +82,5 @@ namespace lua return 1; } -} // lua -} // jin
\ No newline at end of file +} // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/net/socket.cpp b/src/lua/modules/net/socket.cpp index 6d3fdfb..d6de730 100644 --- a/src/lua/modules/net/socket.cpp +++ b/src/lua/modules/net/socket.cpp @@ -4,124 +4,126 @@ #include "libjin/jin.h" #include "Buffer.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::net; - using namespace lua::net; + using namespace JinEngine::Net; + using namespace Lua::Net; - const int BUFFER_SIZE = 1024; + typedef Ref<Socket>& SocketRef; - static inline Ref<Socket>& checkSocket(lua_State* L, int pos = 1) - { - Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_SOCKET); - return proxy->getRef<Socket>(); - } + const int BUFFER_SIZE = 1024; - static inline Ref<Buffer>& checkNetBuffer(lua_State* L, int pos = 1) - { - Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_BUFFER); - return proxy->getRef<Buffer>(); - } + static inline SocketRef checkSocket(lua_State* L, int pos = 1) + { + Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_SOCKET); + return proxy->getRef<Socket>(); + } - // return net.Socket - static int l_accept(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - Socket* client = socket->accept(); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_SOCKET, sizeof(Proxy)); - proxy->bind(new Ref<Socket>(client, JIN_NETWORK_SOCKET)); - return 1; - } + static inline Ref<Buffer>& checkNetBuffer(lua_State* L, int pos = 1) + { + Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_BUFFER); + return proxy->getRef<Buffer>(); + } + + // return net.Socket + static int l_accept(lua_State* L) + { + SocketRef socket = checkSocket(L); + Socket* client = socket->accept(); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_SOCKET, sizeof(Proxy)); + proxy->bind(new Ref<Socket>(client, JIN_NETWORK_SOCKET)); + return 1; + } - // return net.Buffer - static int l_receive(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - char buffer[BUFFER_SIZE] = {0}; - int size = socket->receive(buffer, BUFFER_SIZE); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); - net::Buffer* netBuffer = new net::Buffer(buffer, size); - proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); - return 1; - } + // return net.Buffer + static int l_receive(lua_State* L) + { + SocketRef socket = checkSocket(L); + char buffer[BUFFER_SIZE] = {0}; + int size = socket->receive(buffer, BUFFER_SIZE); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); + Net::Buffer* netBuffer = new Net::Buffer(buffer, size); + proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); + return 1; + } - // Socket:receiveFrom(address, port) - static int l_receiveFrom(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - int address = luax_checkinteger(L, 2); - int port = luax_checkinteger(L, 3); - char buffer[BUFFER_SIZE]; - int size = socket->receiveFrom(buffer, BUFFER_SIZE, address, port); - net::Buffer* netBuffer = new net::Buffer(buffer, size); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); - proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); - return 1; - } + // Socket:receiveFrom(address, port) + static int l_receiveFrom(lua_State* L) + { + SocketRef socket = checkSocket(L); + int address = luax_checkinteger(L, 2); + int port = luax_checkinteger(L, 3); + char buffer[BUFFER_SIZE]; + int size = socket->receiveFrom(buffer, BUFFER_SIZE, address, port); + Net::Buffer* netBuffer = new Net::Buffer(buffer, size); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy)); + proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER)); + return 1; + } - // Socket:send(net.Buffer) -> data_length - static int l_send(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - Ref<Buffer>& ref = checkNetBuffer(L, 2); - int len = socket->send(ref->buffer, ref->size); - luax_pushinteger(L, len); - return 1; - } + // Socket:send(net.Buffer) -> data_length + static int l_send(lua_State* L) + { + SocketRef socket = checkSocket(L); + Ref<Buffer>& ref = checkNetBuffer(L, 2); + int len = socket->send(ref->buffer, ref->size); + luax_pushinteger(L, len); + return 1; + } - // Socket:sendTo(address, port, net.Buffer) - static int l_sendTo(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - int address = luax_checkinteger(L, 2); - int port = luax_checkinteger(L, 3); - Ref<Buffer>& buffer = checkNetBuffer(L, 4); - socket->sendTo(buffer->buffer, buffer->size, address, port); - return 0; - } + // Socket:sendTo(address, port, net.Buffer) + static int l_sendTo(lua_State* L) + { + SocketRef socket = checkSocket(L); + int address = luax_checkinteger(L, 2); + int port = luax_checkinteger(L, 3); + Ref<Buffer>& buffer = checkNetBuffer(L, 4); + socket->sendTo(buffer->buffer, buffer->size, address, port); + return 0; + } - static int l_close(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - socket->close(); - return 0; - } + static int l_close(lua_State* L) + { + SocketRef socket = checkSocket(L); + socket->close(); + return 0; + } - static int l_configBlocking(lua_State* L) - { - Ref<Socket>& socket = checkSocket(L); - bool blocking = luax_checkbool(L, 2); - socket->configureBlocking(blocking); - return 0; - } + static int l_configBlocking(lua_State* L) + { + SocketRef socket = checkSocket(L); + bool blocking = luax_checkbool(L, 2); + socket->configureBlocking(blocking); + return 0; + } - static int l_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_SOCKET); - proxy->release(); - return 0; - } + static int l_gc(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_SOCKET); + proxy->release(); + return 0; + } - static const luaL_Reg socket_function[] = { - { "__gc", l_gc }, - { "accept", l_accept }, - { "receive", l_receive }, - { "receiveFrom", l_receiveFrom }, - { "send", l_send }, - { "sendTo", l_sendTo }, - { "close", l_close }, - { "configBlocking", l_configBlocking }, - { 0, 0 } - }; + static const luaL_Reg socket_function[] = { + { "__gc", l_gc }, + { "accept", l_accept }, + { "receive", l_receive }, + { "receiveFrom", l_receiveFrom }, + { "send", l_send }, + { "sendTo", l_sendTo }, + { "close", l_close }, + { "configBlocking", l_configBlocking }, + { 0, 0 } + }; - int luaopen_Socket(lua_State* L) - { - luax_newtype(L, JIN_NETWORK_SOCKET, socket_function); - return 0; - } + int luaopen_Socket(lua_State* L) + { + luax_newtype(L, JIN_NETWORK_SOCKET, socket_function); + return 0; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/physics/physics.cpp b/src/lua/modules/physics/physics.cpp deleted file mode 100644 index a5b9162..0000000 --- a/src/lua/modules/physics/physics.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "../luax.h" -#include "libjin/Physics/Physics.h" - -namespace jin -{ -namespace lua -{ - - using namespace jin::physics; - - int luaopen_physics(lua_State* L) - { - } - -} // physics -} // jin
\ No newline at end of file diff --git a/src/lua/modules/thread/Thread.cpp b/src/lua/modules/thread/Thread.cpp index 5c9cb1f..e1c5a92 100644 --- a/src/lua/modules/thread/Thread.cpp +++ b/src/lua/modules/thread/Thread.cpp @@ -1,249 +1,252 @@ #include "lua/modules/luax.h" #include "lua/modules/types.h" #include "libjin/jin.h" -#include "lua/modules/jin.h" +#include "lua/jin.h" #include "lua/common/common.h" #include "thread.h" -namespace jin +namespace JinEngine { -namespace lua -{ - - using thread::Thread; - - int luaopen_thread(lua_State* L); - - static inline Ref<Thread>& checkThread(lua_State* L) + namespace Lua { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); - return proxy->getRef<Thread>(); - } - static int threadRunner(void* t) - { - Ref<Thread>& ref = *(Ref<Thread>*)t; - lua_State* L = lua_open(); - luax_openlibs(L); - luaopen_jin(L); - luax_getglobal(L, MODULE_NAME); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); - ref.retain(); - proxy->bind(&ref); - luax_setfield(L, -2, "_curThread"); - luax_dostring(L, ref->code.c_str()); - luax_close(L); - return 0; - } - - static int l_thread_gc(lua_State* L) - { - Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); - proxy->release(); - return 0; - } + using thread::Thread; - static int l_start(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - bool result = ref->start(&ref); - luax_pushboolean(L, result); - return 1; - } + typedef Ref<Thread>& ThreadRef; - static int l_wait(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - ref->wait(); - return 0; - } + int luaopen_thread(lua_State* L); - static int l_send(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - const int vp = 3; - if (luax_isnumberstrict(L, vp)) + static inline ThreadRef checkThread(lua_State* L) { - float real = luax_checknumber(L, vp); - ref->send(slot, real); + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); + return proxy->getRef<Thread>(); } - else if (luax_isbooleanstrict(L, vp)) + + static int threadRunner(void* t) { - bool bol = luax_checkbool(L, vp); - ref->send(slot, bol); + ThreadRef ref = *(Ref<Thread>*)t; + lua_State* L = lua_open(); + luax_openlibs(L); + luaopen_jin(L); + luax_getglobal(L, MODULE_NAME); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); + ref.retain(); + proxy->bind(&ref); + luax_setfield(L, -2, "_curThread"); + luax_dostring(L, ref->code.c_str()); + luax_close(L); + return 0; } - else if (luax_isstringstrict(L, vp)) + + static int l_thread_gc(lua_State* L) { - const char* str = luax_checkstring(L, vp); - ref->send(slot, str); + Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD); + proxy->release(); + return 0; } - else if (luax_isuserdata(L, vp)) + + static int l_start(lua_State* L) { - void* p = luax_touserdata(L, vp); - ref->send(slot, p); + ThreadRef ref = checkThread(L); + bool result = ref->start(&ref); + luax_pushboolean(L, result); + return 1; } - else if (luax_islightuserdata(L, vp)) + + static int l_wait(lua_State* L) { - void* p = luax_tolightuserdata(L, vp); - ref->send(slot, p); + ThreadRef ref = checkThread(L); + ref->wait(); + return 0; } - return 0; - } - static int l_receive(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - bool result = ref->receive(slot); - luax_pushboolean(L, result); - return 1; - } - - static int l_fetch(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - Thread::Variant v = ref->fetch(slot); - switch (v.type) + static int l_send(lua_State* L) { - case thread::Thread::Variant::INTERGER: - luax_pushinteger(L, v.integer); - break; - - case thread::Thread::Variant::BOOLEAN: - luax_pushboolean(L, v.boolean); - break; - - case thread::Thread::Variant::CSTRING: - luax_pushstring(L, v.cstring); - break; - - case thread::Thread::Variant::REAL: - luax_pushnumber(L, v.real); - break; + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + const int vp = 3; + if (luax_isnumberstrict(L, vp)) + { + float real = luax_checknumber(L, vp); + ref->send(slot, real); + } + else if (luax_isbooleanstrict(L, vp)) + { + bool bol = luax_checkbool(L, vp); + ref->send(slot, bol); + } + else if (luax_isstringstrict(L, vp)) + { + const char* str = luax_checkstring(L, vp); + ref->send(slot, str); + } + else if (luax_isuserdata(L, vp)) + { + void* p = luax_touserdata(L, vp); + ref->send(slot, p); + } + else if (luax_islightuserdata(L, vp)) + { + void* p = luax_tolightuserdata(L, vp); + ref->send(slot, p); + } + return 0; + } - case thread::Thread::Variant::POINTER: - Proxy* p = (Proxy*)v.pointer; - Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy)); - p->reference->retain(); - proxy->bind(p->reference); - break; + static int l_receive(lua_State* L) + { + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + bool result = ref->receive(slot); + luax_pushboolean(L, result); + return 1; + } + static int l_fetch(lua_State* L) + { + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + Thread::Variant v = ref->fetch(slot); + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + + case thread::Thread::Variant::POINTER: + Proxy* p = (Proxy*)v.pointer; + Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy)); + p->reference->retain(); + proxy->bind(p->reference); + break; + + } + return 1; } - return 1; - } - static int l_demand(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - Thread::Variant v = ref->demand(slot); - switch (v.type) + static int l_demand(lua_State* L) { - case thread::Thread::Variant::INTERGER: - luax_pushinteger(L, v.integer); - break; + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + Thread::Variant v = ref->demand(slot); + switch (v.type) + { + case thread::Thread::Variant::INTERGER: + luax_pushinteger(L, v.integer); + break; + + case thread::Thread::Variant::BOOLEAN: + luax_pushboolean(L, v.boolean); + break; + + case thread::Thread::Variant::CSTRING: + luax_pushstring(L, v.cstring); + break; + + case thread::Thread::Variant::REAL: + luax_pushnumber(L, v.real); + break; + + case thread::Thread::Variant::POINTER: + Proxy* p = (Proxy*)v.pointer; + const char* objType = p->getObjectType(); + Proxy* proxy = (Proxy*)luax_newinstance(L, objType, sizeof(Proxy)); + p->reference->retain(); + proxy->bind(p->reference); + break; + + } + return 1; + } - case thread::Thread::Variant::BOOLEAN: - luax_pushboolean(L, v.boolean); - break; + static int l_remove(lua_State* L) + { + ThreadRef ref = checkThread(L); + int slot = luax_checkinteger(L, 2); + ref->remove(slot); + return 0; + } - case thread::Thread::Variant::CSTRING: - luax_pushstring(L, v.cstring); - break; + static int l_getName(lua_State* L) + { + ThreadRef ref = checkThread(L); + const char* name = ref->getName(); + luax_pushstring(L, name); + return 1; + } - case thread::Thread::Variant::REAL: - luax_pushnumber(L, v.real); - break; + static int l_isRunning(lua_State* L) + { + ThreadRef ref = checkThread(L); + bool running = ref->isRunning(); + luax_pushboolean(L, running); + return 1; + } - case thread::Thread::Variant::POINTER: - Proxy* p = (Proxy*)v.pointer; - Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy)); - p->reference->retain(); - proxy->bind(p->reference); - break; + static const luaL_Reg thread_function[] = { + { "__gc", l_thread_gc }, + { "start", l_start }, + { "wait", l_wait }, + { "send", l_send }, + { "receive", l_receive }, + { "fetch", l_fetch }, + { "demand", l_demand }, + { "remove", l_remove }, + { "getName", l_getName }, + { "isRunning", l_isRunning }, + { 0, 0 } + }; + + static int luaopen_Thread(lua_State* L) + { + luax_newtype(L, JIN_THREAD_THREAD, thread_function); + return 0; + } + + static int l_newThread(lua_State* L) + { + const char* name = luax_checkstring(L, 1); + const char* code = luax_checkstring(L, 2); + Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); + Thread* thread = new Thread(name, code, threadRunner); + proxy->bind(new Ref<Thread>(thread, JIN_THREAD_THREAD)); + return 1; } - return 1; - } - - static int l_remove(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - int slot = luax_checkinteger(L, 2); - ref->remove(slot); - return 0; - } - static int l_getName(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - const char* name = ref->getName(); - luax_pushstring(L, name); - return 1; - } + static int l_getThread(lua_State* L) + { + luax_getglobal(L, MODULE_NAME); + luax_getfield(L, -1, "_curThread"); + return 1; + } - static int l_isRunning(lua_State* L) - { - Ref<Thread>& ref = checkThread(L); - bool running = ref->isRunning(); - luax_pushboolean(L, running); - return 1; - } - - static const luaL_Reg thread_function[] = { - { "__gc", l_thread_gc }, - { "start", l_start }, - { "wait", l_wait }, - { "send", l_send }, - { "receive", l_receive }, - { "fetch", l_fetch }, - { "demand", l_demand }, - { "remove", l_remove }, - { "getName", l_getName }, - { "isRunning", l_isRunning }, - { 0, 0 } - }; - - static int luaopen_Thread(lua_State* L) - { - luax_newtype(L, JIN_THREAD_THREAD, thread_function); + static const luaL_Reg f[] = { + { "newThread", l_newThread }, + { "getThread", l_getThread }, + { 0, 0 } + }; - return 0; - } - - static int l_newThread(lua_State* L) - { - const char* name = luax_checkstring(L, 1); - const char* code = luax_checkstring(L, 2); - Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy)); - Thread* thread = new Thread(name, code, threadRunner); - proxy->bind(new Ref<Thread>(thread, JIN_THREAD_THREAD)); - return 1; - } - - static int l_getThread(lua_State* L) - { - luax_getglobal(L, MODULE_NAME); - luax_getfield(L, -1, "_curThread"); - return 1; - } - - static const luaL_Reg f[] = { - { "newThread", l_newThread }, - { "getThread", l_getThread }, - { 0, 0 } - }; - - int luaopen_thread(lua_State* L) - { - luaopen_Thread(L); + int luaopen_thread(lua_State* L) + { + luaopen_Thread(L); - luax_newlib(L, f); + luax_newlib(L, f); - return 1; - } + return 1; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/thread/Thread.h b/src/lua/modules/thread/Thread.h index 645d4a1..60d588a 100644 --- a/src/lua/modules/thread/Thread.h +++ b/src/lua/modules/thread/Thread.h @@ -1,94 +1,94 @@ #include "libjin/jin.h" #include "lua/common/common.h" -namespace jin +namespace JinEngine { -namespace lua -{ -namespace thread -{ - - class Thread + namespace Lua { - public: - typedef jin::thread::Thread::Variant Variant; - typedef jin::thread::Thread::ThreadRunner ThreadRunner; - - Thread(std::string _name, std::string _code, ThreadRunner runner) - : name(_name) - , code(_code) - { - thread = new jin::thread::Thread(_name, runner); - } - - ~Thread() - { - delete thread; - } - - bool start(void* p) - { - return thread->start(p); - } - - void wait() - { - thread->wait(); - } - - void send(int slot, const Variant& value) - { - thread->send(slot, value); - } - - bool receive(int slot) - { - return thread->receive(slot); - } - - Variant fetch(int slot) + namespace thread { - return thread->fetch(slot); - } - - Variant demand(int slot) - { - return thread->demand(slot); - } - - void remove(int slot) - { - thread->remove(slot); - } - - const char* getName() - { - return name.c_str(); - } - - bool isRunning() - { - return thread->isRunning(); - } - - void lock() - { - thread->lock(); - } - - void unlock() - { - thread->unlock(); - } - - const std::string name; - const std::string code; - - private: - jin::thread::Thread* thread; - - }; -} // thread -} // lua -} // jin
\ No newline at end of file + class Thread + { + public: + typedef JinEngine::MultiThread::Thread::Variant Variant; + typedef JinEngine::MultiThread::Thread::ThreadRunner ThreadRunner; + + Thread(std::string _name, std::string _code, ThreadRunner runner) + : name(_name) + , code(_code) + { + thread = new JinEngine::MultiThread::Thread(_name, runner); + } + + ~Thread() + { + delete thread; + } + + bool start(void* p) + { + return thread->start(p); + } + + void wait() + { + thread->wait(); + } + + void send(int slot, const Variant& value) + { + thread->send(slot, value); + } + + bool receive(int slot) + { + return thread->receive(slot); + } + + Variant fetch(int slot) + { + return thread->fetch(slot); + } + + Variant demand(int slot) + { + return thread->demand(slot); + } + + void remove(int slot) + { + thread->remove(slot); + } + + const char* getName() + { + return name.c_str(); + } + + bool isRunning() + { + return thread->isRunning(); + } + + void lock() + { + thread->lock(); + } + + void unlock() + { + thread->unlock(); + } + + const std::string name; + const std::string code; + + private: + JinEngine::MultiThread::Thread* thread; + + }; + + } // thread + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/time/time.cpp b/src/lua/modules/time/time.cpp index 39743b4..f6e6f26 100644 --- a/src/lua/modules/time/time.cpp +++ b/src/lua/modules/time/time.cpp @@ -2,37 +2,37 @@ #include <SDL2/SDL.h> #include "libjin/jin.h" -namespace jin -{ -namespace lua +namespace JinEngine { + namespace Lua + { - using namespace jin::time; + using namespace JinEngine::Time; - static int l_sec(lua_State* L) - { - luax_pushnumber(L, getSecond()); - return 1; - } + static int l_sec(lua_State* L) + { + luax_pushnumber(L, getSecond()); + return 1; + } - static int l_sleep(lua_State* L) - { - double sec = luax_checknumber(L, 1); - sleep(sec * 1000.0f); - return 0; - } + static int l_sleep(lua_State* L) + { + double sec = luax_checknumber(L, 1); + sleep(sec * 1000.0f); + return 0; + } - static const luaL_Reg f[] = { - { "second", l_sec }, - { "sleep", l_sleep }, - { 0, 0 }, - }; + static const luaL_Reg f[] = { + { "second", l_sec }, + { "sleep", l_sleep }, + { 0, 0 }, + }; - int luaopen_time(lua_State* L) - { - luax_newlib(L, f); - return 1; - } + int luaopen_time(lua_State* L) + { + luax_newlib(L, f); + return 1; + } -} // lua -} // jin
\ No newline at end of file + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/types.h b/src/lua/modules/types.h index 318f5fa..123604e 100644 --- a/src/lua/modules/types.h +++ b/src/lua/modules/types.h @@ -1,20 +1,25 @@ #ifndef __JIN_MODULES_TYPES_H #define __JIN_MODULES_TYPES_H -// graphics module -#define JIN_GRAPHICS_IMAGE "jin.graphics.Image" -#define JIN_GRAPHICS_SHADER "jin.graphics.Shader" -#define JIN_GRAPHICS_CANVAS "jin.graphics.Canvas" -#define JIN_GRAPHICS_FONT "jin.graphics.Font" - -// audio module -#define JIN_AUDIO_SOURCE "jin.Audio.Source" - -// thread module -#define JIN_THREAD_THREAD "jin.thread.Thread" - -// network module -#define JIN_NETWORK_SOCKET "jin.net.Socket" -#define JIN_NETWORK_BUFFER "jin.net.Buffer" +// graphics module +#define JIN_GRAPHICS_TEXTURE "Texture" +#define JIN_GRAPHICS_SHADER "Shader" +#define JIN_GRAPHICS_CANVAS "Canvas" +#define JIN_GRAPHICS_TEXT "Text" +#define JIN_GRAPHICS_TTFDATA "TTFData" +#define JIN_GRAPHICS_TTF "TTF" +#define JIN_GRAPHICS_TEXTUREFONT "TextureFont" +#define JIN_GRAPHICS_PAGE "Page" +#define JIN_GRAPHICS_BITMAP "Bitmap" + +// audio module +#define JIN_AUDIO_SOURCE "Source" + +// thread module +#define JIN_THREAD_THREAD "Thread" + +// network module +#define JIN_NETWORK_SOCKET "Socket" +#define JIN_NETWORK_BUFFER "Buffer" #endif
\ No newline at end of file diff --git a/src/lua/resources/font.ttf.h b/src/lua/resources/font.ttf.h index 519d723..bb0734f 100644 --- a/src/lua/resources/font.ttf.h +++ b/src/lua/resources/font.ttf.h @@ -1,3291 +1,365 @@ -/* font.ttf */ -static const unsigned char font_ttf[] = -{0,1,0,0,0,15,0,128,0,3,0,112,71,68,69,70,6,99,6,86,0,1,47,228,0,0,0,48,71,80, -79,83,21,171,160,97,0,1,48,20,0,0,25,64,71,83,85,66,114,98,110,249,0,1,73,84, -0,0,1,0,79,83,47,50,184,195,53,95,0,0,1,120,0,0,0,96,86,68,77,88,110,234,118, -79,0,0,16,160,0,0,5,224,99,109,97,112,181,231,186,55,0,0,22,128,0,0,14,170, -103,108,121,102,106,45,90,154,0,0,37,44,0,0,193,8,104,101,97,100,247,103,158, -41,0,0,0,252,0,0,0,54,104,104,101,97,16,38,141,60,0,0,1,52,0,0,0,36,104,109, -116,120,249,22,238,10,0,0,1,216,0,0,14,200,107,101,114,110,54,23,29,253,0,0, -237,156,0,0,32,214,108,111,99,97,165,22,115,246,0,0,230,52,0,0,7,102,109,97, -120,112,3,209,0,248,0,0,1,88,0,0,0,32,110,97,109,101,115,18,167,225,0,1,14, -116,0,0,3,36,112,111,115,116,65,210,41,113,0,1,17,152,0,0,30,73,0,1,0,0,0,1,0, -0,56,128,33,235,95,15,60,245,0,9,8,0,0,0,0,0,196,240,17,46,0,0,0,0,202,162,65, -188,255,85,253,206,9,99,8,115,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,7,108,254,12,0, -0,9,129,255,85,129,252,9,99,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,178,0,1,0,0,3, -178,0,151,0,22,0,95,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,3,3,147,1,144,0, -5,0,4,5,154,5,51,0,0,1,31,5,154,5,51,0,0,3,209,0,102,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,224,0,2,239,72,0,32,91,20,160,0,32,0,0,0,0,112,121,114,115,0,64,0,32,255, -253,6,0,254,0,0,102,7,154,2,0,32,0,1,159,79,1,0,0,4,58,5,176,0,0,0,32,0,2,1, -253,0,0,0,0,0,0,1,253,0,0,1,253,0,0,4,169,0,127,5,218,0,104,4,252,0,64,1,189, -0,126,2,167,0,132,2,175,0,6,3,116,0,88,4,138,0,78,1,199,0,117,3,155,0,167,2, -36,0,161,3,82,0,16,4,129,0,113,4,129,0,195,4,129,0,133,4,129,0,115,4,129,0,72, -4,129,0,152,4,129,0,137,4,129,0,97,4,129,0,102,4,129,0,93,2,5,0,161,2,13,0, -162,4,16,0,71,4,129,0,152,4,48,0,136,3,206,0,58,7,41,0,96,5,15,0,43,5,15,0, -163,5,17,0,118,5,106,0,169,4,99,0,163,4,99,0,163,5,107,0,121,5,159,0,169,2,65, -0,190,4,99,0,74,5,15,0,163,4,99,0,168,6,229,0,163,5,159,0,169,5,116,0,113,5, -15,0,163,5,147,0,113,5,17,0,165,4,228,0,121,4,201,0,37,5,106,0,147,5,15,0,22, -6,227,0,37,5,15,0,66,5,15,0,40,4,201,0,97,2,40,0,143,3,78,0,39,2,40,0,11,3,88, -0,61,3,163,0,4,2,129,0,82,4,102,0,106,4,140,0,143,4,48,0,97,4,140,0,98,4,48,0, -97,2,112,0,28,4,140,0,108,4,140,0,143,2,4,0,159,2,18,255,190,4,26,0,144,2,4,0, -159,6,254,0,143,4,140,0,143,4,140,0,97,4,140,0,143,4,140,0,98,2,205,0,143,4, -47,0,103,2,141,0,26,4,140,0,139,4,6,0,46,6,14,0,45,4,6,0,46,4,6,0,26,4,6,0,94, -2,184,0,63,1,251,0,145,2,184,0,21,5,111,0,128,1,252,0,144,4,98,0,97,4,170,0, -70,5,176,0,104,4,219,0,30,1,243,0,145,4,235,0,90,4,21,0,160,6,68,0,88,3,149,0, -120,3,198,0,77,4,113,0,127,6,68,0,88,3,182,0,103,2,251,0,128,4,73,0,99,3,100, -0,113,3,108,0,106,2,142,0,131,4,140,0,153,3,238,0,63,2,28,0,161,1,253,0,119,2, -45,0,95,3,165,0,120,3,198,0,166,5,175,0,184,6,172,0,184,6,245,0,122,3,246,0, -117,7,207,0,14,4,72,0,88,5,106,0,108,4,185,0,163,4,170,0,137,6,253,0,88,4,178, -0,72,4,146,0,71,4,142,0,97,4,162,0,153,5,162,0,30,2,3,0,153,4,120,0,153,4,53, -0,40,2,46,0,37,5,136,0,160,4,140,0,143,7,168,0,104,7,113,0,97,2,165,0,19,2,4, -0,159,2,191,255,233,5,243,0,108,4,207,0,97,6,97,0,147,5,186,0,139,2,11,255, -188,3,211,0,110,3,154,0,85,3,108,0,129,2,44,0,160,2,184,0,165,2,50,0,18,3,211, -0,135,2,250,0,100,2,161,0,182,2,14,0,36,2,14,0,210,3,191,0,135,0,0,255,187,2, -14,0,148,4,21,0,161,2,29,0,161,4,99,0,163,5,167,0,30,5,116,0,113,5,65,0,49,4, -149,0,123,5,159,0,168,4,149,0,70,5,159,0,84,5,136,0,87,5,86,0,112,4,134,0,98, -4,189,0,157,4,7,0,46,4,140,0,97,4,79,0,98,4,47,0,115,4,140,0,143,4,141,0,119, -2,160,0,197,4,140,0,56,4,19,0,45,4,165,0,79,4,140,0,143,4,78,0,98,4,140,0,97, -4,48,0,81,4,140,0,141,5,170,0,83,5,160,0,91,6,205,0,108,5,234,0,57,5,106,0, -135,8,153,0,69,8,153,0,168,5,254,0,73,5,160,0,169,5,12,0,163,6,39,0,54,6,151, -0,26,5,105,0,120,5,159,0,173,5,159,0,69,5,17,0,66,5,253,0,161,5,117,0,147,8, -31,0,164,8,100,0,164,5,171,0,1,6,213,0,163,5,10,0,163,5,105,0,181,7,33,0,190, -4,187,0,44,4,109,0,97,4,140,0,144,2,231,0,143,5,17,0,69,5,193,0,26,4,79,0,100, -4,140,0,143,4,96,0,153,4,109,0,65,5,248,0,153,4,140,0,143,4,140,0,143,4,24,0, -71,7,34,0,98,4,194,0,143,4,107,0,115,6,109,0,143,6,196,0,143,4,119,255,244,6, -81,0,153,4,89,0,153,4,78,0,99,6,135,0,153,4,139,0,117,4,140,255,242,4,79,0,97, -6,246,0,65,6,245,0,143,4,140,255,242,4,140,0,143,6,206,0,108,6,88,0,127,5,117, -0,113,4,141,0,97,4,141,0,212,4,185,0,251,4,175,1,231,4,174,1,231,4,170,0,105, -4,170,0,105,5,136,0,179,6,124,0,187,2,12,0,145,2,4,0,160,2,28,0,168,1,188,0, -85,3,97,0,145,3,97,0,160,3,88,0,176,4,105,0,70,4,146,0,87,2,183,0,137,5,100,0, -161,7,164,0,64,2,103,0,88,2,103,0,144,3,165,0,59,3,173,0,71,4,170,0,70,4,64,0, -79,5,4,0,103,6,191,0,107,7,86,0,110,7,134,0,111,6,223,0,107,4,162,0,72,5,156, -0,168,4,178,0,70,4,146,0,168,4,215,0,63,8,47,0,104,2,14,255,188,4,48,0,152,4, -56,0,158,4,64,0,154,0,0,0,169,0,0,0,93,4,9,0,125,4,10,255,85,4,15,0,110,4,10, -0,110,3,164,0,129,3,164,0,129,3,165,0,129,1,145,0,96,2,4,0,161,2,4,255,190,3, -12,255,160,3,38,0,113,4,69,0,83,4,170,0,105,4,170,0,73,4,170,0,132,4,170,0, -142,3,251,0,37,4,170,0,130,4,170,0,92,4,170,0,123,4,186,0,39,3,165,0,109,4, -121,0,153,4,146,0,112,4,170,0,153,4,71,0,153,4,31,0,153,4,211,0,112,4,251,0, -153,2,3,0,153,4,15,0,64,4,97,0,153,3,189,0,153,5,248,0,153,5,28,0,153,4,203,0, -112,4,121,0,153,4,227,0,112,4,173,0,153,4,113,0,93,4,48,0,71,5,4,0,137,4,187, -0,39,6,2,0,63,4,137,0,55,4,97,0,30,4,64,0,78,4,121,0,120,2,94,0,78,3,229,0,89, -4,22,0,90,4,104,0,71,4,31,0,90,4,48,0,120,3,189,0,71,4,48,0,88,4,40,0,71,3, -165,0,120,2,45,0,95,3,91,0,113,3,108,0,106,3,148,0,87,3,124,0,114,3,124,0,120, -3,17,0,95,3,132,0,112,3,108,0,104,2,8,0,120,5,15,0,22,4,7,0,46,5,56,0,118,4, -75,0,98,5,15,0,163,4,96,0,153,4,214,0,163,4,8,0,143,8,38,0,168,6,252,0,143,5, -145,0,89,4,66,0,94,7,185,0,169,5,176,0,143,7,55,0,63,5,147,0,73,6,203,0,77,4, -191,255,223,5,118,0,138,3,160,0,116,6,211,0,74,5,199,0,49,7,45,0,191,5,250,0, -151,4,211,0,43,4,73,0,13,8,3,0,169,6,162,0,143,6,118,0,65,7,194,0,69,4,247,0, -118,4,30,0,98,5,174,0,36,5,33,0,70,6,164,0,91,6,229,0,98,6,87,0,54,5,44,0,49, -4,75,0,80,4,9,0,123,5,7,0,91,5,105,0,156,4,100,0,163,3,99,0,143,4,8,0,41,5,15, -0,163,4,104,0,153,5,118,0,147,4,108,0,115,4,140,0,143,5,159,0,169,4,37,0,74,3, -218,0,73,7,13,0,209,6,13,0,186,5,13,0,163,4,139,0,143,4,140,0,95,2,7,0,160,6, -72,0,78,4,65,255,234,5,116,0,113,4,140,0,97,6,210,0,108,6,91,0,127,6,223,0, -149,5,236,0,149,9,22,0,190,7,227,0,153,4,20,0,0,8,41,0,0,4,20,0,0,8,41,0,0,2, -185,0,0,2,10,0,0,1,92,0,0,4,127,0,0,2,48,0,0,1,162,0,0,0,209,0,0,8,52,0,91,8, -53,0,92,3,167,0,5,5,116,0,113,4,140,0,97,0,0,0,0,0,0,0,0,4,241,0,113,5,2,0, -112,8,28,0,59,7,216,0,77,3,96,0,122,5,24,0,152,3,78,0,105,5,233,0,124,8,204,0, -169,3,210,0,106,6,146,0,164,4,140,0,98,3,202,0,161,3,108,0,129,1,253,127,255, -5,106,0,34,5,106,0,34,4,140,0,18,4,201,0,37,3,155,0,167,5,15,0,43,5,15,0,43,5, -15,0,43,5,15,0,43,5,15,0,43,5,15,0,43,5,15,0,43,5,17,0,118,4,99,0,163,4,99,0, -163,4,99,0,163,4,99,0,163,2,65,255,221,2,65,0,190,2,65,255,179,2,65,255,192,5, -159,0,169,5,116,0,113,5,116,0,113,5,116,0,113,5,116,0,113,5,116,0,113,5,106,0, -147,5,106,0,147,5,106,0,147,5,106,0,147,5,15,0,40,4,102,0,106,4,102,0,106,4, -102,0,106,4,102,0,106,4,102,0,106,4,102,0,106,4,102,0,106,4,48,0,97,4,48,0,97, -4,48,0,97,4,48,0,97,4,48,0,97,2,3,255,184,2,3,0,153,2,3,255,142,2,3,255,155,4, -140,0,143,4,140,0,97,4,140,0,97,4,140,0,97,4,140,0,97,4,140,0,97,4,140,0,139, -4,140,0,139,4,140,0,139,4,140,0,139,4,6,0,26,4,6,0,26,5,15,0,43,4,102,0,106,5, -15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,17,0,118,4,48,0,97,5,17,0,118,4, -48,0,97,5,17,0,118,4,48,0,97,5,17,0,118,4,48,0,97,5,106,0,169,4,140,0,98,4,99, -0,163,4,48,0,97,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0, -97,4,99,0,163,4,48,0,97,5,107,0,121,4,140,0,108,5,107,0,121,4,140,0,108,5,107, -0,121,4,140,0,108,5,107,0,121,4,140,0,108,5,159,0,169,4,140,255,127,2,65,255, -199,2,3,255,162,2,65,255,171,2,3,255,134,2,65,255,247,2,3,255,210,2,65,0,57,2, -4,0,27,2,65,0,180,6,164,0,190,4,22,0,159,4,99,0,74,2,11,255,160,5,15,0,163,4, -26,0,144,4,99,0,168,2,4,0,159,4,99,0,168,2,4,0,121,4,99,0,168,2,4,0,159,4,99, -0,156,2,4,0,150,5,159,0,169,4,140,0,143,5,159,0,169,4,140,0,143,5,159,0,169,4, -140,0,143,4,140,0,143,5,116,0,113,4,140,0,97,5,116,0,113,4,140,0,97,5,116,0, -113,4,140,0,97,5,17,0,165,2,205,0,143,5,17,0,165,2,205,0,119,5,17,0,165,2,205, -0,45,4,228,0,121,4,47,0,103,4,228,0,121,4,47,0,103,4,228,0,121,4,47,0,103,4, -228,0,121,4,47,0,103,4,201,0,37,2,141,0,26,4,201,0,37,2,141,0,26,5,106,0,147, -4,140,0,139,5,106,0,147,4,140,0,139,5,106,0,147,4,140,0,139,5,106,0,147,4,140, -0,139,5,106,0,147,4,140,0,139,5,106,0,147,4,140,0,139,6,227,0,37,6,14,0,45,5, -15,0,40,4,6,0,26,5,15,0,40,4,201,0,97,4,6,0,94,4,201,0,97,4,6,0,94,4,201,0,97, -4,6,0,94,7,207,0,14,6,253,0,88,5,106,0,108,4,142,0,97,4,228,0,121,4,47,0,103, -5,15,0,43,4,99,0,163,5,159,0,169,2,65,0,185,5,116,0,113,5,15,0,40,5,86,0,112, -2,160,255,204,5,15,0,43,5,15,0,163,4,99,0,163,4,201,0,97,5,159,0,169,2,65,0, -190,5,15,0,163,6,229,0,163,5,159,0,169,5,116,0,113,5,15,0,163,4,201,0,37,5,15, -0,40,5,15,0,66,2,65,255,192,5,15,0,40,4,134,0,98,4,79,0,98,4,140,0,143,2,160, -0,197,4,140,0,141,4,120,0,153,4,140,0,97,4,140,0,153,4,6,0,46,2,160,255,205,4, -140,0,141,4,140,0,97,4,140,0,141,6,205,0,108,4,99,0,163,4,99,0,163,4,228,0, -121,2,65,0,190,2,65,255,192,4,99,0,74,2,142,0,131,5,17,0,66,5,15,0,163,5,15,0, -43,5,15,0,163,4,99,0,163,4,99,0,163,5,159,0,173,6,229,0,163,5,159,0,169,5,116, -0,113,5,159,0,168,5,15,0,163,5,17,0,118,4,201,0,37,5,159,0,84,5,15,0,66,4,102, -0,106,4,48,0,97,4,140,0,143,4,140,0,97,4,140,0,143,4,48,0,97,4,6,0,26,4,6,0, -46,4,48,0,97,2,231,0,143,4,47,0,103,2,4,0,159,2,3,255,155,2,18,255,190,4,96,0, -153,4,6,0,26,6,227,0,37,6,14,0,45,6,227,0,37,6,14,0,45,6,227,0,37,6,14,0,45,5, -15,0,40,4,6,0,26,1,189,0,126,2,221,0,126,4,54,0,171,4,116,0,28,4,116,0,28,2, -11,255,158,2,4,0,160,6,229,0,163,6,254,0,143,5,15,0,43,4,102,0,106,5,116,0, -113,6,228,0,28,6,228,0,28,4,99,0,163,5,159,0,173,4,48,0,97,4,140,0,143,5,136, -0,87,5,160,0,91,5,15,0,22,4,7,0,46,8,116,0,97,9,129,0,113,5,105,0,120,4,79,0, -100,5,17,0,118,4,48,0,97,5,15,0,40,4,7,0,46,2,65,0,190,6,151,0,26,5,193,0,26, -2,65,0,190,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,7,207,0,14,6,253,0,88, -4,99,0,163,4,48,0,97,5,145,0,89,4,66,0,94,6,151,0,26,5,193,0,26,5,105,0,120,4, -79,0,100,5,159,0,173,4,140,0,143,5,159,0,173,4,140,0,143,5,116,0,113,4,140,0, -97,5,117,0,113,4,141,0,97,5,117,0,113,4,141,0,97,5,105,0,181,4,78,0,99,5,17,0, -66,4,6,0,26,5,17,0,66,4,6,0,26,5,17,0,66,4,6,0,26,5,117,0,147,4,107,0,115,6, -213,0,163,6,81,0,153,5,15,0,66,4,6,0,46,4,140,0,98,5,159,0,69,4,109,0,65,5,15, -0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,0,4,102, -255,163,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5, -15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4, -102,0,106,5,15,0,43,4,102,0,106,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,4, -99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,4,99,255,220,4,48,255,165,4,99,0,163, -4,48,0,97,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,2,65,0,190,2,3,0,153,2,65, -0,180,2,4,0,149,5,116,0,113,4,140,0,97,5,116,0,113,4,140,0,97,5,116,0,113,4, -140,0,97,5,116,0,51,4,140,255,190,5,116,0,113,4,140,0,97,5,116,0,113,4,140,0, -97,5,116,0,113,4,140,0,97,5,243,0,108,4,207,0,97,5,243,0,108,4,207,0,97,5,243, -0,108,4,207,0,97,5,243,0,108,4,140,0,97,5,243,0,108,4,207,0,97,5,106,0,147,4, -140,0,139,5,106,0,147,4,140,0,139,6,97,0,147,5,186,0,139,6,97,0,147,5,186,0, -139,6,97,0,147,5,186,0,139,6,97,0,147,5,186,0,139,6,97,0,147,5,186,0,139,5,15, -0,40,4,6,0,26,5,15,0,40,4,6,0,26,5,15,0,40,4,6,0,26,4,140,0,98,5,15,0,163,4, -24,0,71,5,159,0,169,4,140,0,143,4,201,0,37,4,24,0,71,5,15,0,66,4,6,0,46,5,117, -0,147,4,107,0,115,5,117,0,147,4,107,0,115,4,99,0,163,2,231,0,143,6,151,0,26,5, -193,0,26,6,203,0,77,4,191,255,223,4,140,0,143,4,89,255,156,5,10,255,175,4,89, -255,156,5,10,255,175,4,99,255,205,2,231,255,213,5,15,255,179,4,26,255,157,5, -159,0,173,4,140,0,143,5,159,0,169,4,140,0,143,6,229,0,163,5,248,0,153,4,109,0, -65,5,159,0,69,5,15,0,40,4,7,0,46,5,15,0,66,4,6,0,46,4,99,255,206,2,231,255, -214,6,206,0,108,6,88,0,127,4,79,0,98,4,99,255,237,6,124,0,187,4,252,0,70,2,27, -0,171,2,221,0,126,0,0,0,1,0,1,1,1,1,1,0,12,0,248,8,255,0,8,0,8,255,254,0,9,0, -9,255,253,0,10,0,10,255,253,0,11,0,11,255,253,0,12,0,12,255,253,0,13,0,13,255, -252,0,14,0,14,255,252,0,15,0,15,255,252,0,16,0,16,255,252,0,17,0,17,255,251,0, -18,0,18,255,251,0,19,0,19,255,251,0,20,0,20,255,251,0,21,0,20,255,250,0,22,0, -21,255,250,0,23,0,22,255,250,0,24,0,23,255,250,0,25,0,24,255,249,0,26,0,25, -255,249,0,27,0,26,255,249,0,28,0,27,255,249,0,29,0,28,255,248,0,30,0,29,255, -248,0,31,0,30,255,248,0,32,0,31,255,248,0,33,0,32,255,247,0,34,0,33,255,247,0, -35,0,34,255,247,0,36,0,35,255,247,0,37,0,36,255,246,0,38,0,37,255,246,0,39,0, -38,255,246,0,40,0,39,255,246,0,41,0,39,255,245,0,42,0,40,255,245,0,43,0,41, -255,245,0,44,0,42,255,245,0,45,0,43,255,244,0,46,0,44,255,244,0,47,0,45,255, -244,0,48,0,46,255,244,0,49,0,47,255,243,0,50,0,48,255,243,0,51,0,49,255,243,0, -52,0,50,255,243,0,53,0,51,255,242,0,54,0,52,255,242,0,55,0,53,255,242,0,56,0, -54,255,242,0,57,0,55,255,241,0,58,0,56,255,241,0,59,0,57,255,241,0,60,0,58, -255,241,0,61,0,58,255,240,0,62,0,59,255,240,0,63,0,60,255,240,0,64,0,61,255, -240,0,65,0,62,255,239,0,66,0,63,255,239,0,67,0,64,255,239,0,68,0,65,255,239,0, -69,0,66,255,238,0,70,0,67,255,238,0,71,0,68,255,238,0,72,0,69,255,238,0,73,0, -70,255,237,0,74,0,71,255,237,0,75,0,72,255,237,0,76,0,73,255,237,0,77,0,74, -255,236,0,78,0,75,255,236,0,79,0,76,255,236,0,80,0,77,255,236,0,81,0,77,255, -235,0,82,0,78,255,235,0,83,0,79,255,235,0,84,0,80,255,235,0,85,0,81,255,234,0, -86,0,82,255,234,0,87,0,83,255,234,0,88,0,84,255,234,0,89,0,85,255,233,0,90,0, -86,255,233,0,91,0,87,255,233,0,92,0,88,255,233,0,93,0,89,255,232,0,94,0,90, -255,232,0,95,0,91,255,232,0,96,0,92,255,232,0,97,0,93,255,231,0,98,0,94,255, -231,0,99,0,95,255,231,0,100,0,96,255,231,0,101,0,96,255,230,0,102,0,97,255, -230,0,103,0,98,255,230,0,104,0,99,255,230,0,105,0,100,255,229,0,106,0,101,255, -229,0,107,0,102,255,229,0,108,0,103,255,229,0,109,0,104,255,228,0,110,0,105, -255,228,0,111,0,106,255,228,0,112,0,107,255,228,0,113,0,108,255,227,0,114,0, -109,255,227,0,115,0,110,255,227,0,116,0,111,255,227,0,117,0,112,255,226,0,118, -0,113,255,226,0,119,0,114,255,226,0,120,0,115,255,226,0,121,0,115,255,225,0, -122,0,116,255,225,0,123,0,117,255,225,0,124,0,118,255,225,0,125,0,119,255,224, -0,126,0,120,255,224,0,127,0,121,255,224,0,128,0,122,255,224,0,129,0,123,255, -223,0,130,0,124,255,223,0,131,0,125,255,223,0,132,0,126,255,223,0,133,0,127, -255,222,0,134,0,128,255,222,0,135,0,129,255,222,0,136,0,130,255,222,0,137,0, -131,255,221,0,138,0,132,255,221,0,139,0,133,255,221,0,140,0,134,255,221,0,141, -0,134,255,220,0,142,0,135,255,220,0,143,0,136,255,220,0,144,0,137,255,220,0, -145,0,138,255,219,0,146,0,139,255,219,0,147,0,140,255,219,0,148,0,141,255,219, -0,149,0,142,255,218,0,150,0,143,255,218,0,151,0,144,255,218,0,152,0,145,255, -218,0,153,0,146,255,217,0,154,0,147,255,217,0,155,0,148,255,217,0,156,0,149, -255,217,0,157,0,150,255,216,0,158,0,151,255,216,0,159,0,152,255,216,0,160,0, -153,255,216,0,161,0,153,255,215,0,162,0,154,255,215,0,163,0,155,255,215,0,164, -0,156,255,215,0,165,0,157,255,214,0,166,0,158,255,214,0,167,0,159,255,214,0, -168,0,160,255,214,0,169,0,161,255,213,0,170,0,162,255,213,0,171,0,163,255,213, -0,172,0,164,255,213,0,173,0,165,255,212,0,174,0,166,255,212,0,175,0,167,255, -212,0,176,0,168,255,212,0,177,0,169,255,211,0,178,0,170,255,211,0,179,0,171, -255,211,0,180,0,172,255,211,0,181,0,172,255,210,0,182,0,173,255,210,0,183,0, -174,255,210,0,184,0,175,255,210,0,185,0,176,255,209,0,186,0,177,255,209,0,187, -0,178,255,209,0,188,0,179,255,209,0,189,0,180,255,208,0,190,0,181,255,208,0, -191,0,182,255,208,0,192,0,183,255,208,0,193,0,184,255,207,0,194,0,185,255,207, -0,195,0,186,255,207,0,196,0,187,255,207,0,197,0,188,255,206,0,198,0,189,255, -206,0,199,0,190,255,206,0,200,0,191,255,206,0,201,0,191,255,205,0,202,0,192, -255,205,0,203,0,193,255,205,0,204,0,194,255,205,0,205,0,195,255,204,0,206,0, -196,255,204,0,207,0,197,255,204,0,208,0,198,255,204,0,209,0,199,255,203,0,210, -0,200,255,203,0,211,0,201,255,203,0,212,0,202,255,203,0,213,0,203,255,202,0, -214,0,204,255,202,0,215,0,205,255,202,0,216,0,206,255,202,0,217,0,207,255,201, -0,218,0,208,255,201,0,219,0,209,255,201,0,220,0,210,255,201,0,221,0,210,255, -200,0,222,0,211,255,200,0,223,0,212,255,200,0,224,0,213,255,200,0,225,0,214, -255,199,0,226,0,215,255,199,0,227,0,216,255,199,0,228,0,217,255,199,0,229,0, -218,255,198,0,230,0,219,255,198,0,231,0,220,255,198,0,232,0,221,255,198,0,233, -0,222,255,197,0,234,0,223,255,197,0,235,0,224,255,197,0,236,0,225,255,197,0, -237,0,226,255,196,0,238,0,227,255,196,0,239,0,228,255,196,0,240,0,229,255,196, -0,241,0,229,255,195,0,242,0,230,255,195,0,243,0,231,255,195,0,244,0,232,255, -195,0,245,0,233,255,194,0,246,0,234,255,194,0,247,0,235,255,194,0,248,0,236, -255,194,0,249,0,237,255,193,0,250,0,238,255,193,0,251,0,239,255,193,0,252,0, -240,255,193,0,253,0,241,255,192,0,254,0,242,255,192,0,255,0,243,255,192,0,0,0, -3,0,0,0,3,0,0,8,104,0,1,0,0,0,0,0,28,0,3,0,1,0,0,2,38,0,6,2,10,0,0,0,0,1,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,3,176,3,177,3,175,0,4,0,5, -0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0, -22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37, -0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0, -53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68, -0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0, -84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,0,1,222,1,223,1,225,1, -227,1,234,1,239,1,243,1,246,1,245,1,247,1,249,1,248,1,250,1,252,1,254,1,253,1, -255,2,0,2,2,2,1,2,3,2,4,2,5,2,7,2,6,2,8,2,10,2,9,2,12,2,11,2,13,2,14,1,14,0, -109,0,96,0,97,0,101,1,16,0,115,0,129,0,107,0,103,1,25,0,113,0,102,1,37,0,125, -0,127,1,35,0,110,1,38,1,39,0,99,0,114,1,30,1,32,1,31,0,189,1,36,0,104,0,119,0, -177,0,130,0,133,0,124,0,95,0,106,1,34,0,146,0,0,0,169,0,105,0,120,1,17,0,3,1, -218,1,221,1,238,0,142,0,143,1,5,1,6,1,11,1,12,1,7,1,8,0,132,1,155,2,16,2,123, -1,21,1,24,1,19,1,20,2,224,2,225,1,15,0,116,1,9,1,13,1,18,1,220,1,228,1,219,1, -229,1,226,1,231,1,232,1,233,1,230,1,236,1,237,0,0,1,235,1,241,1,242,1,240,0, -136,0,152,0,158,0,108,0,154,0,155,0,156,0,117,0,159,0,157,0,153,0,4,6,66,0,0, -0,210,0,128,0,6,0,82,0,35,0,126,0,160,0,172,0,173,0,191,0,198,0,207,0,230,0, -239,0,254,1,15,1,17,1,37,1,39,1,48,1,56,1,64,1,83,1,101,1,103,1,126,1,127,1, -146,1,161,1,176,1,240,1,251,1,255,2,25,2,55,2,188,2,199,2,221,2,243,3,1,3,3,3, -15,3,138,3,140,3,146,3,161,3,176,3,185,3,201,3,206,3,210,3,214,4,37,4,47,4,69, -4,79,4,130,4,134,4,206,4,215,4,225,4,245,5,19,30,1,30,63,30,133,30,241,30,243, -30,249,31,77,32,10,32,11,32,21,32,23,32,30,32,34,32,38,32,48,32,51,32,58,32, -60,32,68,32,116,32,127,32,164,32,167,32,172,33,5,33,19,33,22,33,34,33,38,33, -46,33,94,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,96,34,101,37,202,251,2, -251,4,254,255,255,253,255,255,0,0,0,32,0,36,0,160,0,161,0,173,0,174,0,192,0, -199,0,208,0,231,0,240,0,255,1,16,1,18,1,38,1,40,1,49,1,57,1,65,1,84,1,102,1, -104,1,127,1,146,1,160,1,175,1,240,1,250,1,252,2,24,2,55,2,188,2,198,2,216,2, -243,3,0,3,3,3,15,3,132,3,140,3,142,3,147,3,163,3,177,3,186,3,202,3,209,3,214, -4,0,4,38,4,48,4,70,4,80,4,131,4,136,4,207,4,216,4,226,4,246,30,0,30,62,30,128, -30,160,30,242,30,244,31,77,32,0,32,11,32,19,32,23,32,24,32,32,32,37,32,48,32, -50,32,57,32,60,32,68,32,116,32,127,32,163,32,167,32,171,33,5,33,19,33,22,33, -34,33,38,33,46,33,91,34,2,34,6,34,15,34,17,34,26,34,30,34,43,34,96,34,100,37, -202,251,1,251,3,254,255,255,252,255,255,0,0,255,224,0,0,255,190,0,0,255,189,0, -0,1,26,0,0,1,21,0,0,1,17,0,0,1,15,0,0,1,13,0,0,1,11,0,0,1,5,0,0,1,3,0,0,255,0, -254,243,254,230,0,242,0,0,0,134,0,110,254,96,0,39,253,210,253,194,253,173,253, -161,253,160,253,149,0,0,255,0,254,255,0,0,0,0,253,1,0,0,254,223,0,0,253,212,0, -0,252,173,0,0,252,165,0,0,252,124,0,0,254,47,0,0,254,43,0,0,228,230,228,166, -228,85,228,136,227,233,228,134,227,155,225,180,225,185,0,0,0,0,224,239,224, -238,0,0,224,226,226,171,224,218,226,163,224,209,224,162,225,75,0,0,225,41,0,0, -224,200,224,188,224,184,223,247,223,139,224,157,223,191,223,28,222,163,223,16, -223,15,223,8,223,5,222,249,222,197,222,194,219,209,7,223,7,230,2,198,1,195,0, -1,0,210,0,0,0,214,0,0,0,212,0,0,0,210,0,0,0,220,0,0,1,6,0,0,1,32,0,0,1,32,0,0, -1,32,0,0,1,44,0,0,1,78,0,0,1,78,0,0,0,0,0,0,0,0,1,70,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,52,0,0,0,0,1,60,1,88,0,0,1,112,0,0,1,140,0,0,1,140,0,0,1, -212,0,0,1,252,0,0,2,94,0,0,2,232,0,0,2,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,32,3,36,0,0,0,0,3,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,20,0,0,3,20,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,176,3,177,3,175,1,212,1,217,1,218,1,219,1,220,1,221,1,222,1,223,0,125,1, -214,1,234,1,235,1,236,1,237,1,238,1,239,0,126,0,127,1,240,1,241,1,242,1,243,1, -244,0,128,0,129,1,245,1,246,1,247,1,248,1,249,1,250,0,130,0,131,2,5,2,6,2,7,2, -8,2,9,2,10,0,132,0,133,2,11,2,12,2,13,2,14,2,15,0,134,1,213,1,209,0,135,1,215, -0,136,2,62,2,63,2,64,2,65,2,66,2,67,0,137,0,138,0,139,2,76,2,77,2,78,2,79,2, -80,2,81,2,82,0,140,0,141,2,83,2,84,2,85,2,86,2,87,2,88,0,142,0,143,1,216,0, -144,0,145,1,224,1,251,0,165,0,166,2,136,0,167,2,137,2,138,2,139,0,168,0,169,2, -146,2,147,2,148,0,170,2,149,2,150,0,171,2,151,2,152,0,172,2,153,0,173,2,154,0, -174,2,155,2,156,0,175,2,157,0,176,0,177,2,158,2,159,2,160,2,161,2,162,2,163,2, -164,2,165,0,187,2,167,2,168,0,188,2,166,0,189,0,190,0,191,0,192,0,193,0,194,0, -195,1,168,0,196,0,197,1,198,1,171,2,235,2,174,0,198,2,175,0,199,2,176,2,177,2, -178,2,179,0,200,0,201,0,202,2,180,2,236,2,181,0,203,2,183,0,204,2,184,2,185,0, -205,2,186,0,206,0,207,0,208,2,187,2,182,0,209,2,188,2,189,2,190,2,191,2,192,2, -193,2,194,0,210,2,195,2,196,2,197,0,221,0,222,0,223,0,224,2,198,0,225,0,226,0, -227,2,199,0,228,0,229,0,230,0,231,2,200,0,232,2,201,2,202,0,233,2,203,0,234,2, -204,2,237,2,205,0,245,2,206,0,246,2,207,2,208,2,209,2,210,0,247,0,248,0,249,2, -211,2,238,2,212,0,250,0,251,0,252,3,151,3,150,1,133,1,134,1,135,1,136,1,164,1, -165,1,176,1,177,1,178,1,179,1,162,1,163,2,239,2,240,0,253,0,254,1,111,1,112,2, -241,2,242,2,244,2,243,1,172,1,173,3,170,3,171,1,174,1,175,1,113,1,114,1,199,1, -200,1,201,3,156,3,157,3,149,3,148,1,166,1,167,1,153,1,154,3,152,3,153,1,117,1, -118,3,143,3,144,2,245,2,246,3,129,3,130,1,156,1,157,3,154,3,155,1,131,1,132,3, -131,3,132,1,123,1,124,1,119,1,120,1,194,1,195,2,247,2,248,3,133,3,134,2,249,2, -250,3,164,3,165,3,135,3,136,1,125,1,126,3,137,3,138,1,158,1,159,1,129,3,147,1, -127,1,128,3,145,3,146,2,251,2,252,2,253,1,115,1,116,3,162,3,163,1,161,1,160,3, -158,3,159,3,139,3,140,3,160,3,161,1,121,1,122,3,7,3,8,3,9,3,10,3,11,3,12,1,3, -1,4,3,141,3,142,3,33,3,34,3,168,3,169,3,35,3,36,3,166,3,167,1,151,3,37,1,145, -1,146,1,147,1,148,1,149,1,150,1,140,1,139,1,137,1,138,1,141,1,142,1,143,1,144, -1,152,3,172,3,38,3,39,1,5,1,6,3,174,1,193,1,210,1,17,3,173,1,23,3,128,1,24,0, -4,6,66,0,0,0,210,0,128,0,6,0,82,0,35,0,126,0,160,0,172,0,173,0,191,0,198,0, -207,0,230,0,239,0,254,1,15,1,17,1,37,1,39,1,48,1,56,1,64,1,83,1,101,1,103,1, -126,1,127,1,146,1,161,1,176,1,240,1,251,1,255,2,25,2,55,2,188,2,199,2,221,2, -243,3,1,3,3,3,15,3,138,3,140,3,146,3,161,3,176,3,185,3,201,3,206,3,210,3,214, -4,37,4,47,4,69,4,79,4,130,4,134,4,206,4,215,4,225,4,245,5,19,30,1,30,63,30, -133,30,241,30,243,30,249,31,77,32,10,32,11,32,21,32,23,32,30,32,34,32,38,32, -48,32,51,32,58,32,60,32,68,32,116,32,127,32,164,32,167,32,172,33,5,33,19,33, -22,33,34,33,38,33,46,33,94,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,96,34, -101,37,202,251,2,251,4,254,255,255,253,255,255,0,0,0,32,0,36,0,160,0,161,0, -173,0,174,0,192,0,199,0,208,0,231,0,240,0,255,1,16,1,18,1,38,1,40,1,49,1,57,1, -65,1,84,1,102,1,104,1,127,1,146,1,160,1,175,1,240,1,250,1,252,2,24,2,55,2,188, -2,198,2,216,2,243,3,0,3,3,3,15,3,132,3,140,3,142,3,147,3,163,3,177,3,186,3, -202,3,209,3,214,4,0,4,38,4,48,4,70,4,80,4,131,4,136,4,207,4,216,4,226,4,246, -30,0,30,62,30,128,30,160,30,242,30,244,31,77,32,0,32,11,32,19,32,23,32,24,32, -32,32,37,32,48,32,50,32,57,32,60,32,68,32,116,32,127,32,163,32,167,32,171,33, -5,33,19,33,22,33,34,33,38,33,46,33,91,34,2,34,6,34,15,34,17,34,26,34,30,34,43, -34,96,34,100,37,202,251,1,251,3,254,255,255,252,255,255,0,0,255,224,0,0,255, -190,0,0,255,189,0,0,1,26,0,0,1,21,0,0,1,17,0,0,1,15,0,0,1,13,0,0,1,11,0,0,1,5, -0,0,1,3,0,0,255,0,254,243,254,230,0,242,0,0,0,134,0,110,254,96,0,39,253,210, -253,194,253,173,253,161,253,160,253,149,0,0,255,0,254,255,0,0,0,0,253,1,0,0, -254,223,0,0,253,212,0,0,252,173,0,0,252,165,0,0,252,124,0,0,254,47,0,0,254,43, -0,0,228,230,228,166,228,85,228,136,227,233,228,134,227,155,225,180,225,185,0, -0,0,0,224,239,224,238,0,0,224,226,226,171,224,218,226,163,224,209,224,162,225, -75,0,0,225,41,0,0,224,200,224,188,224,184,223,247,223,139,224,157,223,191,223, -28,222,163,223,16,223,15,223,8,223,5,222,249,222,197,222,194,219,209,7,223,7, -230,2,198,1,195,0,1,0,210,0,0,0,214,0,0,0,212,0,0,0,210,0,0,0,220,0,0,1,6,0,0, -1,32,0,0,1,32,0,0,1,32,0,0,1,44,0,0,1,78,0,0,1,78,0,0,0,0,0,0,0,0,1,70,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,52,0,0,0,0,1,60,1,88,0,0,1,112,0,0,1,140, -0,0,1,140,0,0,1,212,0,0,1,252,0,0,2,94,0,0,2,232,0,0,2,248,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,32,3,36,0,0,0,0,3,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,20,0,0, -3,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,3,176,3,177,3,175,1,212,1,217,1,218,1,219,1,220,1,221,1, -222,1,223,0,125,1,214,1,234,1,235,1,236,1,237,1,238,1,239,0,126,0,127,1,240,1, -241,1,242,1,243,1,244,0,128,0,129,1,245,1,246,1,247,1,248,1,249,1,250,0,130,0, -131,2,5,2,6,2,7,2,8,2,9,2,10,0,132,0,133,2,11,2,12,2,13,2,14,2,15,0,134,1,213, -1,209,0,135,1,215,0,136,2,62,2,63,2,64,2,65,2,66,2,67,0,137,0,138,0,139,2,76, -2,77,2,78,2,79,2,80,2,81,2,82,0,140,0,141,2,83,2,84,2,85,2,86,2,87,2,88,0,142, -0,143,1,216,0,144,0,145,1,224,1,251,0,165,0,166,2,136,0,167,2,137,2,138,2,139, -0,168,0,169,2,146,2,147,2,148,0,170,2,149,2,150,0,171,2,151,2,152,0,172,2,153, -0,173,2,154,0,174,2,155,2,156,0,175,2,157,0,176,0,177,2,158,2,159,2,160,2,161, -2,162,2,163,2,164,2,165,0,187,2,167,2,168,0,188,2,166,0,189,0,190,0,191,0,192, -0,193,0,194,0,195,1,168,0,196,0,197,1,198,1,171,2,235,2,174,0,198,2,175,0,199, -2,176,2,177,2,178,2,179,0,200,0,201,0,202,2,180,2,236,2,181,0,203,2,183,0,204, -2,184,2,185,0,205,2,186,0,206,0,207,0,208,2,187,2,182,0,209,2,188,2,189,2,190, -2,191,2,192,2,193,2,194,0,210,2,195,2,196,2,197,0,221,0,222,0,223,0,224,2,198, -0,225,0,226,0,227,2,199,0,228,0,229,0,230,0,231,2,200,0,232,2,201,2,202,0,233, -2,203,0,234,2,204,2,237,2,205,0,245,2,206,0,246,2,207,2,208,2,209,2,210,0,247, -0,248,0,249,2,211,2,238,2,212,0,250,0,251,0,252,3,151,3,150,1,133,1,134,1,135, -1,136,1,164,1,165,1,176,1,177,1,178,1,179,1,162,1,163,2,239,2,240,0,253,0,254, -1,111,1,112,2,241,2,242,2,244,2,243,1,172,1,173,3,170,3,171,1,174,1,175,1,113, -1,114,1,199,1,200,1,201,3,156,3,157,3,149,3,148,1,166,1,167,1,153,1,154,3,152, -3,153,1,117,1,118,3,143,3,144,2,245,2,246,3,129,3,130,1,156,1,157,3,154,3,155, -1,131,1,132,3,131,3,132,1,123,1,124,1,119,1,120,1,194,1,195,2,247,2,248,3,133, -3,134,2,249,2,250,3,164,3,165,3,135,3,136,1,125,1,126,3,137,3,138,1,158,1,159, -1,129,3,147,1,127,1,128,3,145,3,146,2,251,2,252,2,253,1,115,1,116,3,162,3,163, -1,161,1,160,3,158,3,159,3,139,3,140,3,160,3,161,1,121,1,122,3,7,3,8,3,9,3,10, -3,11,3,12,1,3,1,4,3,141,3,142,3,33,3,34,3,168,3,169,3,35,3,36,3,166,3,167,1, -151,3,37,1,145,1,146,1,147,1,148,1,149,1,150,1,140,1,139,1,137,1,138,1,141,1, -142,1,143,1,144,1,152,3,172,3,38,3,39,1,5,1,6,3,174,1,193,1,210,1,17,3,173,1, -23,3,128,1,24,0,0,0,1,0,127,255,48,4,38,6,157,0,44,0,0,1,52,38,39,46,1,53,52, -54,55,53,51,21,30,1,21,35,52,38,35,34,6,21,20,22,23,30,1,21,20,6,7,21,35,53, -46,1,63,1,51,20,22,51,50,54,3,97,127,147,202,206,190,166,158,167,185,196,126, -111,118,118,122,158,204,198,206,180,157,172,220,4,2,190,156,112,129,145,1,120, -90,127,50,61,204,170,165,208,21,221,222,22,230,193,127,158,123,107,97,120,54, -66,197,169,172,203,19,192,191,18,215,208,5,154,131,123,0,0,0,0,5,0,104,255, -235,5,131,5,197,0,13,0,27,0,41,0,55,0,59,0,0,19,52,54,51,50,22,29,1,20,6,35, -34,38,53,51,20,22,51,50,54,61,1,52,38,35,34,6,21,1,52,54,51,50,22,29,1,20,6, -35,34,38,53,51,20,22,51,50,54,61,1,52,38,35,34,6,21,5,39,1,23,104,164,137,137, -164,163,136,138,165,146,81,76,73,80,81,74,75,80,2,47,164,137,136,165,164,135, -138,165,146,81,76,73,80,82,73,74,81,254,15,109,2,199,109,4,152,127,174,173, -128,77,127,172,172,127,74,103,102,75,77,74,105,105,74,252,205,127,173,173,127, -78,128,172,172,128,75,103,103,75,78,74,104,104,74,247,67,4,114,67,0,0,0,3,0, -64,255,235,4,208,5,197,0,33,0,44,0,57,0,0,19,52,54,55,46,1,53,52,54,51,50,22, -21,20,6,15,1,1,62,1,53,51,20,6,7,23,7,35,39,14,1,35,34,36,5,50,54,55,1,7,14,1, -21,20,22,3,20,22,23,55,62,1,53,52,38,35,34,6,64,141,140,78,76,195,171,158,198, -105,103,109,1,84,41,46,176,78,74,185,2,229,85,80,194,104,217,254,255,1,218,72, -140,62,254,151,40,91,59,142,15,54,54,138,57,41,97,78,81,88,1,136,122,183,92, -99,155,82,169,183,182,128,98,143,75,80,254,103,65,158,88,132,224,89,223,5,102, -60,63,230,76,49,46,1,179,29,68,124,50,113,146,3,226,53,115,68,95,38,89,54,61, -94,113,0,0,1,0,126,3,183,1,68,5,176,0,5,0,0,1,3,35,19,53,51,1,68,101,97,1,197, -4,209,254,230,1,9,240,0,0,0,0,1,0,132,254,49,2,157,6,100,0,17,0,0,19,16,0,55, -31,1,6,2,17,21,16,18,23,7,35,38,0,17,132,1,62,175,6,38,137,203,202,138,38,6, -175,254,194,2,79,1,138,2,46,93,1,116,107,254,40,254,165,13,254,165,254,40,116, -108,93,2,45,1,139,0,0,0,0,1,0,6,254,49,2,31,6,100,0,17,0,0,1,16,0,7,35,39,54, -18,17,53,16,2,39,55,51,22,0,17,2,31,254,193,174,6,38,135,205,211,129,38,6,174, -1,63,2,70,254,117,253,211,93,108,105,1,225,1,93,13,1,86,1,227,110,108,93,253, -210,254,118,0,0,0,0,1,0,88,1,134,3,27,4,57,0,14,0,0,1,39,55,23,39,51,3,55,23, -7,23,7,39,7,39,1,68,236,49,236,10,161,10,233,48,242,153,132,140,135,133,2,184, -67,154,90,254,254,252,89,156,68,200,96,218,210,92,0,0,0,0,1,0,78,0,146,4,52,4, -182,0,11,0,0,1,33,21,33,17,35,17,33,53,33,17,51,2,165,1,143,254,113,197,254, -110,1,146,197,3,15,178,254,53,1,203,178,1,167,0,1,0,117,254,254,1,59,0,221,0, -5,0,0,5,7,35,19,53,51,1,59,101,97,1,197,8,250,1,3,220,0,0,1,0,167,2,26,2,245, -2,180,0,3,0,0,1,33,53,33,2,245,253,178,2,78,2,26,154,0,0,1,0,161,0,0,1,102,0, -202,0,3,0,0,33,35,53,51,1,102,197,197,202,0,0,1,0,16,255,131,3,23,5,176,0,3,0, -0,23,35,1,51,184,168,2,96,167,125,6,45,0,0,0,2,0,113,255,235,4,16,5,197,0,13, -0,27,0,0,1,20,2,35,34,2,53,17,52,18,51,50,18,21,39,52,38,35,34,6,21,17,20,22, -51,50,54,53,4,16,251,212,211,253,251,211,212,253,197,140,128,127,138,141,126, -128,138,2,2,247,254,224,1,32,247,1,172,245,1,34,254,222,245,41,157,182,182, -157,254,3,157,184,183,158,0,0,0,1,0,195,0,0,2,198,5,197,0,5,0,0,33,35,17,5,53, -37,2,198,198,254,195,2,3,4,250,3,152,54,0,1,0,133,0,0,4,30,5,197,0,26,0,0,41, -1,53,1,62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,1,23,33,4,30, -252,120,1,201,122,87,118,104,129,135,190,2,5,248,213,195,224,127,130,254,145, -2,2,151,135,2,33,148,175,89,101,129,158,118,6,178,247,216,171,115,220,166,254, -82,5,0,1,0,115,255,235,4,15,5,197,0,42,0,0,1,50,54,53,52,38,35,34,6,21,35,39, -38,36,51,50,22,21,20,6,7,30,1,21,20,6,35,34,36,63,1,51,20,22,51,50,54,53,52, -38,43,1,53,2,67,132,109,119,117,114,149,188,3,5,1,2,201,203,230,107,96,110, -115,253,202,186,254,229,5,2,188,153,121,120,138,127,136,162,3,60,131,118,110, -135,141,106,6,164,232,205,199,102,168,47,44,179,127,200,227,219,180,6,106,145, -149,120,137,136,153,0,0,2,0,72,0,0,4,70,5,176,0,10,0,15,0,0,1,51,21,35,17,35, -17,33,53,1,51,1,33,17,39,7,3,125,201,201,196,253,143,2,101,208,253,158,1,158, -6,19,1,234,154,254,176,1,80,111,3,241,252,58,2,171,1,50,0,1,0,152,255,235,4, -19,5,176,0,31,0,0,27,1,33,21,33,3,62,1,55,54,18,21,20,2,35,34,38,63,1,51,20, -22,51,50,54,53,52,38,35,34,6,7,175,84,2,217,253,205,47,47,114,73,202,229,235, -225,185,246,5,2,178,137,109,125,138,139,124,116,104,25,2,135,3,41,175,254,93, -35,45,1,2,254,255,224,219,254,246,202,196,6,119,131,176,153,139,172,70,73,0,0, -0,2,0,137,255,235,4,40,5,197,0,26,0,39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62, -1,51,50,22,21,20,2,35,34,0,25,1,16,0,19,34,6,7,21,20,22,51,50,54,53,52,38,2, -129,86,168,55,42,57,126,84,137,171,61,167,96,188,219,245,208,202,254,240,1,35, -166,93,133,35,161,117,123,133,143,5,197,34,26,151,25,31,234,179,113,61,70,252, -205,224,254,245,1,51,1,10,1,79,1,0,1,78,253,71,79,67,101,185,215,187,150,142, -168,0,0,0,1,0,97,0,0,4,39,5,176,0,12,0,0,1,0,2,17,21,35,53,16,18,19,33,53,33, -4,39,254,236,194,197,243,230,252,252,3,198,5,21,254,184,254,10,254,200,159, -159,1,74,2,17,1,27,155,0,3,0,102,255,235,4,26,5,197,0,23,0,35,0,47,0,0,1,20,6, -7,30,1,21,20,4,35,34,36,53,52,54,55,46,1,53,52,54,51,50,22,3,52,38,35,34,6,21, -20,22,51,50,54,3,52,38,35,34,6,21,20,22,51,50,54,3,242,128,106,124,150,254, -251,202,214,254,241,153,130,112,130,245,197,186,239,156,155,114,124,162,161, -127,114,153,41,131,97,107,138,140,107,97,129,4,60,114,173,43,43,188,123,201, -220,220,201,123,188,44,42,173,114,191,202,203,252,154,119,154,154,119,123,148, -149,3,31,105,136,131,110,111,138,138,0,0,2,0,93,255,235,3,248,5,197,0,26,0,39, -0,0,37,50,54,61,1,14,1,35,34,2,53,52,18,51,50,0,21,17,20,0,35,34,38,39,55,30, -1,19,50,54,55,53,52,38,35,34,6,21,20,22,1,245,142,175,48,143,85,210,239,254, -187,218,1,8,254,224,227,77,161,70,30,66,127,126,103,141,32,146,132,107,143, -132,133,196,180,124,71,73,1,3,230,220,1,23,254,238,250,254,70,251,254,231,32, -31,150,32,27,1,254,94,73,172,163,177,191,153,150,185,255,255,0,161,0,0,1,102, -4,54,0,38,0,14,0,0,0,7,0,14,0,0,3,108,255,255,0,162,254,254,1,110,4,54,0,39,0, -14,0,1,3,108,0,6,0,12,51,0,0,1,0,71,0,107,3,119,3,245,0,9,0,0,1,7,21,23,5,21, -1,53,1,21,1,72,85,85,2,47,252,208,3,48,2,67,18,6,19,228,201,1,123,149,1,122, -201,0,0,2,0,152,1,151,3,218,3,219,0,3,0,7,0,0,1,33,53,33,17,33,53,33,3,218, -252,190,3,66,252,190,3,66,3,55,164,253,188,164,0,1,0,136,0,87,3,224,3,225,0,9, -0,0,19,53,1,21,1,53,37,55,53,39,136,3,88,252,168,2,86,85,85,3,30,195,254,134, -149,254,133,196,238,17,6,20,0,0,0,2,0,58,0,0,3,118,5,197,0,26,0,30,0,0,1,62,1, -55,62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,14,1,21,19,35,53, -51,1,99,1,48,102,99,84,113,105,91,128,188,3,3,233,180,197,218,141,116,54,23,7, -206,206,1,154,145,112,92,117,126,89,106,114,99,96,6,161,194,201,180,129,214, -112,54,86,91,254,102,208,0,0,0,2,0,96,254,59,6,213,5,151,0,51,0,67,0,0,1,6,2, -35,34,38,39,14,1,35,34,38,55,26,1,51,50,22,23,7,51,3,6,22,51,50,54,55,18,0,33, -32,0,3,2,0,33,50,54,55,23,14,1,35,32,0,19,18,0,33,32,0,1,6,22,51,50,54,55,38, -54,55,19,46,1,35,34,6,6,196,9,222,221,73,106,23,50,144,96,125,138,18,23,229, -165,105,128,75,4,6,51,9,61,51,123,148,8,16,254,192,254,176,254,204,254,137,15, -18,1,80,1,58,88,181,62,38,67,207,99,254,132,254,97,18,19,1,204,1,116,1,123,1, -149,251,251,11,65,74,64,106,44,1,1,2,47,26,57,31,125,132,1,246,214,254,203,83, -76,80,79,241,196,1,3,1,57,52,54,4,253,183,110,83,227,175,1,126,1,171,254,50, -254,141,254,136,254,75,43,35,107,42,47,1,243,1,176,1,167,2,18,254,12,253,253, -142,148,49,63,12,27,16,2,26,12,14,219,0,0,2,0,43,0,0,4,227,5,176,0,7,0,11,0,0, -1,33,3,35,1,51,1,35,1,33,3,35,3,154,253,220,130,201,2,13,169,2,2,201,253,149, -1,179,212,6,1,119,254,137,5,176,250,80,2,28,2,113,0,0,0,3,0,163,0,0,4,198,5, -176,0,14,0,24,0,33,0,0,51,17,33,50,4,21,20,6,7,30,1,21,20,4,35,1,17,33,50,54, -53,52,38,39,35,37,33,50,54,53,52,38,35,33,163,1,219,228,1,2,116,96,143,167, -254,252,222,254,132,1,124,135,149,152,129,13,254,142,1,63,110,138,149,140,254, -234,5,176,197,197,94,149,39,20,208,141,200,211,2,171,253,239,133,122,121,148, -5,154,121,108,118,117,0,0,0,1,0,118,255,235,4,191,5,197,0,29,0,0,1,23,22,0,35, -34,0,25,1,16,0,51,50,0,15,1,35,52,38,35,34,2,21,17,20,18,51,50,54,53,4,185,2, -4,254,216,243,247,254,201,1,55,247,247,1,36,4,2,189,180,164,165,196,196,165, -164,180,1,210,6,205,254,236,1,94,1,13,1,3,1,13,1,95,254,249,217,6,153,178,254, -246,197,254,251,199,254,246,177,156,0,0,2,0,169,0,0,4,235,5,176,0,9,0,19,0,0, -51,17,33,32,0,17,21,16,0,33,1,17,33,50,18,61,1,52,2,35,169,1,202,1,29,1,91, -254,165,254,227,254,251,1,5,202,233,233,202,5,176,254,161,254,234,199,254,233, -254,163,5,21,251,133,1,10,208,201,206,1,10,0,0,0,0,1,0,163,0,0,4,36,5,176,0, -11,0,0,1,33,17,33,21,33,17,33,21,33,17,33,3,190,253,170,2,188,252,127,3,118, -253,79,2,86,2,163,253,247,154,5,176,155,254,41,0,0,0,1,0,163,0,0,4,52,5,176,0, -9,0,0,1,33,17,35,17,33,21,33,17,33,3,206,253,154,197,3,145,253,52,2,102,2,132, -253,124,5,176,155,254,10,0,1,0,121,255,235,4,193,5,197,0,32,0,0,37,6,4,35,34, -0,25,1,16,0,51,50,0,15,1,35,52,38,35,34,6,21,17,20,22,51,50,54,55,17,33,53,33, -4,193,52,254,255,205,252,254,182,1,62,251,243,1,26,4,2,189,172,158,167,204, -216,168,129,151,37,254,182,2,15,196,81,136,1,78,1,9,1,44,1,9,1,78,254,253,200, -6,133,177,250,192,254,210,194,251,67,46,1,72,154,0,1,0,169,0,0,4,246,5,176,0, -11,0,0,33,35,17,33,17,35,17,51,17,33,17,51,4,246,197,253,61,197,197,2,195,197, -2,131,253,125,5,176,253,110,2,146,0,0,0,1,0,190,0,0,1,132,5,176,0,3,0,0,33,35, -17,51,1,132,198,198,5,176,0,1,0,74,255,235,3,188,5,176,0,16,0,0,1,51,17,20,6, -35,34,38,63,1,51,20,22,51,50,54,53,2,247,197,247,197,201,237,5,2,189,126,116, -109,138,5,176,251,246,203,240,213,203,6,136,132,158,131,0,0,0,1,0,163,0,0,4, -251,5,176,0,14,0,0,1,35,17,35,17,51,17,51,1,51,23,9,1,7,35,1,251,147,197,197, -128,2,8,222,2,253,196,2,103,3,239,2,146,253,110,5,176,253,124,2,132,5,253,80, -253,10,5,0,0,0,0,1,0,168,0,0,4,51,5,176,0,5,0,0,37,33,21,33,17,51,1,109,2,198, -252,117,197,154,154,5,176,0,0,1,0,163,0,0,6,65,5,176,0,15,0,0,1,51,1,51,17,35, -17,39,1,35,1,7,17,35,17,33,3,117,6,1,209,245,197,6,254,71,137,254,58,6,197,1, -3,1,17,4,159,250,80,4,67,1,251,188,4,104,1,251,153,5,176,0,0,0,0,1,0,169,0,0, -4,246,5,176,0,11,0,0,33,35,1,7,17,35,17,51,1,55,17,51,4,246,197,253,67,6,197, -197,2,189,6,197,4,88,2,251,170,5,176,251,169,2,4,85,0,0,0,2,0,113,255,235,5,2, -5,197,0,13,0,27,0,0,1,16,0,33,34,0,25,1,16,0,51,32,0,17,39,52,2,35,34,2,21,17, -20,18,51,50,54,53,5,2,254,181,254,248,255,254,193,1,63,255,1,8,1,75,197,216, -182,172,205,205,172,183,215,2,86,254,245,254,160,1,96,1,11,1,3,1,10,1,98,254, -159,254,245,2,200,1,0,255,0,200,254,251,202,255,0,255,203,0,0,2,0,163,0,0,4, -188,5,176,0,10,0,19,0,0,1,17,35,17,33,50,4,21,20,4,35,37,33,50,54,53,52,38,35, -33,1,104,197,2,45,233,1,3,254,253,233,254,152,1,104,148,146,147,147,254,152,2, -72,253,184,5,176,240,196,198,238,154,159,121,121,162,0,2,0,113,255,113,5,90,5, -197,0,19,0,33,0,0,1,20,6,7,23,7,39,14,1,35,34,0,25,1,16,0,51,32,0,17,39,52,2, -35,34,2,21,17,20,18,51,50,54,53,5,2,67,62,217,135,222,70,164,92,255,254,193,1, -63,255,1,8,1,75,197,216,182,172,205,205,172,183,215,2,86,115,205,81,211,129, -213,45,46,1,96,1,11,1,3,1,10,1,98,254,159,254,245,2,200,1,0,255,0,200,254,251, -202,255,0,255,203,0,0,0,0,2,0,165,0,0,4,213,5,175,0,26,0,35,0,0,1,17,35,17,33, -50,22,21,20,6,7,30,1,29,1,20,22,23,21,35,46,1,61,1,52,38,35,37,33,50,54,53,52, -38,35,33,1,106,197,2,5,239,253,117,112,120,105,30,37,203,39,22,138,116,254, -155,1,45,167,147,143,152,254,192,2,119,253,137,5,175,212,202,112,166,49,39, -175,129,137,68,108,34,24,34,132,70,133,118,144,155,127,130,123,135,0,0,0,1,0, -121,255,235,4,131,5,197,0,39,0,0,1,52,38,39,46,1,53,52,36,51,50,0,15,1,35,52, -38,35,34,6,21,20,22,23,30,1,21,20,4,35,34,36,63,1,51,20,22,51,50,54,3,190,144, -185,220,243,1,4,212,230,1,17,4,3,188,173,135,137,138,155,179,225,233,254,233, -221,211,254,189,5,2,188,208,131,138,165,1,130,95,118,48,54,214,163,172,227, -254,251,174,6,124,162,133,108,96,127,47,59,204,160,178,231,236,198,6,137,149, -143,0,0,0,1,0,37,0,0,4,164,5,176,0,7,0,0,1,33,17,35,17,33,53,33,4,164,254,32, -197,254,38,4,127,5,21,250,235,5,21,155,0,0,0,1,0,147,255,235,4,220,5,176,0,17, -0,0,1,17,20,0,35,34,0,53,17,51,17,20,22,51,50,54,53,17,4,220,254,200,246,237, -254,210,197,191,151,160,201,5,176,252,57,240,254,242,1,15,239,3,199,252,57, -167,189,189,167,3,199,0,0,0,0,1,0,22,0,0,4,249,5,176,0,9,0,0,1,23,51,55,1,51, -1,35,1,51,2,100,33,6,33,1,120,213,253,227,169,253,227,214,1,126,121,121,4,50, -250,80,5,176,0,1,0,37,0,0,6,191,5,176,0,21,0,0,1,31,1,55,1,51,1,23,51,55,19, -51,1,35,1,39,35,7,1,35,1,51,1,206,25,6,34,1,2,193,1,4,34,6,27,208,214,254,160, -176,254,221,22,6,21,254,217,176,254,161,213,1,249,191,1,192,3,183,252,73,195, -195,3,183,250,80,3,242,131,131,252,14,5,176,0,1,0,66,0,0,4,214,5,176,0,11,0,0, -9,1,51,9,1,35,9,1,35,9,1,51,2,138,1,84,238,254,50,1,216,235,254,163,254,162, -238,1,216,254,50,236,3,120,2,56,253,46,253,34,2,66,253,190,2,222,2,210,0,0,0, -1,0,40,0,0,4,226,5,176,0,8,0,0,9,1,51,1,17,35,17,1,51,2,133,1,124,225,254,1, -196,254,9,225,2,204,2,228,252,80,254,0,2,15,3,161,0,0,0,1,0,97,0,0,4,109,5, -176,0,9,0,0,37,33,21,33,53,1,33,53,33,21,1,63,3,46,251,244,3,10,253,1,3,224, -154,154,146,4,131,155,141,0,0,1,0,143,254,200,2,16,6,128,0,7,0,0,1,35,17,51, -21,33,17,33,2,16,188,188,254,127,1,129,5,229,249,126,155,7,184,0,0,0,0,1,0,39, -255,131,3,65,5,176,0,3,0,0,19,51,1,35,39,186,2,96,186,5,176,249,211,0,0,1,0, -11,254,200,1,141,6,128,0,7,0,0,19,33,17,33,53,51,17,35,11,1,130,254,126,189, -189,6,128,248,72,155,6,130,0,1,0,61,2,217,3,24,5,176,0,9,0,0,19,35,1,51,1,35, -3,39,35,7,244,183,1,43,134,1,42,181,166,16,6,16,2,217,2,215,253,41,1,163,70, -70,0,0,0,1,0,4,255,102,3,159,0,0,0,3,0,0,5,33,53,33,3,159,252,101,3,155,154, -154,0,0,0,1,0,82,4,228,1,234,5,238,0,4,0,0,1,35,3,55,51,1,234,158,250,3,230,4, -228,1,4,6,0,0,0,2,0,106,255,235,3,243,4,78,0,32,0,43,0,0,33,46,1,39,14,1,35, -34,38,53,52,54,59,1,53,52,38,35,34,6,21,7,39,38,54,51,50,22,21,17,20,22,23,37, -50,54,55,53,35,34,6,21,20,22,3,40,10,11,1,55,177,102,169,177,251,215,214,116, -106,96,118,187,2,7,235,186,184,224,12,16,253,238,107,172,26,221,119,143,90,49, -75,38,78,105,173,152,155,175,107,95,111,96,67,2,6,118,196,187,176,253,247,58, -108,52,144,110,71,176,120,81,72,84,0,2,0,143,255,235,4,43,6,24,0,17,0,31,0,0, -1,20,2,35,34,38,39,7,35,17,51,17,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1, -51,50,54,53,4,43,225,197,108,159,52,32,151,197,51,151,101,200,224,197,137,140, -91,125,37,38,123,94,139,136,1,244,234,254,225,85,83,147,6,24,253,162,72,76, -254,192,254,251,186,235,89,75,254,43,80,90,198,163,0,0,0,1,0,97,255,235,3,217, -4,78,0,29,0,0,37,50,54,53,51,23,22,6,35,34,2,61,1,52,18,51,50,22,15,1,35,52, -38,35,34,6,29,1,20,22,2,61,91,136,178,3,4,248,164,228,248,249,227,181,231,4,2, -179,129,98,145,133,131,133,121,88,6,140,217,1,54,231,42,229,1,55,224,163,6,99, -139,225,160,42,163,224,0,0,0,2,0,98,255,235,3,245,6,24,0,17,0,31,0,0,19,16,18, -51,50,22,23,17,51,17,35,39,14,1,35,34,2,53,51,20,22,51,50,54,55,17,46,1,35,34, -6,21,98,223,201,95,147,52,197,151,30,53,156,103,198,224,197,134,141,88,120,38, -38,121,85,142,135,2,9,1,5,1,64,70,67,2,83,249,232,137,78,80,1,31,234,164,197, -80,72,1,249,67,79,234,187,0,0,0,0,2,0,97,255,235,3,226,4,78,0,22,0,31,0,0,5, -34,0,61,1,52,0,51,50,18,29,1,33,7,6,22,51,50,54,55,23,14,1,3,34,6,7,23,33,53, -52,38,2,100,242,254,239,1,13,194,217,217,253,76,2,1,155,158,98,116,79,49,54, -155,185,103,135,15,2,1,232,116,21,1,43,242,44,233,1,49,254,242,224,104,5,162, -204,41,42,139,39,59,3,200,159,124,5,16,118,154,0,0,0,1,0,28,0,0,2,173,6,45,0, -23,0,0,51,17,35,53,51,53,52,54,51,50,22,23,7,46,1,35,34,6,29,1,51,21,35,17, -198,170,170,180,162,34,69,42,24,18,51,27,87,83,196,196,3,168,146,137,173,189, -11,10,150,4,6,103,98,137,146,252,88,0,0,2,0,108,254,75,4,0,4,78,0,29,0,43,0,0, -19,16,18,51,50,22,23,55,51,17,20,6,35,34,38,39,55,30,1,51,50,54,61,1,14,1,35, -34,2,53,51,20,22,51,50,54,55,17,46,1,35,34,6,21,108,223,200,103,156,53,24,157, -242,228,78,181,69,30,57,161,78,144,131,53,148,97,198,223,197,134,140,89,120, -39,38,122,86,141,135,2,9,1,5,1,64,83,78,141,251,192,208,223,43,37,153,30,37, -131,134,123,68,70,1,31,234,163,198,81,74,1,242,69,81,234,187,0,0,1,0,143,0,0, -4,0,6,24,0,19,0,0,1,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,51,1, -84,56,163,99,173,193,197,115,114,88,130,40,197,197,3,169,78,87,208,216,253,90, -2,168,134,128,69,62,252,213,6,24,0,0,2,0,159,0,0,1,100,6,24,0,3,0,7,0,0,33,35, -17,51,17,35,53,51,1,100,197,197,197,197,4,58,1,21,201,0,0,2,255,190,254,75,1, -114,6,24,0,15,0,19,0,0,1,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,19,35,53, -51,1,114,172,153,31,51,29,14,14,52,17,65,77,191,197,197,4,58,251,109,167,181, -9,9,155,5,7,88,99,4,147,1,25,197,0,0,0,1,0,144,0,0,4,11,6,24,0,12,0,0,1,35,17, -35,17,51,17,51,1,51,9,1,35,1,206,121,197,197,119,1,49,236,254,137,1,153,233,1, -243,254,13,6,24,252,120,1,170,254,14,253,184,0,0,1,0,159,0,0,1,100,6,24,0,3,0, -0,33,35,17,51,1,100,197,197,6,24,0,1,0,143,0,0,6,111,4,78,0,35,0,0,1,23,62,1, -51,50,22,23,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,21,17,35,17,52,38,35,34, -6,7,17,35,17,1,63,14,53,163,108,108,155,39,52,167,112,165,192,197,110,109,101, -125,11,198,113,106,90,116,31,197,4,58,142,77,85,100,100,93,107,227,228,253, -121,2,137,160,133,140,107,8,253,81,2,137,152,141,74,67,252,223,4,58,0,0,0,0,1, -0,143,0,0,3,253,4,78,0,19,0,0,1,23,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7, -17,35,17,1,63,14,54,163,104,175,192,197,113,116,91,127,37,197,4,58,161,86,95, -205,214,253,85,2,167,143,120,73,66,252,221,4,58,0,2,0,97,255,235,4,42,4,78,0, -13,0,27,0,0,19,52,0,51,50,0,29,1,20,0,35,34,0,53,51,20,22,51,50,54,61,1,52,38, -35,34,6,21,97,1,4,223,225,1,5,254,252,224,224,254,251,197,145,143,141,146,147, -142,141,145,2,39,240,1,55,254,202,241,22,242,254,204,1,53,241,172,224,224,172, -22,170,226,226,170,0,0,0,2,0,143,254,96,4,41,4,78,0,17,0,31,0,0,1,20,2,35,34, -38,39,17,35,17,51,23,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1,51,50,54,53, -4,41,224,197,100,151,53,197,151,31,53,158,105,201,223,197,145,141,85,120,37, -37,120,87,140,144,1,244,234,254,225,67,67,253,239,5,218,140,78,82,254,193,254, -250,184,237,77,67,253,245,67,75,205,162,0,0,0,2,0,98,254,96,3,234,4,78,0,17,0, -31,0,0,19,16,18,51,50,22,23,55,51,17,35,17,14,1,35,34,2,53,51,20,22,51,50,54, -55,17,46,1,35,34,6,21,98,223,201,98,150,53,28,151,197,52,142,91,198,224,197, -135,140,81,115,39,39,115,79,141,136,2,9,1,5,1,64,75,71,126,250,38,2,6,61,62,1, -31,234,164,203,72,65,2,34,61,70,239,187,0,0,0,0,1,0,143,0,0,2,170,4,78,0,15,0, -0,1,39,34,6,7,17,35,17,51,23,62,1,51,50,22,23,2,143,101,78,107,29,197,176,14, -45,138,91,22,40,13,3,140,6,74,67,252,251,4,58,168,88,100,7,4,0,0,1,0,103,255, -235,3,201,4,78,0,39,0,0,1,52,38,39,46,1,53,52,54,51,50,22,15,1,35,52,38,35,34, -6,21,20,22,23,30,1,21,20,6,35,34,38,63,1,51,30,1,51,50,54,3,4,99,138,191,205, -225,179,184,228,5,2,188,123,94,104,103,89,139,199,206,233,188,207,238,6,2,188, -5,146,98,105,119,1,35,65,82,31,41,148,124,132,188,200,133,6,70,114,94,65,64, -70,29,42,154,124,144,182,210,140,6,105,97,89,0,0,0,1,0,26,255,235,2,98,5,63,0, -23,0,0,1,17,51,21,35,17,20,22,51,50,54,55,23,14,1,35,34,38,53,17,35,53,51,17, -1,138,205,205,63,52,17,41,16,27,23,86,42,119,143,171,171,5,63,254,251,146,253, -111,76,62,8,6,135,18,23,145,155,2,145,146,1,5,0,1,0,139,255,235,3,252,4,58,0, -19,0,0,37,14,1,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,17,35,3,62,51,161, -104,177,198,197,102,108,105,137,35,197,177,161,87,95,226,239,2,126,253,128, -173,130,86,79,3,10,251,198,0,0,0,1,0,46,0,0,3,228,4,58,0,9,0,0,1,23,51,55,19, -51,1,35,1,51,1,248,17,6,19,249,201,254,114,149,254,109,202,1,63,76,76,2,251, -251,198,4,58,0,0,1,0,45,0,0,5,220,4,58,0,21,0,0,1,23,51,55,19,51,19,23,51,55, -19,51,1,35,3,39,35,7,3,35,1,51,1,164,25,6,26,216,158,217,28,6,32,160,206,254, -198,159,214,41,6,38,210,159,254,198,205,1,138,139,139,2,176,253,80,155,155,2, -176,251,198,2,147,172,172,253,109,4,58,0,0,1,0,46,0,0,3,212,4,58,0,11,0,0,1, -19,51,9,1,35,11,1,35,9,1,51,1,254,230,230,254,161,1,105,226,240,240,228,1,105, -254,161,227,2,171,1,143,253,233,253,221,1,153,254,103,2,35,2,23,0,0,1,0,26, -254,75,3,232,4,58,0,21,0,0,1,23,51,1,51,1,14,1,35,34,38,39,55,38,22,51,50,54, -63,1,1,51,1,218,35,6,1,10,219,254,57,41,153,130,24,74,20,20,6,83,11,63,80,27, -47,254,110,220,1,145,136,3,49,251,32,109,162,11,5,155,1,6,112,68,113,4,36,0,0, -0,0,1,0,94,0,0,3,186,4,58,0,9,0,0,37,33,21,33,53,1,33,53,33,21,1,73,2,113,252, -164,2,73,253,190,3,51,154,154,138,3,20,156,134,0,0,1,0,63,254,148,2,159,6,61, -0,30,0,0,1,46,1,61,1,52,38,35,53,50,54,61,1,52,54,55,23,14,1,29,1,20,6,7,30,1, -29,1,20,22,23,2,119,195,164,103,106,106,103,164,195,40,110,92,85,85,85,85,92, -110,254,148,55,240,170,205,112,125,147,123,113,206,171,239,55,117,35,181,132, -206,105,160,45,46,161,103,205,132,179,36,0,0,0,1,0,145,254,242,1,86,5,176,0,3, -0,0,1,35,17,51,1,86,197,197,254,242,6,190,0,0,0,1,0,21,254,148,2,118,6,61,0, -30,0,0,23,62,1,61,1,52,54,55,46,1,61,1,52,38,39,55,30,1,29,1,20,22,51,21,34,6, -29,1,20,6,7,21,109,94,90,94,94,90,94,109,41,194,165,101,108,108,101,165,194, -246,36,179,132,205,107,160,43,41,160,109,206,132,181,35,117,55,239,171,206, -113,123,147,125,112,205,170,240,55,0,1,0,128,1,145,4,240,3,35,0,25,0,0,1,20,6, -35,34,38,39,46,1,35,34,6,21,39,52,54,51,50,22,23,30,1,51,50,54,53,4,240,174, -130,90,147,85,59,98,50,67,95,141,171,132,88,150,85,58,96,52,66,97,2,228,137, -202,66,74,48,48,106,75,18,136,193,69,70,51,46,114,77,0,0,255,255,0,144,254, -138,1,86,4,58,0,71,3,176,255,229,4,58,64,0,192,1,0,0,0,1,0,97,255,11,3,218,5, -38,0,35,0,0,37,50,54,53,51,23,22,6,7,21,35,53,38,2,61,1,52,18,55,53,51,21,30, -1,15,1,35,52,38,35,34,6,29,1,20,22,2,61,91,136,180,2,3,178,131,198,184,197, -198,183,198,140,170,3,3,180,129,98,145,133,131,133,121,88,5,116,198,31,237, -233,31,1,40,205,42,202,1,40,33,225,227,30,209,138,5,99,139,225,160,42,163,224, -0,0,0,1,0,70,0,0,4,87,5,197,0,34,0,0,1,23,20,6,7,33,7,33,53,51,62,1,53,39,35, -53,51,3,52,54,51,50,22,15,1,35,52,38,35,34,6,21,19,33,21,1,174,6,31,29,2,223, -1,252,48,10,48,48,6,164,158,10,224,188,200,220,4,2,190,126,98,99,116,10,1,162, -2,103,149,90,163,59,154,154,13,196,103,149,155,1,14,204,233,209,172,6,118,114, -149,133,254,242,155,0,0,2,0,104,255,229,5,90,4,241,0,35,0,47,0,0,37,14,1,35, -34,38,39,7,39,55,46,1,53,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21, -20,6,7,23,7,1,20,18,51,50,18,53,52,2,35,34,2,4,73,77,185,101,101,185,75,130, -139,138,50,53,57,54,146,139,143,74,178,96,97,178,75,146,140,150,52,57,53,48, -142,140,252,115,241,172,170,241,241,170,172,241,108,62,66,65,61,132,138,140, -76,181,99,102,188,78,149,139,146,55,61,62,56,149,140,153,78,185,101,98,179,76, -143,139,2,123,188,254,247,1,9,188,186,1,8,254,248,0,1,0,30,0,0,4,175,5,176,0, -22,0,0,9,1,51,1,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,1,51,2,103, -1,104,224,254,94,1,56,254,129,1,127,254,129,197,254,137,1,119,254,137,1,55, -254,93,226,3,25,2,151,253,50,123,167,122,254,186,1,70,122,167,123,2,206,0,0,0, -2,0,145,254,242,1,86,5,176,0,3,0,7,0,0,19,17,51,25,1,35,17,51,145,197,197,197, -254,242,3,24,252,232,3,200,2,246,0,0,0,2,0,90,254,17,4,124,5,197,0,51,0,69,0, -0,1,20,6,7,30,1,21,20,4,35,34,36,63,2,20,22,51,50,54,53,52,38,39,46,1,53,52, -54,55,46,1,53,52,36,51,50,4,15,1,35,52,38,35,34,6,21,20,22,23,30,1,37,46,1,39, -14,1,21,20,22,23,30,1,23,62,1,53,52,38,4,124,96,87,69,70,254,246,225,221,254, -210,5,2,188,193,135,137,157,144,204,239,226,94,87,68,68,1,12,224,233,1,4,4,3, -188,158,140,145,150,134,211,244,223,253,223,47,83,36,73,73,136,210,56,74,33, -72,80,147,1,175,94,140,40,51,136,98,172,195,205,220,6,2,143,135,119,91,91,101, -63,63,186,177,91,141,41,50,139,97,166,201,223,202,6,118,158,119,91,99,99,58, -69,181,83,12,25,15,19,100,69,100,103,59,17,22,12,20,99,69,91,107,0,0,0,2,0, -160,4,232,3,101,5,176,0,3,0,7,0,0,1,35,53,51,5,35,53,51,3,101,219,219,254,22, -219,219,4,232,200,200,200,0,0,0,0,3,0,88,255,235,5,227,5,196,0,29,0,41,0,53,0, -0,1,23,22,6,35,34,38,61,1,52,54,51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,51, -50,54,53,37,16,0,51,50,0,17,16,0,35,34,0,3,16,0,33,32,0,17,16,0,33,32,0,4,87, -2,4,176,157,160,188,188,160,157,177,4,2,146,91,91,94,102,102,94,91,90,253,12, -1,87,246,245,1,88,254,168,245,246,254,169,121,1,158,1,40,1,39,1,158,254,97, -254,218,254,216,254,98,2,84,6,151,157,213,174,119,173,214,158,149,6,95,87,141, -114,120,117,140,86,98,133,254,247,254,148,1,108,1,9,1,7,1,106,254,150,254,249, -1,59,1,176,254,80,254,197,254,196,254,78,1,178,0,0,2,0,120,2,180,3,19,5,197,0, -32,0,43,0,0,1,46,1,39,14,1,35,34,38,53,52,54,59,1,53,52,38,35,34,6,21,47,1,38, -54,51,50,22,21,17,20,22,23,37,50,54,55,53,35,34,6,21,20,22,2,101,8,10,3,33, -113,77,119,130,169,161,139,60,58,67,73,162,1,6,169,140,134,156,12,14,254,136, -51,109,18,138,75,83,58,2,194,21,48,26,47,62,122,106,110,120,52,63,68,54,49,13, -6,98,130,142,134,254,198,50,88,43,125,60,35,110,66,46,45,48,0,0,255,255,0,77, -0,37,3,30,3,125,0,38,1,19,245,221,0,7,1,19,1,68,255,221,0,1,0,127,1,119,3,194, -3,34,0,5,0,0,1,35,17,33,53,33,3,194,198,253,131,3,67,1,119,1,6,165,0,4,0,88, -255,235,5,227,5,196,0,11,0,23,0,50,0,59,0,0,19,16,0,33,32,0,17,16,0,33,32,0, -19,16,0,51,50,0,17,16,0,35,34,0,1,17,35,17,33,50,22,21,20,6,7,30,1,29,1,20,22, -23,21,35,46,1,61,1,52,38,35,39,51,62,1,53,52,38,43,1,88,1,158,1,40,1,39,1,158, -254,97,254,218,254,216,254,98,121,1,87,246,244,1,88,254,169,245,246,254,169,1, -188,149,1,24,152,173,66,63,66,59,7,10,153,9,4,67,77,159,152,65,91,79,98,131,2, -217,1,59,1,176,254,80,254,197,254,196,254,78,1,178,1,60,254,246,254,149,1,108, -1,9,1,8,1,105,254,151,254,173,254,174,3,82,131,126,62,94,31,26,106,75,56,41, -65,21,16,21,81,42,54,72,68,130,1,63,56,73,59,0,0,0,1,0,103,5,30,3,86,5,176,0, -3,0,0,1,33,53,33,3,86,253,17,2,239,5,30,146,0,0,2,0,128,3,191,2,125,5,197,0, -11,0,23,0,0,19,52,54,51,50,22,21,20,6,35,34,38,55,20,22,51,50,54,53,52,38,35, -34,6,128,152,105,103,149,148,104,106,151,131,73,53,52,71,72,51,53,73,4,192, -106,155,155,106,108,149,149,108,55,72,72,55,55,75,75,0,0,2,0,99,0,4,3,247,4, -243,0,11,0,15,0,0,1,33,21,33,17,35,17,33,53,33,17,51,1,33,53,33,2,145,1,102, -254,154,177,254,131,1,125,177,1,58,252,189,3,67,3,88,154,254,99,1,157,154,1, -155,251,17,155,0,0,1,0,113,2,155,2,202,5,199,0,26,0,0,1,33,53,1,62,1,53,52,38, -35,34,6,21,35,39,38,54,51,50,22,21,20,6,15,1,23,33,2,202,253,176,1,46,69,44, -57,58,67,73,161,2,6,168,141,135,152,89,116,153,2,1,105,2,155,130,1,6,60,75,42, -50,62,64,50,6,99,140,128,116,80,112,105,135,6,0,1,0,106,2,143,2,228,5,198,0, -42,0,0,1,50,54,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20, -6,35,34,38,63,1,51,20,22,51,50,54,53,52,38,43,1,53,1,168,67,65,73,69,56,69, -162,2,6,169,126,145,168,71,62,70,76,180,146,127,181,6,1,163,75,63,72,84,73,73, -132,4,113,57,52,43,58,48,40,6,94,119,119,110,55,91,26,23,96,68,111,124,116, -111,6,46,57,59,48,62,57,126,0,0,0,0,1,0,131,4,228,2,36,5,238,0,4,0,0,1,51,23, -1,35,1,60,230,2,254,243,148,5,238,6,254,252,0,0,1,0,153,254,96,3,242,4,58,0, -21,0,0,1,17,30,1,51,50,54,55,17,51,17,35,39,14,1,35,34,38,39,17,35,17,1,93,2, -111,100,98,121,32,197,177,9,44,127,83,72,109,40,196,4,58,253,126,178,129,72, -70,3,39,251,198,108,63,66,33,35,254,49,5,218,0,0,1,0,63,0,0,3,68,5,176,0,10,0, -0,33,17,35,34,0,53,52,0,51,33,17,2,127,84,233,254,253,1,3,233,1,25,2,8,1,3, -209,207,1,5,250,80,0,0,0,1,0,161,2,112,1,103,3,68,0,3,0,0,1,35,53,51,1,103, -198,198,2,112,212,0,0,0,0,1,0,119,254,77,1,175,0,0,0,15,0,0,33,7,30,1,21,20,6, -35,39,50,54,53,52,38,39,55,1,36,12,65,86,158,147,7,72,88,72,87,32,52,11,82,80, -96,114,109,49,49,48,38,7,135,0,1,0,95,2,153,1,140,5,197,0,5,0,0,1,35,17,35,53, -37,1,140,174,127,1,45,2,153,2,143,134,23,0,2,0,120,2,179,3,43,5,197,0,13,0,27, -0,0,19,52,54,51,50,22,29,1,20,6,35,34,38,53,51,20,22,51,50,54,61,1,52,38,35, -34,6,21,120,188,157,158,188,187,157,158,189,173,88,86,83,89,90,84,84,88,4,118, -148,187,187,148,117,149,185,185,149,88,105,106,87,117,84,107,107,84,0,0,255, -255,0,166,0,71,3,131,3,159,0,38,1,20,22,0,0,7,1,20,1,112,0,0,255,255,0,184,0, -0,5,236,5,196,0,39,1,101,0,89,2,152,0,39,1,21,1,24,0,8,0,7,1,104,2,196,0,0,0, -0,255,255,0,184,0,0,5,245,5,196,0,39,1,21,1,37,0,8,0,39,1,101,0,89,2,152,0,7, -1,102,3,43,0,0,0,0,255,255,0,122,0,0,6,159,5,199,0,39,1,21,1,207,0,8,0,39,1, -104,3,119,0,0,0,7,1,103,0,16,2,155,0,0,255,255,0,117,254,118,3,177,4,59,0,15, -0,31,3,235,4,59,192,1,0,2,0,14,0,0,7,132,5,176,0,15,0,19,0,0,41,1,3,33,3,35,1, -33,21,33,19,33,21,33,19,33,1,33,3,39,7,132,252,129,15,253,211,201,242,3,113,3, -199,253,77,20,2,78,253,184,22,2,193,250,172,1,191,31,5,1,94,254,162,5,176,155, -254,46,155,253,242,1,119,2,198,2,0,0,0,1,0,88,0,225,3,225,4,121,0,11,0,0,19,9, -1,55,9,1,23,9,1,7,9,1,88,1,71,254,185,126,1,70,1,71,126,254,184,1,72,126,254, -185,254,186,1,95,1,78,1,78,126,254,179,1,77,126,254,178,254,178,126,1,76,254, -180,0,0,3,0,108,255,162,4,253,5,237,0,25,0,37,0,49,0,0,1,16,0,33,34,38,39,7, -35,55,46,1,53,17,16,0,51,50,22,23,55,51,7,30,1,21,1,20,22,31,1,1,46,1,35,34,2, -21,33,52,38,47,1,1,30,1,51,50,54,53,4,253,254,181,254,248,85,151,64,91,149, -139,84,89,1,63,255,94,169,71,81,150,132,77,85,252,52,37,36,6,2,31,49,124,72, -172,205,3,7,33,30,6,253,227,44,106,62,183,215,2,86,254,245,254,160,41,40,154, -235,83,236,138,1,3,1,10,1,98,51,46,137,221,84,226,129,254,253,85,146,52,1,3, -149,40,44,255,0,200,75,134,50,1,252,113,34,34,255,203,0,0,0,2,0,163,0,0,4,96, -5,176,0,12,0,21,0,0,1,17,33,50,4,21,20,4,35,33,17,35,17,19,17,33,50,54,53,52, -38,35,1,104,1,13,232,1,3,254,253,232,254,243,197,197,1,13,147,147,147,147,5, -176,254,219,236,189,190,235,254,199,5,176,254,65,253,226,156,113,114,159,0,0, -0,1,0,137,255,235,4,92,6,19,0,39,0,0,33,35,17,52,54,51,50,22,21,14,1,21,20,18, -21,20,6,35,34,38,39,55,30,1,51,50,54,53,52,2,53,52,54,55,52,38,35,34,6,21,1, -77,196,221,198,186,247,51,48,226,198,169,89,184,40,78,40,119,56,99,91,226,58, -53,152,86,105,128,4,77,218,236,201,180,87,152,75,82,254,166,115,168,170,51,38, -141,28,48,105,88,76,1,94,110,99,164,91,72,113,156,144,0,0,3,0,88,255,235,6, -154,4,78,0,46,0,57,0,66,0,0,5,34,38,39,14,1,35,34,38,53,52,54,59,1,53,52,38, -35,34,6,21,47,1,38,54,51,50,22,23,62,1,51,50,18,29,1,33,7,30,1,51,50,54,55,23, -14,1,37,50,54,55,53,35,34,6,21,20,22,1,34,6,7,23,33,53,52,38,5,12,136,208,66, -56,223,160,170,185,230,220,229,104,97,103,122,188,2,5,230,190,114,175,50,64, -175,101,214,231,253,59,2,1,157,155,103,133,78,67,53,188,252,74,76,166,43,227, -120,135,100,3,92,113,138,11,2,1,252,120,21,97,90,79,108,174,151,157,172,87, -106,121,110,78,18,6,138,181,81,77,75,83,254,252,228,119,5,159,198,55,51,138, -44,78,154,87,57,214,111,80,74,93,3,46,169,133,5,31,122,154,0,0,2,0,72,255,235, -4,48,5,237,0,32,0,45,0,0,1,22,18,29,1,20,0,35,34,0,53,52,0,51,50,22,23,55,46, -1,39,5,39,37,46,1,39,55,30,1,23,55,23,1,50,54,61,1,46,1,35,34,6,21,20,22,3, -105,95,104,254,224,215,218,254,233,1,20,213,90,159,52,4,9,85,68,254,222,77,1, -0,39,83,44,60,79,144,63,218,77,254,17,133,169,35,161,118,131,161,164,5,17,104, -254,237,163,220,245,254,201,1,24,207,228,1,28,74,60,5,109,176,66,165,102,146, -22,34,14,164,19,66,46,125,102,251,4,228,174,148,59,81,208,149,132,201,0,0,3,0, -71,0,180,4,45,4,178,0,3,0,7,0,11,0,0,1,33,53,33,37,35,53,51,17,35,53,51,4,45, -252,26,3,230,254,113,198,198,198,198,2,85,188,214,203,252,2,203,0,0,0,3,0,97, -255,121,4,42,4,185,0,25,0,37,0,49,0,0,19,52,0,51,50,22,23,55,51,7,30,1,29,1, -20,0,35,34,38,39,7,35,55,46,1,53,51,20,22,23,51,1,46,1,35,34,6,21,33,52,38,39, -35,1,30,1,51,50,54,53,97,1,4,223,56,104,46,74,129,105,88,94,254,252,224,50,92, -42,72,129,100,97,103,197,40,41,6,1,77,30,67,37,141,145,2,63,34,33,6,254,185, -25,56,32,141,146,2,39,240,1,55,22,20,149,212,74,231,141,22,242,254,204,17,16, -147,203,72,240,149,91,152,48,2,162,17,18,226,170,80,140,47,253,106,12,11,224, -172,0,0,2,0,153,254,96,4,51,6,24,0,17,0,31,0,0,1,20,2,35,34,38,39,17,35,17,51, -17,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1,51,50,54,53,4,51,224,197,100, -151,53,197,197,53,150,98,201,223,197,145,141,85,120,37,37,120,87,140,144,1, -244,234,254,225,67,67,253,239,7,184,253,170,68,72,254,193,254,250,184,237,77, -67,253,245,67,75,205,162,0,0,0,2,0,30,0,0,5,139,5,176,0,19,0,23,0,0,1,35,17, -35,17,33,17,35,17,35,53,51,17,51,17,33,17,51,17,51,1,33,53,33,5,139,140,197, -253,61,197,148,148,197,2,195,197,140,251,236,2,195,253,61,4,4,251,252,2,131, -253,125,4,4,146,1,26,254,230,1,26,254,230,254,136,230,0,0,0,1,0,153,0,0,1,94, -4,58,0,3,0,0,33,35,17,51,1,94,197,197,4,58,0,1,0,153,0,0,4,64,4,58,0,14,0,0,1, -35,17,35,17,51,17,51,1,51,23,9,1,7,35,1,195,101,197,197,84,1,132,231,2,254,62, -1,227,2,241,1,203,254,53,4,58,254,55,1,201,5,253,254,253,210,5,0,0,0,0,1,0,40, -0,0,4,46,5,176,0,13,0,0,1,37,21,5,17,33,21,33,17,7,53,55,17,51,1,104,1,13,254, -243,2,198,252,117,123,123,197,3,75,86,166,86,253,245,154,2,103,39,166,39,2, -163,0,1,0,37,0,0,2,14,6,24,0,11,0,0,1,55,21,7,17,35,17,7,53,55,17,51,1,120, -150,150,197,142,142,197,3,104,58,165,58,253,61,2,120,54,165,54,2,251,0,1,0, -160,254,75,4,237,5,176,0,24,0,0,1,17,20,6,35,34,38,39,55,30,1,51,50,54,61,1,1, -7,17,35,17,51,1,55,17,4,237,172,154,31,52,29,14,13,68,17,61,68,253,67,6,197, -197,2,189,6,5,176,249,247,167,181,9,9,150,5,8,103,90,89,4,88,2,251,170,5,176, -251,168,2,4,86,0,0,0,1,0,143,254,75,3,245,4,78,0,31,0,0,1,23,62,1,51,50,22,21, -17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,52,38,35,34,6,7,17,35,17,1,63,13, -54,160,101,174,192,172,154,31,53,28,14,13,67,18,61,68,114,116,85,123,38,197,4, -58,150,81,89,205,214,252,252,167,181,9,9,160,5,7,94,88,3,0,143,120,66,59,252, -207,4,58,0,0,2,0,104,255,235,7,10,5,197,0,23,0,37,0,0,41,1,14,1,35,34,0,25,1, -16,0,51,50,22,23,33,21,33,17,33,21,33,17,33,5,50,54,55,17,46,1,35,34,6,21,17, -20,22,7,10,252,175,92,130,67,249,254,201,1,53,249,69,143,79,3,70,253,79,2,86, -253,170,2,188,251,142,61,122,58,61,122,60,169,192,194,10,11,1,76,1,9,1,48,1,9, -1,76,12,9,155,254,41,155,253,247,20,9,9,4,127,8,11,227,213,254,206,214,228,0, -3,0,97,255,235,6,219,4,78,0,36,0,56,0,65,0,0,5,34,38,39,14,1,35,34,0,61,1,52, -0,51,50,22,23,62,1,51,50,18,29,1,33,20,6,7,30,1,51,50,54,55,23,14,1,1,20,22, -51,50,54,55,46,1,61,1,52,54,55,46,1,35,34,6,21,1,34,6,7,23,33,53,52,38,5,93, -136,209,66,64,193,123,224,254,251,1,4,223,124,194,64,64,187,108,217,217,253, -78,2,2,16,155,141,98,116,79,49,54,155,251,68,145,143,120,141,20,3,2,2,3,20, -143,120,141,145,4,3,103,135,15,2,1,232,116,21,98,90,90,98,1,53,241,22,240,1, -55,100,90,89,101,254,242,224,104,15,28,21,140,167,41,42,139,39,59,2,38,172, -224,165,136,22,42,22,44,19,41,21,135,167,226,170,1,140,159,124,5,16,118,154,0, -0,1,0,19,255,235,2,117,5,63,0,31,0,0,1,17,51,21,35,21,51,21,35,17,20,22,51,50, -54,55,23,14,1,35,34,38,53,17,35,53,51,53,35,53,51,17,1,131,205,205,242,242,63, -52,17,41,16,27,23,86,42,119,143,162,162,171,171,5,63,254,251,146,149,146,254, -150,76,62,8,6,135,18,23,145,155,1,106,146,149,146,1,5,0,1,0,159,0,0,2,135,6, -45,0,15,0,0,51,17,52,54,51,50,22,23,7,46,1,35,34,6,21,17,159,182,162,33,69,42, -24,20,44,25,87,91,4,195,173,189,11,10,145,5,6,109,98,251,61,0,0,1,255,233,254, -75,2,192,6,45,0,37,0,0,33,21,20,6,35,34,38,39,55,30,1,51,50,54,53,17,35,53,51, -53,52,54,51,50,22,23,7,46,1,35,34,6,29,1,51,21,35,17,1,157,172,153,31,52,28, -14,13,66,18,59,69,169,170,180,162,34,69,42,24,18,51,27,87,83,196,196,89,167, -181,9,9,150,5,8,103,90,4,1,146,137,173,189,11,10,150,4,6,103,98,137,146,252, -88,0,0,2,0,108,255,235,6,49,5,197,0,23,0,37,0,0,1,16,0,33,34,0,25,1,16,0,51, -50,4,23,62,1,53,51,20,6,7,30,1,21,39,52,2,35,34,2,21,17,20,18,51,50,54,53,4, -253,254,181,254,248,255,254,193,1,63,255,183,1,23,72,84,88,197,166,154,5,7, -197,216,182,172,205,205,172,183,215,2,86,254,245,254,160,1,96,1,11,1,3,1,10,1, -98,179,152,31,160,121,187,240,40,33,67,34,2,200,1,0,255,0,200,254,251,202,255, -0,255,203,0,0,2,0,97,255,235,4,242,4,78,0,23,0,37,0,0,19,52,0,51,50,22,23,62, -1,53,51,20,6,7,30,1,29,1,20,0,35,34,0,53,51,20,22,51,50,54,61,1,52,38,35,34,6, -21,97,1,4,223,136,208,62,51,51,178,112,108,9,11,254,252,224,224,254,251,197, -145,143,141,146,147,142,141,145,2,39,240,1,55,120,107,27,110,76,137,189,41,41, -85,44,22,242,254,204,1,53,241,172,224,224,172,22,170,226,226,170,0,0,1,0,147, -255,235,6,88,5,177,0,27,0,0,1,17,23,62,1,53,51,23,22,6,7,17,20,0,35,34,0,53, -17,51,17,20,22,51,50,54,53,17,4,220,6,86,93,190,3,2,196,184,254,200,246,237, -254,210,197,191,151,160,201,5,176,254,217,1,25,154,118,5,193,243,33,254,18, -240,254,242,1,15,239,3,199,252,57,167,189,189,167,3,199,0,0,0,0,1,0,139,255, -235,5,106,4,59,0,29,0,0,1,23,22,6,7,17,35,39,14,1,35,34,38,53,17,51,17,20,22, -51,50,54,55,17,51,21,23,62,1,53,5,100,3,3,177,189,177,13,51,161,104,177,198, -197,102,108,105,137,35,197,6,100,85,4,59,6,177,192,14,253,74,161,87,95,226, -239,2,126,253,128,173,130,86,79,3,10,241,2,7,120,117,0,0,1,255,188,254,75,1, -112,4,58,0,15,0,0,1,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,1,112,172,153, -31,51,29,14,14,65,18,59,69,4,58,251,109,167,181,9,9,150,5,8,103,90,4,147,0,0, -0,1,0,110,4,228,3,77,5,235,0,8,0,0,1,7,35,39,7,35,39,1,51,3,77,2,170,196,196, -169,2,1,12,198,4,234,6,176,176,6,1,1,0,0,0,1,0,85,4,228,3,54,5,235,0,8,0,0,1, -55,51,23,1,35,1,55,51,1,197,196,171,2,254,242,198,254,243,2,170,5,59,176,6, -254,255,1,1,6,0,1,0,129,4,164,2,216,5,176,0,15,0,0,1,23,22,6,35,34,38,63,1,51, -20,22,51,50,54,53,2,210,2,4,162,137,138,162,5,2,151,68,74,72,70,5,176,6,116, -146,146,116,6,66,82,83,65,0,0,0,0,1,0,160,4,231,1,122,5,176,0,3,0,0,1,35,53, -51,1,122,218,218,4,231,201,0,0,0,0,2,0,165,4,118,2,2,5,197,0,11,0,23,0,0,19, -52,54,51,50,22,21,20,6,35,34,38,55,20,22,51,50,54,53,52,38,35,34,6,165,103,73, -72,101,101,72,73,103,100,44,32,30,43,43,30,32,44,5,27,72,98,98,72,73,92,93,72, -32,43,42,33,33,45,45,0,0,1,0,18,254,98,1,224,0,0,0,15,0,0,33,23,14,1,7,21,33, -21,33,46,1,53,52,54,55,53,1,156,2,75,115,1,1,1,254,56,3,3,122,83,109,3,79,67, -23,133,19,41,17,122,168,23,24,0,0,0,0,1,0,135,4,225,3,61,5,243,0,19,0,0,1,20, -6,35,34,38,35,34,6,21,39,52,54,51,50,22,51,50,54,53,3,61,119,90,71,154,51,43, -58,108,118,91,56,168,52,41,60,5,211,94,130,93,65,46,26,93,137,94,65,47,0,2,0, -100,4,228,3,74,5,238,0,5,0,10,0,0,1,51,23,1,35,39,3,51,23,3,35,2,98,229,3,254, -212,171,2,85,211,2,240,157,5,238,6,254,252,5,1,5,5,254,251,0,255,255,0,182, -254,131,1,236,255,173,0,15,0,156,0,36,250,142,56,209,255,255,0,36,4,240,1,64, -6,79,0,71,0,64,255,235,254,123,44,156,84,128,0,0,255,255,0,210,4,239,1,239,6, -80,0,71,0,113,0,121,254,118,43,177,84,192,0,0,255,255,0,135,4,225,3,61,5,243, -0,6,0,158,0,0,255,255,255,187,4,228,2,161,5,238,0,71,0,159,3,5,0,0,192,1,64,0, -0,0,0,1,0,148,4,246,1,100,5,252,0,3,0,0,19,51,3,35,148,208,67,83,5,252,254, -250,0,0,0,3,0,161,4,232,3,101,6,165,0,3,0,7,0,11,0,0,1,35,55,51,5,35,53,51,55, -51,7,35,3,101,219,20,199,254,22,218,198,48,219,38,142,4,232,200,200,200,245, -233,0,0,255,255,0,161,2,112,1,103,3,68,0,6,0,116,0,0,0,1,0,163,0,0,4,32,5,176, -0,5,0,0,1,33,17,35,17,33,4,32,253,72,197,3,125,5,21,250,235,5,176,0,0,0,0,2,0, -30,0,0,5,112,5,176,0,3,0,7,0,0,1,51,1,33,37,33,1,35,2,135,169,2,64,250,174,1, -8,3,70,254,112,6,5,176,250,80,154,4,26,0,0,0,0,3,0,113,255,235,5,2,5,197,0,3, -0,17,0,31,0,0,1,33,53,33,5,16,0,33,34,0,25,1,16,0,51,32,0,17,39,52,2,35,34,2, -21,17,20,18,51,50,54,53,3,191,254,3,1,253,1,67,254,181,254,248,255,254,193,1, -63,255,1,8,1,75,197,216,182,172,205,205,172,183,215,2,147,154,215,254,245,254, -160,1,96,1,11,1,3,1,10,1,98,254,159,254,245,2,200,1,0,255,0,200,254,251,202, -255,0,255,203,0,0,0,0,1,0,49,0,0,5,7,5,176,0,7,0,0,1,35,1,35,1,51,1,35,2,159, -6,254,97,201,2,22,170,2,22,201,4,147,251,109,5,176,250,80,0,0,0,3,0,123,0,0,4, -36,5,176,0,3,0,7,0,11,0,0,55,33,21,33,19,33,21,33,3,33,21,33,123,3,169,252,87, -83,2,249,253,7,82,3,156,252,100,154,154,3,65,155,3,10,155,0,0,0,0,1,0,168,0,0, -4,247,5,176,0,7,0,0,33,35,17,33,17,35,17,33,4,247,197,253,59,197,4,79,5,21, -250,235,5,176,0,1,0,70,0,0,4,72,5,176,0,14,0,0,9,1,23,33,21,33,53,9,1,53,33, -21,33,7,1,2,246,254,67,3,3,12,251,254,1,224,254,32,3,208,253,38,3,1,189,2,203, -253,213,5,155,147,2,69,2,69,147,155,5,253,211,0,0,0,0,3,0,84,0,0,5,77,5,176,0, -17,0,26,0,35,0,0,1,22,0,21,20,0,7,21,35,53,38,0,53,52,0,55,53,51,1,20,22,63,1, -17,39,38,6,5,52,38,35,7,17,23,22,54,3,52,230,1,51,254,205,230,197,232,254,205, -1,51,232,197,253,227,177,161,6,6,160,178,3,114,178,157,6,6,157,178,4,205,5, -254,229,218,221,254,227,4,213,213,3,1,28,221,219,1,30,4,226,253,33,161,187,1, -2,2,179,2,1,189,158,159,187,2,253,77,2,1,189,0,0,1,0,87,0,0,5,27,5,176,0,25,0, -0,1,23,62,1,53,17,51,17,20,0,7,17,35,17,38,0,53,17,51,17,20,22,23,55,17,51,3, -19,6,144,173,197,254,226,234,198,227,254,237,196,164,136,6,198,1,229,2,19,211, -172,2,59,253,197,245,254,215,24,254,193,1,64,24,1,40,245,2,59,253,197,170,210, -20,1,3,202,0,0,0,1,0,112,0,0,4,208,5,197,0,35,0,0,37,54,18,61,1,52,38,35,34,6, -29,1,20,18,23,21,33,53,51,38,2,61,1,16,0,51,50,0,17,21,20,2,7,33,21,33,2,223, -141,157,193,170,169,192,161,143,254,17,253,120,139,1,53,249,249,1,55,139,118, -1,3,254,15,159,25,1,31,251,118,233,249,249,233,118,251,254,224,24,159,154,92, -1,53,167,116,1,28,1,99,254,157,254,228,116,167,254,204,93,154,0,0,0,0,2,0,98, -255,235,4,128,4,78,0,28,0,43,0,0,1,17,20,22,51,50,54,55,23,14,1,35,34,38,39, -14,1,35,34,2,61,1,16,18,51,50,22,23,55,1,20,22,51,50,54,55,53,17,46,1,35,34,6, -21,3,233,41,35,15,26,11,23,29,60,37,75,100,24,55,153,99,198,224,223,201,101, -155,55,51,253,179,135,140,81,114,39,39,115,78,141,136,4,57,252,219,72,56,3,4, -142,20,14,64,69,66,67,1,31,234,21,1,5,1,64,72,68,119,253,187,164,203,71,64,8, -2,29,60,70,239,187,0,2,0,157,254,31,4,79,5,197,0,20,0,42,0,0,1,50,22,21,20,6, -7,30,1,21,20,6,35,34,38,39,17,35,17,52,36,19,50,54,53,52,38,35,34,6,21,17,30, -1,51,50,54,53,52,38,43,1,53,2,95,195,236,100,87,119,133,253,202,83,154,57,197, -1,10,180,122,116,125,109,107,146,44,141,89,129,149,131,111,143,5,197,220,174, -91,153,45,44,196,129,209,237,51,51,253,206,6,18,165,239,253,151,121,106,95, -140,143,106,252,194,52,58,160,128,112,172,155,0,0,1,0,46,254,95,3,228,4,58,0, -11,0,0,1,51,1,17,35,17,1,51,1,23,51,55,3,27,201,254,137,197,254,134,202,1,0, -17,6,19,4,58,252,4,254,33,1,228,3,247,253,5,76,76,0,0,0,2,0,97,255,235,4,42,5, -176,0,20,0,34,0,0,1,21,33,7,1,30,1,29,1,20,0,35,34,0,61,1,52,18,55,37,53,1,34, -6,29,1,20,22,51,50,54,61,1,52,38,3,170,254,57,1,1,97,110,121,254,252,224,224, -254,251,220,192,254,208,1,119,141,145,145,143,141,146,147,5,176,151,6,254,246, -69,253,160,22,242,254,204,1,53,241,22,219,1,45,26,241,118,254,3,226,170,22, -172,224,224,172,22,170,226,0,0,0,1,0,98,255,237,3,233,4,76,0,42,0,0,1,34,6,21, -20,22,51,50,54,53,51,23,22,4,35,34,38,53,52,54,55,46,1,53,52,54,51,50,22,15,1, -35,52,38,35,34,6,21,20,22,59,1,21,2,26,121,121,137,118,112,145,186,2,5,254, -246,184,202,251,103,99,87,96,233,201,183,249,5,2,186,139,100,116,121,109,115, -209,1,221,85,87,73,100,112,76,6,162,171,173,151,91,128,32,35,122,73,150,164, -175,139,6,70,98,95,67,74,85,150,0,0,0,1,0,115,254,88,3,202,5,176,0,33,0,0,1, -21,1,14,1,21,20,22,59,1,50,22,21,14,1,7,39,62,1,53,52,38,43,1,34,38,53,52,18, -55,1,39,33,53,3,202,254,170,129,113,105,102,32,159,180,2,155,109,81,66,94,82, -90,52,179,185,139,144,1,12,2,253,145,5,176,112,254,80,153,227,145,116,117,127, -128,111,165,47,127,31,86,70,52,58,214,168,120,1,65,169,1,48,5,155,0,1,0,143, -254,97,3,245,4,78,0,19,0,0,1,23,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17, -35,17,1,63,13,54,160,101,177,189,197,114,116,85,123,38,197,4,58,150,81,89,195, -224,251,182,4,70,143,125,67,60,252,204,4,58,0,3,0,119,255,235,4,22,5,197,0,13, -0,22,0,31,0,0,1,20,2,35,34,2,53,17,52,18,51,50,18,21,5,33,17,52,38,35,34,6,21, -1,33,21,20,22,51,50,54,53,4,22,251,212,211,253,251,211,212,253,253,38,2,21, -140,128,127,138,2,21,253,235,141,126,128,138,2,2,247,254,224,1,32,247,1,172, -245,1,34,254,222,245,229,1,14,157,182,182,157,254,88,85,157,184,183,158,0,0,0, -1,0,197,255,235,2,115,4,57,0,15,0,0,1,17,20,22,51,50,54,55,23,14,1,35,34,38, -53,17,1,138,53,45,25,48,18,44,45,89,53,119,124,4,57,252,211,73,56,15,11,133, -31,22,142,158,3,34,0,0,0,1,0,56,255,239,4,94,5,238,0,33,0,0,33,35,1,39,46,1, -35,34,6,35,53,62,1,51,50,22,23,1,30,1,51,50,54,55,7,14,1,35,34,38,39,3,15,1,1, -19,219,1,135,55,32,87,60,10,54,4,20,63,24,129,153,40,1,104,22,71,44,14,9,24,3, -11,37,11,118,143,53,202,6,29,4,4,145,84,106,5,145,5,10,162,108,252,78,71,84,1, -4,154,5,10,130,140,2,19,1,113,0,0,0,1,0,45,254,68,3,235,5,176,0,46,0,0,1,21, -33,14,1,21,20,22,59,1,21,35,34,6,21,20,22,59,1,50,22,21,14,1,7,39,62,1,53,52, -38,43,1,34,36,53,52,54,55,46,1,53,52,54,55,35,53,3,235,254,95,123,125,145,155, -142,142,159,164,150,130,61,161,178,2,155,109,79,65,94,70,75,69,213,254,248, -134,129,113,127,64,61,221,5,176,155,8,142,105,105,116,155,135,133,119,149,127, -129,111,164,47,127,31,85,70,52,60,226,199,127,174,42,42,155,96,86,131,42,155, -0,0,0,0,1,0,79,255,235,4,204,4,58,0,23,0,0,1,35,17,20,22,51,50,54,55,23,14,1, -35,34,38,53,17,33,17,35,17,35,53,33,4,94,123,53,45,25,48,18,44,45,89,53,119, -124,254,145,197,155,4,15,3,158,253,110,73,56,15,11,133,31,22,142,158,2,135, -252,98,3,158,156,0,0,0,2,0,143,254,96,4,36,4,78,0,16,0,30,0,0,1,20,2,35,34,38, -39,17,35,17,53,52,0,51,50,18,17,35,52,38,35,34,6,21,17,30,1,51,50,54,53,4,36, -219,197,97,152,55,197,1,1,192,227,241,197,132,139,123,129,37,120,87,139,140,1, -244,235,254,226,60,58,253,255,3,224,1,247,1,22,254,195,254,248,189,237,231, -140,254,211,67,75,204,163,0,0,1,0,98,254,87,3,225,4,78,0,34,0,0,1,50,22,15,1, -35,52,38,35,34,6,29,1,20,22,51,50,22,21,14,1,7,39,62,1,53,52,38,35,34,0,61,1, -52,18,2,61,187,233,4,2,178,122,114,138,140,155,163,170,190,2,155,109,81,66,94, -83,90,246,254,243,255,4,78,209,178,6,103,135,230,155,42,152,215,127,129,111, -164,47,127,31,85,70,53,58,1,42,223,42,227,1,57,0,0,0,2,0,97,255,235,4,124,4, -58,0,16,0,30,0,0,1,33,30,1,29,1,20,0,35,34,0,61,1,52,0,51,33,1,20,22,51,50,54, -61,1,52,38,35,34,6,21,4,124,254,187,108,135,254,248,220,224,254,251,1,4,223,2, -56,252,170,145,143,141,146,147,142,141,145,3,158,74,222,118,22,210,254,211,1, -53,241,22,232,1,43,253,215,172,224,224,172,22,161,214,214,161,0,0,0,0,1,0,81, -0,0,3,220,4,58,0,7,0,0,1,33,17,35,17,33,53,33,3,220,254,154,197,254,160,3,139, -3,161,252,95,3,161,153,0,0,0,1,0,141,255,235,4,38,4,58,0,21,0,0,1,17,20,22,51, -50,54,53,38,2,39,51,22,18,21,20,2,35,34,38,53,17,1,82,138,117,137,135,5,86,73, -206,69,86,222,237,221,241,4,58,253,156,175,162,253,176,127,1,1,136,106,254, -253,155,255,254,184,242,251,2,98,0,0,2,0,83,254,34,5,87,4,58,0,24,0,33,0,0,1, -50,0,21,20,0,5,17,35,17,36,0,53,52,18,55,51,6,2,7,20,22,23,55,17,1,46,1,15,1, -17,23,62,1,3,46,228,1,69,254,241,254,230,197,254,238,254,252,64,52,206,57,66, -2,163,168,6,2,41,4,186,160,6,6,177,173,4,58,254,191,237,218,254,213,23,254,50, -1,206,25,1,65,234,153,1,1,108,134,254,254,126,155,238,23,2,3,164,253,210,163, -237,4,2,252,253,2,21,217,0,1,0,91,254,38,5,77,4,58,0,29,0,0,1,17,23,62,1,53, -38,2,39,51,22,18,21,20,0,5,17,35,17,38,0,25,1,51,17,20,22,23,55,17,3,37,6,177, -172,3,66,56,207,51,64,254,246,254,226,198,247,254,243,197,169,144,6,4,57,252, -92,2,23,241,156,125,1,1,133,106,255,0,153,240,254,190,22,254,55,1,203,25,1,46, -1,28,1,230,254,24,207,219,19,2,3,162,0,0,0,1,0,108,255,235,6,96,4,58,0,40,0,0, -1,6,2,7,20,22,51,50,54,53,17,51,17,20,22,51,50,54,53,38,2,39,51,22,18,21,20,2, -35,34,38,39,14,1,35,34,2,53,52,18,55,1,213,74,86,4,112,120,107,127,198,126, -108,120,112,5,86,73,207,68,86,202,216,127,175,42,43,175,125,217,202,85,70,4, -58,134,254,253,127,190,239,162,175,1,44,254,212,175,162,237,192,127,1,3,134, -106,254,252,154,255,254,184,122,119,119,122,1,72,255,155,1,4,105,0,0,1,0,57, -255,206,5,150,5,176,0,23,0,0,1,33,17,51,50,0,21,6,2,7,39,62,1,53,46,1,43,1,17, -35,17,33,53,33,4,184,254,32,171,235,1,40,2,195,190,51,128,112,1,182,150,171, -197,254,38,4,127,5,21,254,91,255,0,220,138,254,230,34,148,34,157,115,147,164, -253,53,5,21,155,0,0,1,0,135,255,236,4,208,5,198,0,33,0,0,1,33,7,30,1,51,50,54, -53,51,23,22,0,35,34,0,25,1,16,0,51,50,0,15,1,35,52,38,35,34,2,29,1,33,3,126, -253,214,3,4,194,158,164,180,189,2,4,254,216,243,247,254,201,1,55,247,247,1,36, -4,2,189,180,164,165,196,2,50,2,57,5,185,245,177,156,6,205,254,236,1,94,1,13,1, -3,1,13,1,95,254,249,217,6,153,178,254,246,197,137,0,0,0,0,2,0,69,0,0,8,73,5, -176,0,22,0,31,0,0,1,17,33,50,4,21,20,4,35,33,17,33,3,16,2,43,1,53,51,50,18,27, -1,1,17,33,50,54,53,52,38,35,4,247,1,103,232,1,3,254,253,232,253,212,254,27,1, -215,251,53,41,149,132,1,1,3,110,1,103,147,147,147,147,5,176,253,201,247,198, -198,246,5,21,253,237,254,111,254,143,154,1,30,1,74,2,174,253,47,253,187,169, -123,121,168,0,0,0,2,0,168,0,0,8,73,5,176,0,18,0,27,0,0,1,33,17,51,17,33,50,4, -21,20,4,35,33,17,33,17,35,17,51,1,17,33,50,54,53,52,38,35,1,109,2,197,197,1, -103,233,1,2,254,253,232,253,212,253,59,197,197,3,138,1,103,148,146,146,148,3, -59,2,117,253,152,228,188,189,235,2,161,253,95,5,176,252,253,253,248,148,113, -112,147,0,0,1,0,73,0,0,5,120,5,176,0,19,0,0,1,33,17,51,50,22,21,17,35,17,52, -38,43,1,17,35,17,33,53,33,4,200,254,32,167,238,251,197,140,152,167,197,254,38, -4,127,5,21,254,91,220,238,254,90,1,166,166,137,253,43,5,21,155,0,0,1,0,169, -254,218,4,247,5,176,0,11,0,0,19,51,17,33,17,51,17,33,17,35,17,33,169,197,2, -196,197,254,65,197,254,54,5,176,250,235,5,21,250,80,254,218,1,38,0,2,0,163,0, -0,4,187,5,176,0,12,0,21,0,0,1,33,17,33,50,4,21,20,4,35,33,17,33,1,17,33,50,54, -53,52,38,35,4,32,253,72,1,103,233,1,3,254,252,232,253,212,3,125,253,72,1,103, -147,148,147,148,5,21,254,91,239,197,198,246,5,176,253,37,253,197,169,123,119, -160,0,2,0,54,255,69,5,238,5,176,0,14,0,21,0,0,37,51,17,35,53,33,21,35,17,51, -50,18,27,1,33,1,6,2,7,33,17,33,5,39,199,197,251,210,197,104,141,158,44,73,2, -233,253,149,31,102,83,2,126,254,142,154,254,171,187,187,1,85,1,104,1,97,2,77, -253,179,251,254,156,106,4,123,0,0,0,1,0,26,0,0,6,124,5,176,0,21,0,0,1,35,17, -35,17,35,1,35,9,1,51,1,51,17,51,17,51,1,51,9,1,35,3,231,54,196,63,254,97,245, -1,239,254,57,230,1,132,65,196,57,1,132,230,254,57,1,239,245,2,156,253,100,2, -156,253,100,3,2,2,174,253,135,2,121,253,135,2,121,253,83,252,253,0,0,0,1,0, -120,255,235,4,223,5,197,0,42,0,0,1,20,6,7,30,1,21,20,4,33,34,36,63,1,51,20,22, -51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,21,35,39,38,36,51,32,4,4, -201,136,120,135,143,254,193,254,254,226,254,188,5,2,188,198,157,178,202,184, -180,183,183,174,168,181,177,141,193,188,1,6,1,49,224,1,1,1,42,4,38,101,167,47, -42,174,125,201,226,214,205,6,114,157,149,120,133,129,156,132,114,112,144,142, -105,6,176,220,216,0,0,1,0,173,0,0,4,250,5,176,0,11,0,0,1,51,17,35,17,39,1,35, -17,51,17,23,4,53,197,197,6,253,67,197,197,6,5,176,250,80,4,86,2,251,168,5,176, -251,171,2,0,0,0,1,0,69,0,0,4,247,5,176,0,15,0,0,1,17,35,17,33,3,16,2,43,1,53, -51,50,18,27,1,4,247,197,254,27,1,215,251,53,41,149,132,1,1,5,176,250,80,5,21, -253,237,254,111,254,143,154,1,30,1,74,2,174,0,0,1,0,66,255,235,4,200,5,176,0, -21,0,0,1,23,51,1,51,1,14,1,35,34,38,39,55,30,1,51,50,54,63,1,1,51,2,56,74,6,1, -92,228,253,239,56,160,154,65,113,33,25,33,96,36,82,98,30,39,254,25,221,3,7, -191,3,104,251,63,124,136,22,15,144,10,17,85,67,83,4,64,0,0,0,0,1,0,161,254, -213,5,174,5,176,0,11,0,0,19,51,17,33,17,51,17,51,17,35,17,33,161,197,2,197, -197,190,197,251,184,5,176,250,235,5,21,250,240,254,53,1,43,0,0,1,0,147,0,0,4, -204,5,176,0,15,0,0,1,17,35,17,33,34,38,53,17,51,17,20,22,51,33,17,4,204,197, -254,117,241,248,198,138,153,1,139,5,176,250,80,2,74,211,237,1,166,254,90,165, -127,2,202,0,0,0,1,0,164,0,0,7,143,5,176,0,11,0,0,1,17,33,17,51,17,33,17,51,17, -33,17,1,105,2,80,196,2,77,197,249,21,5,176,250,234,5,22,250,234,5,22,250,80,5, -176,0,0,0,1,0,164,254,210,8,60,5,176,0,15,0,0,1,35,17,33,17,51,17,33,17,51,17, -33,17,51,17,51,8,60,197,249,45,197,2,80,196,2,77,197,173,254,210,1,46,5,176, -250,234,5,22,250,234,5,22,250,237,0,0,2,0,1,0,0,5,94,5,176,0,12,0,21,0,0,19, -33,17,33,50,4,21,20,4,35,33,17,33,1,17,33,50,54,53,52,38,35,1,2,10,1,103,233, -1,3,254,252,232,253,212,254,187,2,10,1,103,147,148,147,148,5,176,253,192,239, -197,198,246,5,22,253,191,253,197,169,123,119,160,0,0,3,0,163,0,0,6,50,5,176,0, -10,0,19,0,23,0,0,1,33,50,4,21,20,4,35,33,17,51,25,1,33,50,54,53,52,38,35,1,35, -17,51,1,104,1,103,233,1,3,254,252,232,253,212,197,1,103,147,148,147,148,3,99, -198,198,3,112,239,197,198,246,5,176,253,37,253,197,169,123,119,160,253,43,5, -176,0,0,0,0,2,0,163,0,0,4,187,5,176,0,10,0,19,0,0,1,33,50,4,21,20,4,35,33,17, -51,25,1,33,50,54,53,52,38,35,1,104,1,103,233,1,3,254,252,232,253,212,197,1, -103,147,148,147,148,3,112,239,197,198,246,5,176,253,37,253,197,169,123,119, -160,0,0,1,0,181,255,236,4,255,5,198,0,33,0,0,19,39,38,0,51,50,0,25,1,16,0,35, -34,0,63,1,51,20,22,51,50,18,61,1,33,53,33,53,52,2,35,34,6,21,188,2,5,1,41,242, -247,1,56,254,200,247,247,254,220,5,2,189,178,165,164,197,253,194,2,62,197,164, -165,178,3,222,6,203,1,23,254,161,254,243,254,253,254,242,254,163,1,5,218,6, -154,177,1,9,198,81,155,25,198,1,11,178,155,0,0,2,0,190,255,235,6,226,5,197,0, -20,0,34,0,0,1,16,0,33,34,0,39,35,17,35,17,51,17,51,53,16,0,51,32,0,17,39,52,2, -35,34,2,21,17,20,18,51,50,54,53,6,226,254,181,254,248,244,254,197,14,206,198, -198,205,1,63,255,1,8,1,75,197,216,182,172,205,205,172,183,215,2,86,254,245, -254,160,1,67,250,253,216,5,176,253,18,151,1,10,1,98,254,159,254,245,2,200,1,0, -255,0,200,254,251,202,255,0,255,203,0,0,2,0,44,0,0,4,54,5,176,0,13,0,22,0,0, -51,35,1,46,1,53,52,36,51,33,17,35,17,33,1,33,34,6,21,20,22,51,33,253,209,1,86, -142,147,1,18,241,1,210,197,254,189,1,67,254,243,156,162,163,153,1,15,2,149,51, -190,136,199,219,250,80,2,97,2,180,139,122,123,152,0,2,0,97,255,235,4,42,6,17, -0,32,0,46,0,0,1,50,0,29,1,20,0,35,34,0,61,1,60,1,55,53,16,18,55,62,1,53,51,23, -22,6,7,14,1,7,23,62,1,23,34,6,29,1,20,22,51,50,54,61,1,52,38,2,68,225,1,5,254, -252,224,224,254,251,1,254,233,119,99,151,2,4,162,196,128,186,14,4,53,163,86, -141,144,144,143,141,146,147,4,78,254,202,241,22,242,254,204,1,53,241,22,8,11, -7,143,1,60,1,102,30,15,48,66,6,156,107,26,18,168,128,4,70,92,155,226,170,22, -172,224,224,172,22,170,226,0,3,0,144,0,0,4,35,4,58,0,14,0,23,0,32,0,0,51,17, -33,50,22,21,20,6,7,30,1,21,20,6,35,1,17,33,50,54,53,52,38,35,37,51,50,54,53, -52,38,43,1,144,1,171,214,236,92,84,101,113,221,198,254,213,1,43,109,112,112, -109,254,213,231,125,127,128,125,230,4,58,149,149,76,119,31,25,137,88,152,156, -1,218,254,190,83,78,77,84,151,74,75,77,78,0,0,1,0,143,0,0,2,190,4,58,0,5,0,0, -1,33,17,35,17,33,2,190,254,150,197,2,47,3,158,252,98,4,58,0,0,0,0,2,0,69,255, -69,4,203,4,58,0,14,0,21,0,0,55,50,54,27,1,33,17,51,17,35,53,33,21,35,17,1,14, -1,7,33,17,33,174,99,81,25,37,2,156,143,197,253,4,197,1,251,17,54,48,1,174,254, -222,154,247,1,18,1,151,252,96,254,171,187,187,1,85,2,9,184,255,82,2,241,0,1,0, -26,0,0,5,166,4,58,0,21,0,0,1,35,17,35,17,35,1,35,9,1,51,1,51,17,51,17,51,1,51, -9,1,35,3,124,58,197,58,254,207,248,1,148,254,142,238,1,30,53,197,54,1,31,237, -254,142,1,148,248,1,213,254,43,1,213,254,43,2,60,1,254,254,66,1,190,254,66,1, -190,254,2,253,196,0,0,0,1,0,100,255,237,3,236,4,76,0,42,0,0,1,50,54,53,52,38, -35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20,6,35,34,36,63,1,51,20,22, -51,50,54,53,52,38,43,1,53,2,51,115,109,121,115,102,138,186,2,6,250,184,200, -233,97,86,98,105,252,201,185,254,246,6,2,186,144,113,117,138,122,121,208,2, -120,80,74,67,95,98,70,6,139,175,163,151,73,122,35,32,128,91,151,173,171,162,6, -76,112,100,73,86,81,160,0,0,0,1,0,143,0,0,3,252,4,58,0,11,0,0,1,51,17,35,17, -39,1,35,17,51,17,23,3,55,197,197,6,254,34,196,196,6,4,58,251,198,3,0,2,252, -254,4,58,253,0,2,0,0,0,1,0,153,0,0,4,64,4,58,0,14,0,0,1,35,17,35,17,51,17,51, -1,51,23,9,1,7,35,1,195,101,197,197,84,1,131,231,2,254,63,1,227,2,242,1,203, -254,53,4,58,254,55,1,201,5,253,254,253,210,5,0,0,0,0,1,0,65,0,0,3,252,4,58,0, -15,0,0,1,17,35,17,33,17,16,2,43,1,63,1,50,54,53,17,3,252,197,254,196,178,207, -57,4,41,108,91,4,58,251,198,3,158,254,206,254,194,254,210,168,1,209,242,1,206, -0,1,0,153,0,0,5,85,4,58,0,15,0,0,1,51,1,51,17,35,17,39,1,35,1,7,17,35,17,51,2, -247,6,1,98,246,197,6,254,180,136,254,174,6,197,254,1,2,3,56,251,198,2,239,2, -253,15,3,2,2,253,0,4,58,0,1,0,143,0,0,3,251,4,58,0,11,0,0,33,35,17,33,17,35, -17,51,17,33,17,51,3,251,197,254,30,197,197,1,226,197,1,204,254,52,4,58,254,44, -1,212,0,0,0,1,0,143,0,0,3,252,4,58,0,7,0,0,33,35,17,33,17,35,17,33,3,252,197, -254,29,197,3,109,3,158,252,98,4,58,0,1,0,71,0,0,3,209,4,58,0,7,0,0,1,33,17,35, -17,33,53,33,3,209,254,155,197,254,160,3,138,3,161,252,95,3,161,153,0,0,0,3,0, -98,254,96,6,191,6,24,0,31,0,45,0,59,0,0,19,16,18,51,50,22,23,17,51,17,62,1,51, -50,18,17,21,20,2,35,34,38,39,17,35,17,14,1,35,34,2,53,37,52,38,35,34,6,7,17, -30,1,51,50,54,53,33,20,22,51,50,54,55,17,46,1,35,34,6,21,98,223,201,88,142,53, -197,55,151,96,200,223,224,197,97,152,55,197,54,141,90,198,224,5,152,145,141, -85,120,37,37,120,87,140,144,251,45,135,140,81,115,39,39,115,79,141,136,2,9,1, -5,1,64,55,53,2,54,253,186,61,63,254,193,254,250,21,234,254,225,60,58,253,255, -1,247,54,54,1,31,234,21,185,241,79,68,253,243,67,75,204,163,164,203,72,65,2, -34,61,70,239,187,0,0,1,0,143,255,69,4,128,4,58,0,11,0,0,19,51,17,33,17,51,17, -51,17,35,53,33,143,197,1,227,197,132,197,252,212,4,58,252,96,3,160,252,96,254, -171,187,0,0,0,1,0,115,0,0,3,220,4,58,0,15,0,0,33,35,17,35,34,38,53,17,51,17, -20,22,59,1,17,51,3,220,197,208,236,232,197,124,147,208,197,1,165,174,222,1,9, -254,247,145,96,1,250,0,0,0,0,1,0,143,0,0,5,216,4,58,0,11,0,0,1,17,33,17,51,17, -33,17,51,17,33,17,1,84,1,125,197,1,125,197,250,183,4,58,252,96,3,160,252,96,3, -160,251,198,4,58,0,0,0,1,0,143,255,84,6,136,4,58,0,15,0,0,1,17,33,17,51,17,33, -17,51,17,51,17,35,53,33,17,1,84,1,125,197,1,125,197,176,195,250,202,4,58,252, -96,3,160,252,96,3,160,252,88,254,194,172,4,58,0,0,2,255,244,0,0,4,82,4,58,0, -14,0,23,0,0,1,33,50,22,21,20,6,35,33,17,35,53,51,53,51,25,1,33,50,54,53,52,38, -35,1,176,1,13,192,213,215,190,254,46,247,247,197,1,13,106,101,102,105,2,158, -184,147,148,191,3,47,154,113,253,202,254,150,102,76,74,110,0,0,0,0,3,0,153,0, -0,5,172,4,58,0,10,0,14,0,23,0,0,1,33,50,22,21,20,6,35,33,17,51,1,35,17,51,1, -17,33,50,54,53,52,38,35,1,94,1,13,192,213,215,190,254,46,197,4,78,197,197,251, -178,1,13,106,101,102,105,2,158,184,147,148,191,4,58,251,198,4,58,253,202,254, -150,102,76,74,110,0,0,0,0,2,0,153,0,0,4,0,4,58,0,10,0,19,0,0,1,33,50,22,21,20, -6,35,33,17,51,25,1,33,50,54,53,52,38,35,1,94,1,13,192,213,215,190,254,46,197, -1,13,106,101,102,105,2,158,184,147,148,191,4,58,253,202,254,150,102,76,74,110, -0,0,0,0,1,0,99,255,235,3,227,4,78,0,33,0,0,1,34,6,21,35,39,38,54,51,50,18,29, -1,20,0,35,34,38,63,1,51,20,22,51,50,54,55,39,33,53,33,55,46,1,2,8,92,143,178, -2,6,255,166,220,255,255,0,219,183,238,5,2,179,135,100,126,138,8,3,254,62,1, -192,2,10,137,3,179,122,87,6,139,219,254,199,227,42,228,254,199,223,163,6,99, -139,196,140,5,154,5,131,183,0,0,0,2,0,153,255,235,6,36,4,78,0,21,0,35,0,0,1, -52,0,51,50,0,29,1,20,0,35,34,38,39,33,17,35,17,51,17,51,53,51,20,22,51,50,54, -61,1,52,38,35,34,6,21,2,91,1,4,223,225,1,5,254,252,224,185,246,38,254,243,197, -197,253,197,145,143,141,146,147,142,141,145,2,39,240,1,55,254,202,241,22,242, -254,204,214,179,254,140,4,58,253,212,3,172,224,224,172,22,170,226,226,170,0,0, -0,2,0,117,0,0,3,242,4,58,0,13,0,22,0,0,1,17,35,17,33,3,35,19,46,1,53,52,54,51, -3,20,22,51,33,17,33,34,6,3,242,197,254,252,224,212,238,114,123,222,193,217, -109,107,1,25,254,232,107,110,4,58,251,198,1,164,254,92,1,189,36,162,108,146, -185,254,179,72,102,1,98,107,0,0,0,1,255,242,254,75,4,3,6,24,0,43,0,0,1,35,21, -62,1,51,50,22,29,1,51,17,20,6,35,34,38,39,55,30,1,51,50,54,61,1,35,17,52,38, -35,34,6,7,17,35,17,35,53,51,17,51,17,51,2,64,236,56,163,99,173,193,3,172,154, -33,52,28,15,13,68,17,60,68,2,115,114,88,130,40,197,157,157,197,236,4,104,191, -78,87,208,216,222,253,223,167,181,8,9,151,5,8,103,90,89,2,168,134,128,69,62, -252,213,4,104,124,1,52,254,204,0,1,0,97,255,235,3,217,4,78,0,34,0,0,1,33,7,30, -1,51,50,54,53,51,23,22,6,35,34,2,61,1,52,18,51,50,22,15,1,35,52,38,35,34,6,29, -2,33,2,215,254,108,2,21,125,106,91,136,178,3,4,248,164,228,248,249,227,181, -231,4,2,179,129,98,145,133,1,176,1,100,6,97,120,121,88,6,140,217,1,54,231,42, -229,1,55,224,163,6,99,139,225,160,42,10,0,2,0,65,0,0,6,158,4,58,0,22,0,31,0,0, -1,17,33,50,22,21,20,6,35,33,17,33,17,16,2,43,1,63,1,50,54,53,17,1,17,33,50,54, -53,52,38,35,3,252,1,13,191,214,215,190,254,46,254,196,178,207,57,4,41,107,92, -2,199,1,13,105,102,101,106,4,58,254,101,185,147,148,191,3,158,254,206,254,194, -254,210,158,1,217,244,1,206,253,203,254,147,112,77,73,103,0,0,0,0,2,0,143,0,0, -6,157,4,58,0,18,0,27,0,0,1,33,17,51,17,33,50,22,21,20,6,35,33,17,33,17,35,17, -51,1,17,33,50,54,53,52,38,35,1,84,1,226,197,1,13,192,213,215,190,254,46,254, -30,197,197,2,167,1,13,105,102,101,106,2,162,1,152,254,100,184,147,148,191,2,9, -253,247,4,58,253,203,254,147,112,77,73,103,0,0,0,0,1,255,242,0,0,4,0,6,24,0, -27,0,0,1,35,21,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,35,53,51,17, -51,17,51,2,64,236,56,163,99,173,193,197,115,114,88,130,40,197,157,157,197,236, -4,154,241,78,87,208,216,253,90,2,168,134,128,69,62,252,213,4,154,124,1,2,254, -254,0,0,0,0,1,0,143,255,29,3,252,4,58,0,11,0,0,1,17,33,17,51,17,33,21,35,53, -33,17,1,84,1,227,197,254,175,197,254,169,4,58,252,96,3,160,251,198,227,227,4, -58,0,1,0,108,255,235,6,98,5,176,0,42,0,0,1,6,2,7,20,18,55,51,22,54,53,17,51, -17,20,22,55,51,22,18,53,38,2,39,51,22,18,21,16,2,35,34,38,39,14,1,35,34,2,17, -52,18,55,1,213,65,95,4,112,116,6,101,132,198,131,101,6,115,114,5,95,64,206,61, -94,205,214,125,176,43,44,176,124,215,204,93,62,5,176,131,254,51,162,234,254, -179,5,6,255,221,2,22,253,234,221,255,6,5,1,76,235,162,1,205,131,105,254,54, -191,254,213,254,88,173,155,155,173,1,168,1,43,192,1,201,105,0,0,1,0,127,255, -235,5,210,4,58,0,40,0,0,1,6,2,7,20,22,51,50,54,53,17,51,17,20,22,51,50,54,53, -38,2,39,51,22,18,21,20,2,35,34,38,39,14,1,35,34,2,53,52,18,55,1,212,65,76,3, -83,89,98,116,198,115,99,87,84,4,76,65,207,60,75,174,184,119,165,40,41,164,118, -185,173,74,61,4,58,136,254,254,126,190,239,162,175,1,44,254,212,175,162,238, -191,127,1,3,134,106,254,252,154,254,254,183,121,116,117,120,1,73,254,154,1,4, -106,0,0,3,0,113,255,235,5,2,5,197,0,13,0,30,0,47,0,0,1,16,0,33,34,0,25,1,16,0, -51,32,0,17,5,50,54,55,53,52,2,35,34,2,29,1,62,1,51,50,4,5,14,1,35,34,38,35,34, -6,7,21,20,18,51,50,54,53,5,2,254,181,254,248,255,254,193,1,63,255,1,8,1,75, -254,138,55,95,27,216,182,172,205,36,87,49,87,1,2,1,2,37,90,50,109,237,80,55, -92,25,205,172,183,215,2,86,254,245,254,160,1,96,1,11,1,3,1,10,1,98,254,159, -254,245,140,41,33,68,200,1,0,255,0,200,68,28,32,134,99,27,29,133,47,35,15,202, -255,0,255,203,0,0,0,3,0,97,255,235,4,42,4,78,0,13,0,29,0,45,0,0,19,52,0,51,50, -0,29,1,20,0,35,34,0,53,37,50,54,55,46,1,35,34,6,7,23,62,1,51,50,22,5,34,6,7, -30,1,51,50,54,55,39,14,1,35,34,38,97,1,4,223,225,1,5,254,252,224,224,254,251, -2,128,43,74,9,19,143,121,134,142,2,4,20,70,41,62,182,254,249,38,67,14,16,143, -124,131,142,4,3,21,75,43,76,167,2,39,240,1,55,254,202,241,22,242,254,204,1,53, -241,27,50,38,135,168,201,149,5,23,31,90,44,40,30,139,170,193,148,4,26,31,91,0, -1,0,212,4,164,3,163,5,252,0,7,0,0,1,21,39,55,33,39,23,21,1,131,175,1,2,32,1, -175,5,34,126,1,235,108,1,217,0,0,0,1,0,251,5,23,3,243,6,21,0,17,0,0,1,50,36, -51,50,22,29,1,35,53,52,38,35,34,4,43,1,53,1,39,113,1,36,73,113,125,134,59,49, -43,254,213,130,46,5,153,124,110,108,36,18,52,54,124,130,0,0,1,1,231,5,11,2, -241,6,116,0,5,0,0,1,53,51,7,23,7,1,231,188,1,79,81,5,220,152,170,125,66,0,1,1, -231,5,11,2,241,6,116,0,5,0,0,1,39,55,39,51,21,2,56,81,79,1,188,5,11,66,125, -170,152,0,1,0,105,255,235,4,45,5,176,0,28,0,0,1,39,33,53,33,23,1,30,1,21,20,4, -35,34,36,63,1,51,20,22,51,50,54,53,52,38,43,1,53,3,13,2,253,137,3,101,1,254, -103,219,241,254,238,221,192,254,235,5,2,189,152,121,139,159,161,160,146,5,16, -5,155,120,254,21,13,227,199,200,227,214,205,6,114,157,149,120,153,143,154,0,0, -0,0,1,0,105,254,117,4,45,4,58,0,28,0,0,1,39,33,53,33,23,1,30,1,21,20,4,35,34, -36,63,1,51,20,22,51,50,54,53,52,38,43,1,53,2,248,3,253,159,3,101,1,254,116, -214,233,254,237,220,191,254,234,5,2,189,152,121,139,159,162,160,147,3,153,5, -156,120,254,19,16,226,196,198,228,215,203,6,112,157,149,118,154,142,154,0,0,0, -255,255,0,179,2,136,4,240,3,35,0,70,1,33,217,0,83,51,64,0,255,255,0,187,2,136, -5,243,3,35,0,70,1,33,175,0,102,102,64,0,0,1,0,145,3,149,1,87,5,176,0,5,0,0,19, -55,51,3,17,35,145,101,97,1,197,4,181,251,255,0,254,229,0,1,0,160,3,149,1,102, -5,176,0,5,0,0,1,7,35,55,17,51,1,102,101,97,1,197,4,144,251,248,1,35,0,1,0,168, -255,1,1,110,0,249,0,5,0,0,37,3,35,19,53,51,1,110,101,97,1,197,26,254,231,1,7, -241,255,255,0,85,3,149,1,27,5,176,0,71,1,8,1,187,0,0,192,1,64,0,0,0,255,255,0, -145,3,149,2,170,5,176,0,38,1,7,0,0,0,7,1,7,1,83,0,0,255,255,0,160,3,149,2,193, -5,176,0,38,1,8,0,0,0,7,1,8,1,91,0,0,0,2,0,176,255,17,2,170,1,24,0,5,0,11,0,0, -37,7,35,55,17,51,1,7,35,55,17,51,1,118,101,97,1,197,1,52,100,98,1,197,10,249, -240,1,23,254,242,249,247,1,16,0,0,1,0,70,0,0,4,36,5,176,0,11,0,0,1,33,17,35, -17,33,53,33,17,51,17,33,4,36,254,113,197,254,118,1,138,197,1,143,3,158,252,98, -3,158,156,1,118,254,138,0,0,0,0,1,0,87,254,96,4,52,5,176,0,19,0,0,41,1,17,35, -17,33,53,33,17,33,53,33,17,51,17,33,21,33,17,33,4,52,254,113,197,254,119,1, -137,254,119,1,137,197,1,143,254,113,1,143,254,96,1,160,154,3,4,156,1,118,254, -138,156,252,252,0,0,0,0,1,0,137,2,23,2,39,3,225,0,13,0,0,19,52,54,51,50,22,29, -1,20,6,35,34,38,53,137,112,94,95,113,112,95,95,112,3,25,88,112,112,88,60,89, -109,110,88,255,255,0,161,0,0,4,197,0,202,0,38,0,14,0,0,0,39,0,14,1,187,0,0,0, -7,0,14,3,95,0,0,0,6,0,64,255,235,7,85,5,197,0,25,0,39,0,53,0,67,0,81,0,85,0,0, -1,52,54,51,50,22,23,62,1,51,50,22,29,1,20,6,35,34,38,39,14,1,35,34,38,53,1,52, -54,51,50,22,29,1,20,6,35,34,38,53,1,20,22,51,50,54,61,1,52,38,35,34,6,21,5,20, -22,51,50,54,61,1,52,38,35,34,6,21,1,20,22,51,50,54,61,1,52,38,35,34,6,21,19, -39,1,23,3,51,164,136,74,117,37,37,117,74,137,165,164,136,75,118,37,37,116,73, -138,164,253,13,164,136,138,164,164,136,137,165,3,133,81,75,74,80,82,74,74,80, -1,200,81,75,73,80,81,74,74,80,251,69,81,75,73,81,82,74,74,80,248,109,2,199, -109,1,101,126,174,63,54,54,63,173,127,78,128,172,61,55,55,61,172,128,3,129, -127,174,173,128,77,127,172,172,127,252,204,75,103,103,75,78,74,104,104,74,78, -75,103,103,75,78,74,104,104,74,2,230,74,103,102,75,77,74,105,105,74,251,214, -67,4,114,67,0,0,0,0,1,0,88,0,72,1,218,3,160,0,10,0,0,19,7,31,1,21,7,1,53,1,23, -21,245,61,61,229,5,254,131,1,125,5,2,21,34,36,204,184,3,1,97,150,1,97,3,184,0, -0,0,0,1,0,144,0,71,2,19,3,159,0,10,0,0,19,53,55,1,21,1,39,53,63,1,39,144,5,1, -126,254,130,5,230,61,61,2,228,185,2,254,159,150,254,159,2,185,208,34,36,0,0,0, -0,1,0,59,0,110,3,111,5,35,0,3,0,0,55,39,1,23,168,109,2,199,109,110,67,4,114, -67,0,2,0,71,2,48,3,83,5,197,0,10,0,15,0,0,1,51,21,35,21,35,53,33,39,1,51,1,33, -17,39,7,2,190,149,149,172,254,57,4,1,198,177,254,71,1,13,6,13,3,105,129,184, -184,96,2,125,253,164,1,121,1,26,0,0,1,0,70,0,0,4,87,5,197,0,40,0,0,1,14,1,7, -33,7,33,53,51,62,1,55,35,53,51,39,35,53,51,39,52,54,51,50,22,15,1,35,52,38,35, -34,6,21,23,33,21,33,23,33,21,1,179,2,30,27,2,223,1,252,48,10,45,47,4,170,165, -6,158,152,5,224,188,200,220,4,2,190,126,98,99,116,5,1,166,254,96,5,1,155,1, -185,83,150,54,154,154,12,173,102,155,143,155,146,204,233,209,172,6,118,114, -149,133,146,155,143,155,0,0,0,0,1,0,79,255,235,3,213,5,197,0,42,0,0,1,33,7,6, -22,51,50,54,55,23,14,1,35,34,0,53,35,53,51,53,35,53,51,53,52,0,51,50,22,23,7, -46,1,35,34,6,29,1,33,21,33,21,33,3,146,254,27,2,4,171,147,57,112,52,19,56,123, -61,231,254,227,146,146,146,146,1,27,231,59,117,66,19,54,113,56,146,171,1,236, -254,20,1,236,2,0,5,169,205,17,17,157,15,16,1,33,244,124,166,125,15,244,1,35, -16,15,159,16,19,206,172,17,125,166,0,0,2,0,103,3,151,4,96,5,176,0,15,0,23,0,0, -1,39,3,35,3,7,17,35,17,51,19,51,19,51,17,35,1,35,17,35,17,35,53,33,4,3,6,150, -51,156,6,93,116,161,6,162,110,93,253,228,145,94,145,1,128,4,238,2,254,167,1, -103,2,254,155,2,25,254,122,1,134,253,231,1,199,254,57,1,199,82,0,0,255,255,0, -107,255,245,6,82,5,178,0,39,1,101,0,12,2,134,0,39,1,21,1,6,0,0,0,7,1,108,3,75, -0,0,0,0,255,255,0,110,255,245,6,233,5,192,0,39,1,103,0,4,2,148,0,39,1,21,1, -191,0,0,0,7,1,108,3,226,0,0,0,0,255,255,0,111,255,245,7,25,5,175,0,39,1,105, -255,253,2,142,0,39,1,21,1,247,0,0,0,7,1,108,4,18,0,0,0,0,255,255,0,107,255, -245,6,114,5,175,0,39,1,107,0,12,2,142,0,39,1,21,1,54,0,0,0,7,1,108,3,107,0,0, -0,0,0,2,0,72,255,235,4,48,5,237,0,20,0,33,0,0,1,4,0,17,21,20,0,35,34,0,53,52, -18,51,50,22,23,55,46,1,39,19,50,54,61,1,46,1,35,34,6,21,20,22,1,231,1,7,1,66, -254,224,215,218,254,233,250,218,95,168,54,3,22,235,176,146,133,169,36,172,127, -136,135,164,5,237,63,254,108,254,217,220,245,254,201,1,24,207,233,1,23,59,52, -5,193,236,52,251,60,228,174,129,67,92,201,156,132,201,0,0,0,1,0,168,255,45,4, -244,5,176,0,7,0,0,5,35,17,33,17,35,17,33,4,244,197,253,62,197,4,76,211,5,232, -250,24,6,131,0,0,0,0,1,0,70,254,243,4,174,5,176,0,14,0,0,9,1,23,33,21,33,53,9, -1,53,33,21,33,7,1,3,101,253,210,2,3,117,251,152,2,98,253,158,4,25,252,216,2,2, -48,2,36,253,111,5,155,146,2,201,2,207,147,155,5,253,103,0,0,0,0,1,0,168,2,136, -3,235,3,35,0,3,0,0,1,33,53,33,3,235,252,189,3,67,2,136,155,0,0,1,0,63,0,0,4, -173,5,176,0,11,0,0,1,23,51,55,1,51,1,35,3,35,53,33,2,42,18,6,19,1,143,201,253, -219,149,248,188,1,72,1,84,83,83,4,92,250,80,2,116,156,0,3,0,104,255,235,7,187, -4,78,0,25,0,39,0,53,0,0,1,20,2,35,34,38,39,14,1,35,34,2,61,1,52,18,51,50,22, -23,62,1,51,50,18,21,5,20,22,51,50,18,55,53,38,2,35,34,6,21,33,52,38,35,34,2,7, -21,22,18,51,50,54,53,7,187,247,208,165,238,80,80,239,163,209,246,245,208,164, -240,81,79,240,165,206,247,249,114,132,126,137,213,27,28,213,138,125,131,5,201, -133,123,138,212,30,29,212,137,125,133,1,220,221,254,236,215,156,155,216,1,20, -221,128,220,1,22,216,155,154,217,254,234,220,128,151,192,1,23,108,42,106,1,23, -195,148,148,195,254,235,108,42,110,254,235,193,150,0,1,255,188,254,75,2,147,6, -45,0,27,0,0,19,50,54,53,17,52,54,51,50,22,23,7,46,1,35,34,6,21,17,20,6,35,34, -38,39,55,30,1,43,59,69,182,162,33,69,42,24,20,44,25,87,91,172,153,31,51,29,14, -14,65,254,230,103,90,5,28,173,189,11,10,145,5,6,109,98,250,228,167,181,9,9, -150,5,8,0,1,0,152,0,167,3,218,4,227,0,19,0,0,1,51,21,33,7,33,21,33,7,39,55,35, -53,33,55,33,53,33,19,23,3,25,193,254,228,140,1,168,253,253,133,87,100,199,1, -34,140,254,82,2,9,147,87,3,219,164,252,164,240,60,180,164,252,164,1,8,60,0, -255,255,0,158,0,6,3,230,4,75,0,103,0,28,0,87,0,188,64,0,57,154,0,7,1,33,255, -251,253,126,0,0,255,255,0,154,0,4,3,242,4,76,0,103,0,30,0,18,0,207,64,0,57, -154,0,7,1,33,255,251,253,124,0,0,255,255,0,169,254,176,1,131,255,121,0,7,0, -155,0,9,249,201,0,0,0,1,0,93,4,23,1,148,5,179,0,15,0,0,19,39,62,1,53,52,38,35, -55,50,22,21,20,6,15,1,112,1,76,65,88,71,7,146,158,87,64,1,4,23,154,4,31,38,39, -38,108,103,86,70,73,9,71,0,0,0,0,2,0,125,4,228,4,113,6,152,0,8,0,12,0,0,1,51, -5,7,35,39,7,47,1,1,51,3,35,1,149,156,1,31,2,195,157,165,202,2,3,33,211,204, -147,5,224,235,6,137,148,9,5,1,166,254,252,0,0,0,0,2,255,85,4,228,3,71,6,152,0, -8,0,12,0,0,1,15,1,39,7,35,39,37,51,5,35,3,51,3,71,2,201,165,158,194,2,1,31, -155,254,132,147,203,210,4,242,5,9,148,137,6,235,76,1,4,0,2,0,110,4,228,4,49,6, -209,0,8,0,24,0,0,1,35,1,23,51,55,23,51,55,47,1,62,1,53,52,38,35,55,50,22,21, -20,6,15,1,2,64,198,254,244,2,169,196,196,170,2,25,1,66,55,75,62,6,127,137,75, -57,1,5,235,254,255,6,186,186,6,132,133,4,26,32,34,32,94,87,75,61,64,7,61,0,0, -0,2,0,110,4,228,3,77,6,252,0,8,0,28,0,0,1,7,35,39,7,35,39,1,51,55,20,6,35,34, -38,35,34,6,21,39,52,54,51,50,22,51,50,54,53,3,77,2,170,196,196,169,2,1,33,157, -182,97,66,53,113,38,31,51,80,96,66,42,123,39,30,54,4,234,6,176,176,6,1,1,250, -69,107,71,59,34,19,69,111,69,56,35,0,2,0,129,4,223,2,224,6,139,0,15,0,20,0,0, -1,23,22,6,35,34,38,63,1,51,20,22,51,50,54,53,39,51,23,7,35,2,216,2,6,164,139, -140,164,7,2,151,69,75,73,70,93,155,2,159,106,5,176,6,89,114,114,89,6,51,63,63, -51,219,5,192,0,2,0,129,4,224,2,202,7,42,0,15,0,32,0,0,1,20,6,35,34,38,53,35,7, -6,22,51,50,54,47,1,37,39,62,1,39,53,54,38,35,55,50,22,21,20,6,15,1,2,49,68,71, -72,68,144,2,7,158,135,134,158,6,2,254,179,1,73,60,5,5,81,70,7,142,152,83,63,1, -5,176,51,63,64,50,6,89,113,113,89,6,56,126,3,23,26,6,28,27,83,78,66,53,55,7, -63,0,0,0,2,0,129,4,219,2,211,6,212,0,15,0,35,0,0,1,23,22,6,35,34,38,63,1,51, -20,22,51,50,54,53,19,20,6,35,34,38,35,34,6,21,39,52,54,51,50,22,51,50,54,53,2, -203,2,6,160,136,137,161,7,2,148,67,74,71,69,148,95,71,58,124,41,34,45,88,94, -73,45,135,43,32,48,5,176,6,91,116,116,91,6,52,65,65,52,1,12,75,107,76,52,37, -21,74,111,76,51,38,0,1,0,96,254,210,1,37,0,157,0,3,0,0,1,35,17,51,1,37,197, -197,254,210,1,203,0,0,0,1,0,161,254,75,2,87,0,178,0,15,0,0,37,17,20,22,51,50, -54,55,23,14,1,35,34,38,53,17,1,92,75,63,18,66,14,15,29,53,31,154,171,178,254, -245,87,95,7,5,160,9,9,181,167,1,11,0,0,0,0,1,255,190,254,75,1,114,0,154,0,15, -0,0,37,21,20,6,35,34,38,39,55,30,1,51,50,54,61,1,1,114,172,153,31,51,29,14,14, -64,19,60,68,154,243,167,181,9,9,160,5,7,94,88,243,0,0,1,255,160,255,206,2,202, -3,112,0,15,0,0,3,33,50,0,21,6,2,7,39,62,1,53,46,1,35,33,96,1,23,235,1,40,2, -195,190,51,128,112,1,182,150,254,233,3,112,255,0,220,138,254,230,34,148,34, -157,115,147,164,0,0,0,1,0,113,0,0,2,85,5,197,0,5,0,0,33,35,17,5,53,37,2,85, -197,254,225,1,228,4,250,3,162,44,0,1,0,83,0,0,3,231,5,197,0,26,0,0,41,1,53,1, -62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,1,23,33,3,231,252,143, -1,175,125,92,122,112,120,133,189,2,5,245,204,198,233,159,159,254,224,2,2,128, -154,1,245,138,169,82,121,157,159,117,6,178,247,227,208,125,233,179,254,166,5, -0,1,0,105,255,235,4,45,5,197,0,42,0,0,1,50,54,53,52,38,35,34,6,21,35,39,38,36, -51,50,22,21,20,6,7,30,1,21,20,4,35,34,36,63,1,51,20,22,51,50,54,53,52,38,43,1, -53,2,78,132,128,140,136,107,146,189,2,5,1,4,189,219,253,115,100,115,123,254, -238,221,192,254,235,5,2,189,152,121,139,159,143,139,182,3,51,132,115,112,144, -142,105,6,176,220,215,200,101,166,48,42,174,125,200,227,214,205,6,114,157,149, -120,133,129,155,0,2,0,73,0,0,4,111,5,176,0,10,0,15,0,0,1,51,21,35,17,35,17,33, -53,1,51,1,33,17,39,7,3,156,211,211,197,253,114,2,131,208,253,141,1,174,6,18,1, -212,154,254,198,1,58,111,4,7,252,36,2,208,1,45,0,1,0,132,255,235,4,61,5,176,0, -31,0,0,27,1,33,21,33,3,62,1,55,54,22,21,20,2,35,34,36,63,2,20,22,51,50,54,53, -52,38,35,34,6,7,176,84,3,2,253,164,47,49,125,80,213,239,246,234,202,254,241,5, -2,180,162,124,134,149,150,133,125,113,28,2,125,3,51,175,254,84,34,45,2,2,249, -223,219,254,246,202,197,6,18,120,149,176,153,138,163,70,72,0,0,0,2,0,142,255, -235,4,86,5,197,0,26,0,39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62,1,51,50,22,21, -20,0,35,34,0,53,17,52,0,19,34,6,7,21,20,22,51,50,54,53,52,38,2,165,86,168,54, -42,65,118,83,148,190,58,164,97,211,241,255,0,218,211,254,229,1,56,165,103,141, -36,171,126,134,143,143,5,197,33,26,151,26,29,224,170,148,67,77,244,220,223, -254,254,1,20,239,1,176,239,1,56,253,48,68,62,133,168,193,178,149,151,146,0,0, -0,0,1,0,37,0,0,3,213,5,176,0,12,0,0,1,10,1,17,21,35,53,16,0,55,33,53,33,3,213, -222,196,197,1,13,153,253,17,3,176,5,21,254,244,254,77,254,145,231,231,1,98,2, -41,163,155,0,0,3,0,130,255,235,4,55,5,197,0,23,0,35,0,47,0,0,1,20,6,7,30,1,21, -20,4,35,34,36,53,52,54,55,46,1,53,52,54,51,50,22,3,52,38,35,34,6,21,20,22,51, -50,54,3,52,38,35,34,6,21,20,22,51,50,54,4,14,129,109,126,153,254,250,201,214, -254,240,156,133,115,133,247,196,185,239,156,155,113,124,163,163,126,114,152, -41,131,96,109,137,140,108,96,129,4,52,114,168,40,41,181,124,202,227,226,203, -124,181,41,39,169,114,192,209,209,252,160,119,154,154,119,122,149,149,3,31, -105,136,131,110,111,138,138,0,0,2,0,92,255,235,4,32,5,197,0,26,0,39,0,0,37,50, -54,61,1,14,1,35,34,38,53,52,0,51,50,0,21,17,20,0,35,34,38,39,55,30,1,19,50,54, -55,53,52,38,35,34,6,21,20,22,2,28,142,176,53,163,95,223,232,1,9,203,220,1,20, -254,224,228,82,172,74,31,69,138,97,114,162,35,159,133,125,152,125,133,186,169, -169,73,76,231,239,223,1,20,254,236,248,254,49,242,254,243,32,31,150,32,27,2, -18,92,69,138,170,190,187,157,160,155,0,2,0,123,255,235,4,47,5,197,0,13,0,27,0, -0,1,20,2,35,34,2,53,17,52,18,51,50,0,21,39,52,38,35,34,6,21,17,20,22,51,50,54, -53,4,47,254,219,220,255,254,219,219,1,0,198,142,135,135,141,143,135,135,140,2, -2,248,254,225,1,31,248,1,172,246,1,33,254,223,246,2,176,202,203,175,254,82, -177,204,203,178,0,0,2,0,39,0,0,4,138,4,141,0,7,0,11,0,0,1,33,3,35,1,51,1,35,1, -33,3,35,3,87,254,3,103,204,1,213,186,1,212,203,253,214,1,135,193,6,1,12,254, -244,4,141,251,115,1,166,1,242,0,0,0,2,0,109,4,165,2,237,6,168,0,15,0,20,0,0,1, -23,22,6,35,34,38,63,1,51,20,22,51,50,54,53,39,35,39,55,51,2,230,2,5,174,146, -147,173,6,2,149,79,84,83,79,76,157,208,2,220,5,176,6,115,146,146,115,6,65,82, -82,65,43,199,6,0,3,0,153,0,0,4,13,4,141,0,14,0,24,0,33,0,0,51,17,33,50,22,21, -20,6,7,30,1,21,20,6,35,1,17,33,50,54,53,52,38,39,35,37,51,50,54,53,52,38,43,1, -153,1,141,213,237,94,87,102,116,221,197,254,243,1,13,109,111,106,103,11,254, -243,200,124,129,123,130,200,4,141,159,159,84,130,33,25,150,96,162,167,2,9,254, -143,94,88,84,100,3,141,89,85,86,70,0,0,0,1,0,112,255,239,4,38,4,157,0,29,0,0, -1,23,22,4,35,34,0,61,1,52,0,51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,51,50, -54,53,4,30,2,5,254,253,206,207,254,235,1,21,207,212,254,5,2,189,142,128,123, -164,164,123,127,142,1,125,6,189,203,1,12,210,243,209,1,12,203,187,6,121,122, -186,137,244,139,187,122,124,0,0,0,2,0,153,0,0,4,49,4,141,0,9,0,19,0,0,51,17, -33,50,0,29,1,20,0,35,3,17,51,50,54,61,1,52,38,35,153,1,165,211,1,32,254,224, -211,224,224,126,176,176,126,4,141,254,243,209,210,210,254,245,3,244,252,164, -186,139,211,137,187,0,0,0,0,1,0,153,0,0,3,200,4,141,0,11,0,0,1,33,17,33,21,33, -17,33,21,33,17,33,3,113,253,237,2,106,252,209,3,47,253,150,2,19,2,18,254,134, -152,4,141,153,254,184,0,0,0,1,0,153,0,0,3,202,4,141,0,9,0,0,1,33,17,35,17,33, -21,33,17,33,3,115,253,235,197,3,49,253,148,2,21,1,245,254,11,4,141,153,254, -155,0,1,0,112,255,239,4,75,4,157,0,32,0,0,37,14,1,35,34,0,61,1,52,0,51,50,22, -15,1,35,52,38,35,34,6,29,1,20,22,51,50,54,55,53,33,53,33,4,75,45,242,181,231, -254,224,1,34,225,222,243,4,2,188,145,126,140,178,176,146,105,137,31,254,254,1, -197,157,65,109,1,9,213,243,211,1,10,201,157,6,101,110,184,139,244,142,184,42, -27,250,154,0,1,0,153,0,0,4,90,4,141,0,11,0,0,33,35,17,33,17,35,17,51,17,33,17, -51,4,90,198,253,202,197,197,2,54,198,1,235,254,21,4,141,253,247,2,9,0,0,0,1,0, -153,0,0,1,93,4,141,0,3,0,0,33,35,17,51,1,93,196,196,4,141,0,1,0,64,255,239,3, -119,4,141,0,16,0,0,1,51,17,20,6,35,34,38,63,1,51,20,22,51,50,54,53,2,179,196, -227,175,195,226,6,2,188,118,107,88,118,4,141,252,213,170,201,178,170,6,101, -101,121,98,0,0,0,1,0,153,0,0,4,65,4,141,0,14,0,0,1,35,17,35,17,51,17,51,1,51, -23,9,1,7,35,1,193,99,197,197,84,1,132,231,3,254,57,1,232,3,241,1,244,254,12,4, -141,254,4,1,252,5,253,214,253,167,5,0,0,0,0,1,0,153,0,0,3,107,4,141,0,5,0,0, -37,33,21,33,17,51,1,94,2,13,253,46,197,152,152,4,141,0,0,1,0,153,0,0,5,85,4, -141,0,15,0,0,1,51,1,51,17,35,17,39,1,35,1,7,17,35,17,51,2,247,6,1,98,246,197, -6,254,180,136,254,174,6,197,254,1,3,3,138,251,115,3,41,2,252,213,3,61,2,252, -197,4,141,0,1,0,153,0,0,4,118,4,141,0,11,0,0,33,35,1,7,17,35,17,51,1,55,17,51, -4,118,196,253,178,6,197,197,2,78,6,196,3,91,2,252,167,4,141,252,165,2,3,89,0, -0,0,2,0,112,255,239,4,91,4,157,0,13,0,27,0,0,1,20,0,35,34,0,61,1,52,0,51,50,0, -21,39,52,38,35,34,6,29,1,20,22,51,50,54,53,4,91,254,235,224,223,254,233,1,21, -223,224,1,23,197,164,142,141,162,163,142,142,162,1,205,214,254,248,1,9,213, -243,212,1,9,254,247,212,1,151,172,172,151,244,154,172,172,154,0,2,0,153,0,0,4, -31,4,141,0,10,0,19,0,0,1,17,35,17,33,50,22,21,20,6,35,37,33,50,54,53,52,38,35, -33,1,94,197,1,210,203,233,233,203,254,243,1,13,117,121,121,117,254,243,1,164, -254,92,4,141,208,165,166,206,154,126,90,92,130,0,0,0,2,0,112,255,138,4,154,4, -157,0,19,0,33,0,0,1,20,6,7,23,7,39,14,1,35,34,0,61,1,52,0,51,50,0,21,39,52,38, -35,34,6,29,1,20,22,51,50,54,53,4,91,52,48,163,135,167,56,133,73,223,254,233,1, -21,223,224,1,23,197,164,142,141,162,163,142,142,162,1,205,89,155,60,159,116, -161,30,30,1,9,213,243,212,1,9,254,247,212,1,151,172,172,151,244,154,172,172, -154,0,2,0,153,0,0,4,44,4,141,0,26,0,35,0,0,1,17,35,17,33,50,22,21,20,6,7,30,1, -29,1,20,22,23,21,35,46,1,61,1,52,38,35,37,33,50,54,53,52,38,35,33,1,94,197,1, -205,205,225,99,96,104,91,11,13,203,12,6,104,98,254,217,1,8,120,112,113,119, -254,248,1,223,254,33,4,141,180,162,89,126,39,30,144,105,118,45,86,22,19,23,98, -52,116,90,100,154,94,88,92,105,0,0,0,1,0,93,255,239,4,17,4,157,0,39,0,0,1,52, -38,39,46,1,53,52,54,51,50,22,15,1,35,52,38,35,34,6,21,20,22,23,30,1,21,20,6, -35,34,36,63,1,51,20,22,51,50,54,3,76,124,162,223,203,243,206,210,235,5,2,187, -132,119,125,127,115,178,215,204,254,218,202,254,238,6,1,188,163,118,131,144,1, -48,71,88,40,58,149,150,147,174,186,168,6,92,115,93,74,73,81,43,58,156,145,154, -168,170,184,6,108,100,94,0,0,0,1,0,71,0,0,3,209,4,141,0,7,0,0,1,33,17,35,17, -33,53,33,3,209,254,155,197,254,160,3,138,3,244,252,12,3,244,153,0,0,0,1,0,137, -255,239,4,116,4,141,0,17,0,0,1,17,20,4,35,34,36,53,17,51,17,20,22,51,50,54,53, -17,4,116,254,233,223,221,254,232,196,169,136,137,169,4,141,253,1,195,220,220, -195,2,255,253,1,123,140,139,124,2,255,0,0,1,0,39,0,0,4,131,4,141,0,9,0,0,1,23, -51,55,1,51,1,35,1,51,2,59,23,6,23,1,65,211,254,46,185,254,47,211,1,41,82,80,3, -102,251,115,4,141,0,1,0,63,0,0,5,192,4,141,0,17,0,0,1,21,55,19,51,19,21,55,19, -51,1,35,3,35,3,35,1,51,1,199,1,221,183,221,1,179,211,254,218,182,225,6,227, -181,254,218,211,1,8,3,5,3,131,252,123,3,5,3,131,251,115,3,87,252,169,4,141,0, -0,1,0,55,0,0,4,66,4,141,0,11,0,0,9,1,51,9,1,35,9,1,35,9,1,51,2,58,1,22,233, -254,120,1,145,230,254,225,254,227,233,1,146,254,119,232,2,220,1,177,253,191, -253,180,1,186,254,70,2,76,2,65,0,0,0,1,0,30,0,0,4,53,4,141,0,8,0,0,9,1,51,1, -17,35,17,1,51,2,41,1,47,221,254,84,197,254,90,221,2,77,2,64,253,13,254,102,1, -163,2,234,0,0,0,1,0,78,0,0,3,216,4,141,0,9,0,0,37,33,21,33,53,1,33,53,33,21,1, -61,2,155,252,118,2,129,253,161,3,80,152,152,118,3,126,153,114,0,0,2,0,120,255, -239,3,250,4,157,0,13,0,27,0,0,1,20,6,35,34,38,53,17,52,54,51,50,22,21,39,52, -38,35,34,6,21,17,20,22,51,50,54,53,3,250,247,201,202,248,247,201,202,248,197, -136,117,115,136,137,116,116,135,1,155,197,231,232,196,1,87,195,232,232,195,1, -124,149,150,123,254,168,125,151,150,126,0,0,0,1,0,78,0,0,1,195,4,157,0,5,0,0, -33,35,17,7,53,37,1,195,197,176,1,117,3,222,2,160,33,0,0,1,0,89,0,0,3,115,4, -157,0,26,0,0,41,1,53,1,62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6, -15,1,23,33,3,115,252,243,1,150,102,69,92,87,101,114,188,2,6,224,187,175,201, -117,158,248,3,2,15,152,1,150,97,114,62,84,113,115,83,6,143,202,184,168,109, -153,160,249,6,0,0,0,1,0,90,255,239,3,163,4,157,0,42,0,0,1,50,54,53,52,38,35, -34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20,6,35,34,38,63,1,51,20,22,51, -50,54,53,52,38,43,1,53,2,0,104,99,110,106,84,114,187,2,6,226,167,192,221,96, -84,96,103,240,192,168,241,5,2,186,121,95,108,126,111,110,168,2,157,95,84,76, -104,96,71,6,140,174,172,160,80,133,38,35,138,99,161,182,171,162,6,77,110,109, -82,98,95,150,0,0,0,0,2,0,71,0,0,4,21,4,141,0,10,0,14,0,0,1,51,21,35,21,35,53, -33,39,1,51,3,17,39,1,3,82,195,195,197,253,190,4,2,63,204,197,6,254,153,1,133, -154,235,235,122,3,40,252,248,1,251,2,254,3,0,0,0,0,1,0,90,255,239,3,168,4,141, -0,31,0,0,27,1,33,21,33,3,62,1,55,54,22,21,20,6,35,34,38,63,2,20,22,51,50,54, -53,52,38,35,34,6,7,135,71,2,166,254,5,33,37,114,56,181,204,210,219,178,239,5, -1,189,123,99,118,114,111,101,102,99,24,1,248,2,149,164,254,202,25,37,2,3,202, -185,178,210,161,157,6,14,83,103,124,110,107,125,57,53,0,2,0,120,255,239,3,215, -4,157,0,26,0,39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62,1,51,50,22,21,20,6,35, -34,38,53,17,52,36,19,34,6,7,21,20,22,51,50,54,53,52,38,2,79,66,147,67,33,58, -114,73,121,155,50,143,88,185,200,239,191,186,247,1,17,161,88,122,27,134,102, -105,128,114,4,157,28,23,148,24,22,163,125,106,52,58,198,179,171,213,248,196,1, -55,195,248,253,177,64,54,45,125,167,134,98,104,119,0,1,0,71,0,0,3,103,4,141,0, -12,0,0,1,6,2,17,21,35,53,16,18,55,33,53,33,3,103,189,163,197,231,142,253,144, -3,32,3,244,232,254,192,254,237,185,185,1,12,1,150,153,153,0,0,0,0,3,0,88,255, -239,3,201,4,157,0,23,0,35,0,47,0,0,1,20,6,7,30,1,21,20,6,35,34,38,53,52,54,55, -46,1,53,52,54,51,50,22,3,52,38,35,34,6,21,20,22,51,50,54,3,52,38,35,34,6,21, -20,22,51,50,54,3,166,102,86,102,121,247,185,194,255,123,106,91,104,233,180, -172,227,163,139,97,105,145,145,107,98,136,35,119,82,93,123,125,93,83,116,3,92, -87,132,37,39,144,94,162,182,182,162,94,145,38,37,132,87,153,168,168,253,86,84, -111,111,84,87,109,109,2,100,74,98,94,78,77,99,99,0,0,0,0,2,0,71,255,239,3,160, -4,157,0,26,0,39,0,0,37,50,54,61,1,14,1,35,34,38,53,52,54,51,50,22,21,17,20,4, -35,34,38,39,55,30,1,19,50,54,55,53,52,38,35,34,6,21,20,22,1,222,108,145,45, -127,72,195,221,240,190,185,242,255,0,194,68,148,67,31,60,117,91,88,124,25,133, -99,102,128,116,135,148,110,117,50,52,207,175,166,225,249,195,254,169,181,230, -26,24,149,26,21,1,163,74,54,55,124,167,146,92,102,134,0,0,2,0,120,255,245,3, -30,3,44,0,13,0,27,0,0,1,20,6,35,34,38,61,1,52,54,51,50,22,21,39,52,38,35,34,6, -29,1,20,22,51,50,54,53,3,30,187,151,153,187,186,152,152,188,173,89,78,78,88, -89,79,77,88,1,27,136,158,158,136,235,134,160,160,134,1,76,86,86,76,236,78,86, -86,78,0,1,0,95,0,0,1,140,3,44,0,5,0,0,33,35,17,35,53,37,1,140,174,127,1,45,2, -143,134,23,0,0,0,1,0,113,0,0,2,202,3,44,0,26,0,0,41,1,53,1,62,1,53,52,38,35, -34,6,21,35,39,38,54,51,50,22,21,20,6,15,1,23,33,2,202,253,176,1,46,69,44,57, -58,67,73,161,2,6,168,141,135,152,89,116,153,2,1,105,130,1,6,60,75,42,50,62,64, -50,6,99,140,128,116,80,112,105,135,6,0,0,0,1,0,106,255,245,2,228,3,44,0,42,0, -0,1,50,54,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20,6,35, -34,38,63,1,51,20,22,51,50,54,53,52,38,43,1,53,1,168,67,65,73,69,56,69,162,2,6, -169,126,145,168,71,62,70,76,180,146,127,181,6,1,163,75,63,72,84,73,73,132,1, -215,57,52,43,58,48,40,6,94,119,119,110,55,91,26,23,96,68,111,124,116,111,6,46, -57,59,48,62,57,126,0,0,0,0,2,0,87,0,0,3,40,3,33,0,10,0,15,0,0,1,51,21,35,21, -35,53,33,39,1,51,1,51,17,39,7,2,170,126,126,170,254,95,8,1,166,173,254,99,243, -6,13,1,26,130,152,152,102,2,35,253,249,1,54,1,22,0,0,0,1,0,114,255,245,2,246, -3,33,0,31,0,0,27,1,33,21,33,7,62,1,55,54,22,21,20,6,35,34,38,63,2,20,22,51,50, -54,53,52,38,35,34,6,7,146,52,2,4,254,149,26,30,79,42,132,150,159,166,137,182, -6,1,162,82,68,78,76,77,67,65,67,15,1,90,1,199,133,185,17,25,1,2,145,128,122, -144,110,106,6,10,48,54,69,66,66,81,34,30,0,0,2,0,120,255,245,3,4,3,44,0,26,0, -39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62,1,51,50,22,21,20,6,35,34,38,61,1,52, -54,19,34,6,7,21,20,22,51,50,54,53,52,38,1,222,53,108,43,30,39,82,51,83,105,36, -101,63,132,148,182,144,141,185,205,128,64,83,14,86,68,71,84,74,3,44,19,16,127, -16,15,94,78,66,34,38,140,122,118,146,170,135,214,135,169,254,86,44,38,10,78, -97,75,59,63,70,0,0,0,1,0,95,0,0,2,172,3,33,0,12,0,0,1,14,1,29,1,35,53,52,18, -55,33,53,33,2,172,134,111,172,155,89,254,96,2,77,2,158,158,203,182,127,127, -181,1,23,83,131,0,0,0,3,0,112,255,245,3,7,3,44,0,23,0,35,0,47,0,0,1,20,6,7,30, -1,21,20,6,35,34,38,53,52,54,55,46,1,53,52,54,51,50,22,3,52,38,35,34,6,21,20, -22,51,50,54,3,52,38,35,34,6,21,20,22,51,50,54,2,239,73,62,73,86,185,140,146, -192,89,76,66,74,177,135,130,172,146,92,64,70,96,95,72,65,90,26,75,55,61,79,81, -60,53,76,2,80,59,91,27,28,99,63,112,124,124,112,63,100,28,27,90,59,105,115, -115,254,47,51,67,66,52,52,61,61,1,147,45,53,52,46,46,57,57,0,0,0,0,2,0,104, -255,245,2,236,3,44,0,26,0,39,0,0,37,50,54,61,1,14,1,35,34,38,53,52,54,51,50, -22,29,1,20,6,35,34,38,39,55,30,1,19,50,54,55,53,52,38,35,34,6,21,20,22,1,151, -72,96,31,84,47,145,164,180,143,138,183,195,146,51,110,50,28,43,84,72,60,79,13, -88,66,66,80,75,119,84,67,73,33,34,145,122,114,155,172,134,235,125,157,18,16, -127,17,14,1,23,49,35,24,76,99,83,55,66,79,0,0,0,0,1,0,120,255,45,1,103,0,243, -0,5,0,0,37,3,35,19,53,51,1,103,132,107,42,197,46,254,255,1,10,188,0,1,0,22,0, -0,5,23,5,196,0,21,0,0,1,23,51,55,19,62,1,51,50,22,23,7,46,1,35,34,6,7,1,35,1, -51,2,89,32,6,33,224,47,156,95,33,51,25,22,6,21,13,52,70,26,254,139,168,253, -238,214,1,126,120,120,3,37,148,141,11,15,151,2,5,65,78,251,117,5,176,0,1,0,46, -0,0,4,14,4,77,0,21,0,0,1,23,51,55,19,62,1,51,50,22,23,7,46,1,35,34,6,7,1,35,1, -51,1,227,17,6,19,149,41,132,82,34,51,24,22,5,22,13,32,59,13,254,216,149,254, -131,202,1,63,76,76,2,23,127,120,10,15,151,3,5,52,42,252,185,4,58,0,1,0,118, -254,128,4,191,5,197,0,25,0,0,1,35,17,38,0,53,17,16,0,51,50,0,15,1,35,52,38,35, -34,2,21,17,20,18,59,1,3,23,196,215,254,250,1,55,247,247,1,36,4,2,189,180,164, -165,196,196,165,115,254,128,1,113,29,1,82,246,1,3,1,13,1,95,254,249,217,6,153, -178,254,246,197,254,251,199,254,246,0,0,0,1,0,98,254,128,3,225,4,78,0,25,0,0, -1,35,17,38,2,61,1,52,18,51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,59,1,2,167, -197,181,203,255,220,182,238,4,2,178,137,99,138,140,139,139,106,254,128,1,115, -32,1,42,203,42,227,1,57,224,163,6,98,140,230,155,42,159,228,0,0,0,0,1,0,163, -255,104,4,209,5,176,0,23,0,0,1,22,4,21,6,2,7,39,62,1,53,46,1,35,33,17,35,17, -51,17,51,1,51,23,2,195,232,1,25,2,225,221,51,160,142,2,178,154,254,183,197, -197,128,2,8,222,3,3,43,5,250,232,144,254,217,37,150,34,170,122,165,159,253, -120,5,176,253,124,2,132,5,0,0,0,0,1,0,153,254,254,4,30,4,58,0,23,0,0,1,30,1, -21,6,2,7,39,62,1,53,46,1,43,1,17,35,17,51,17,51,1,51,23,2,137,184,215,2,194, -190,51,128,113,2,178,154,168,197,197,84,1,131,231,2,2,101,30,222,185,133,254, -245,34,150,32,145,107,144,139,254,53,4,58,254,55,1,201,5,0,0,1,0,163,255,201, -4,116,5,176,0,21,0,0,1,33,17,51,50,0,21,6,2,7,39,62,1,53,46,1,43,1,17,35,17, -33,4,32,253,72,249,235,1,40,2,195,190,51,128,112,1,182,150,249,197,3,125,5,21, -254,86,255,0,220,138,254,230,34,148,34,157,115,147,164,253,58,5,176,0,0,0,1,0, -143,254,255,3,196,4,58,0,21,0,0,1,33,21,51,50,0,21,6,2,7,39,62,1,53,46,1,43,1, -17,35,17,33,2,190,254,150,93,235,1,40,2,195,190,51,128,112,1,182,150,93,197,2, -47,3,158,253,255,0,220,138,254,230,34,148,35,156,115,147,164,254,4,4,58,0,0,0, -0,1,0,168,255,206,7,227,5,176,0,23,0,0,1,51,50,0,21,6,2,7,39,62,1,53,46,1,43, -1,17,35,17,33,17,35,17,33,4,247,217,235,1,40,2,195,190,51,128,112,1,182,150, -217,197,253,59,197,4,79,3,112,255,0,220,138,254,230,34,148,34,157,115,147,164, -253,53,5,21,250,235,5,176,0,0,1,0,143,255,2,6,184,4,58,0,23,0,0,1,51,50,0,21, -6,2,7,39,62,1,53,46,1,43,1,17,35,17,33,17,35,17,33,3,252,169,235,1,40,2,195, -190,51,128,112,1,182,150,169,197,254,29,197,3,109,2,164,255,0,220,138,254,230, -34,148,35,156,115,147,164,254,1,3,158,252,98,4,58,0,0,2,0,89,255,235,5,33,5, -197,0,22,0,31,0,0,1,32,0,17,21,16,0,35,32,0,17,53,33,55,54,2,35,34,6,7,39,62, -1,19,50,18,55,39,33,21,20,22,2,102,1,74,1,113,254,162,252,254,208,254,194,3, -252,2,4,249,252,108,153,74,49,50,191,240,170,210,17,3,252,205,199,5,197,254, -113,254,186,49,254,196,254,104,1,97,1,56,108,5,248,1,61,47,37,139,35,65,250, -192,1,13,210,5,31,207,246,0,255,255,0,94,255,236,3,223,4,78,0,15,0,69,4,64,4, -58,192,1,0,1,0,169,0,0,7,111,5,176,0,13,0,0,1,33,17,33,21,33,17,35,17,33,17, -35,17,51,1,110,2,195,3,62,253,135,197,253,61,197,197,3,30,2,146,155,250,235,2, -131,253,125,5,176,0,0,0,1,0,143,0,0,5,101,4,58,0,13,0,0,1,33,17,33,21,33,17, -35,17,33,17,35,17,51,1,84,1,226,2,47,254,150,197,254,30,197,197,2,102,1,212, -156,252,98,1,204,254,52,4,58,0,0,0,1,0,63,255,48,6,156,5,176,0,19,0,0,1,33,17, -33,17,51,17,51,17,35,53,33,17,33,53,33,53,51,21,33,3,239,254,122,2,197,197, -169,197,251,205,254,155,1,101,197,1,134,4,165,251,246,5,21,251,75,254,53,208, -4,165,154,113,113,0,1,0,73,255,69,5,29,4,58,0,19,0,0,1,33,17,33,17,51,17,51, -17,35,53,33,17,35,53,51,53,51,21,33,3,13,254,228,1,227,197,132,197,252,212, -227,227,197,1,28,3,46,253,108,3,160,252,96,254,171,187,3,46,154,114,114,0,0,0, -2,0,77,255,233,6,44,5,195,0,30,0,39,0,0,5,32,0,17,53,46,1,63,1,51,20,22,23,18, -0,51,32,0,17,21,33,7,6,18,51,50,54,55,23,14,1,3,34,2,7,23,33,53,52,38,4,71, -254,182,254,145,158,163,4,2,151,83,85,27,1,81,233,1,27,1,42,252,46,2,5,247, -253,107,154,75,48,50,192,238,171,210,15,3,3,9,181,23,1,141,1,71,6,20,196,154, -5,93,125,18,1,23,1,94,254,157,254,201,108,5,249,254,196,46,38,139,36,63,5,63, -254,242,209,5,31,206,247,0,0,0,0,2,255,223,255,235,4,94,4,78,0,29,0,38,0,0,5, -34,0,61,1,46,1,53,51,20,22,23,62,1,51,50,18,29,1,33,7,6,22,51,50,54,55,23,14, -1,3,34,6,7,23,33,53,52,38,2,224,242,254,239,125,129,157,51,54,30,255,170,217, -217,253,76,2,1,155,158,98,116,79,49,54,155,185,103,135,15,2,1,232,116,21,1,43, -242,6,26,177,138,73,101,23,193,239,254,242,224,104,5,162,204,41,42,139,39,59, -3,200,159,124,5,16,118,154,0,0,1,0,138,0,0,4,195,5,176,0,15,0,0,51,17,51,17, -33,50,22,21,17,35,17,52,38,35,33,17,138,197,1,139,240,249,198,139,152,254,117, -5,176,253,182,212,236,254,90,1,166,164,128,253,54,0,0,1,0,116,2,136,3,58,3,35, -0,3,0,0,1,33,53,33,3,58,253,58,2,198,2,136,155,0,0,1,0,74,0,0,6,185,5,176,0, -16,0,0,1,35,17,35,17,33,53,33,17,51,1,51,23,9,1,7,35,3,185,147,197,253,233,2, -220,128,2,8,222,2,253,196,2,103,3,239,2,146,253,110,5,21,155,253,124,2,132,5, -253,80,253,10,5,0,0,1,0,49,0,0,5,188,4,58,0,16,0,0,1,35,17,35,17,33,53,33,17, -51,1,51,23,9,1,7,35,3,63,101,197,254,28,2,169,84,1,131,231,2,254,63,1,227,2, -242,1,203,254,53,3,158,156,254,55,1,201,5,253,254,253,210,5,0,0,1,0,191,255, -236,6,146,5,198,0,40,0,0,1,33,7,30,1,51,50,54,53,51,23,22,0,35,34,0,3,35,17, -35,17,51,17,51,53,16,0,51,50,0,15,1,35,52,38,35,34,2,29,1,33,4,237,254,41,3,4, -194,158,164,180,189,2,4,254,216,243,240,254,203,9,196,198,198,196,1,55,247, -247,1,36,4,2,189,180,164,165,196,1,223,2,57,5,185,245,177,156,6,205,254,236,1, -74,1,3,253,199,5,176,253,35,135,1,13,1,95,254,249,217,6,153,178,254,246,197, -137,0,0,0,1,0,151,255,235,5,131,4,78,0,39,0,0,1,33,7,30,1,51,50,54,53,51,23, -22,6,35,34,2,39,35,17,35,17,51,17,51,54,18,51,50,22,15,1,35,52,38,35,34,6,7, -23,33,4,72,254,146,2,6,132,133,91,136,178,3,4,248,164,213,246,15,177,197,197, -177,15,246,213,181,231,4,2,179,129,98,133,133,5,2,1,110,1,205,5,139,184,121, -88,6,140,217,1,16,210,254,51,4,58,254,46,210,1,20,224,163,6,99,139,189,137,5, -0,0,0,2,0,43,0,0,4,227,5,176,0,11,0,15,0,0,1,35,17,35,17,35,3,35,1,51,1,35,1, -33,3,35,3,133,161,196,148,152,201,2,13,169,2,2,201,253,171,1,136,191,6,1,182, -254,74,1,182,254,74,5,176,250,80,2,90,2,51,0,0,2,0,13,0,0,4,41,4,58,0,11,0,17, -0,0,1,35,17,35,17,35,3,35,1,51,1,35,1,33,3,39,35,7,2,233,106,196,113,116,201, -1,184,169,1,187,201,254,39,1,36,126,18,6,18,1,38,254,218,1,38,254,218,4,58, -251,198,1,193,1,56,68,68,0,0,0,0,1,0,169,255,232,7,126,5,176,0,29,0,0,1,17,6, -22,51,62,1,55,54,38,39,55,30,1,7,2,0,35,6,38,39,17,33,17,35,17,51,17,33,17,4, -242,1,90,77,135,148,4,1,32,30,190,34,36,2,5,254,236,203,169,186,8,253,65,197, -197,2,191,5,176,251,169,95,117,1,210,185,97,202,103,1,124,187,92,254,246,254, -228,3,177,192,1,42,253,125,5,176,253,110,2,146,0,0,0,0,1,0,143,255,232,6,85,4, -58,0,29,0,0,1,33,17,35,17,51,17,33,17,51,17,6,22,51,62,1,55,54,38,39,51,30,1, -7,6,2,35,6,38,39,3,64,254,20,197,197,1,236,197,1,91,76,106,117,4,1,31,30,189, -34,36,2,4,242,178,169,186,8,1,204,254,52,4,58,254,43,1,213,253,31,95,117,1, -187,164,91,193,97,123,172,86,244,254,250,3,177,192,0,0,0,0,1,0,65,255,232,6, -65,4,58,0,33,0,0,1,33,17,16,2,43,1,63,1,50,54,53,17,33,17,6,22,51,62,1,55,54, -38,39,51,30,1,7,6,2,35,6,38,39,3,45,254,205,178,206,57,4,41,107,92,2,189,1,90, -76,107,116,4,1,32,30,191,33,36,2,4,243,177,168,186,8,3,158,254,208,254,195, -254,207,168,1,212,241,1,204,253,31,95,117,1,187,164,92,192,97,120,175,86,244, -254,250,3,177,192,0,0,0,0,1,0,69,255,232,7,117,5,176,0,33,0,0,1,33,17,16,2,43, -1,53,51,50,18,25,1,33,17,6,22,51,62,1,55,54,38,39,55,30,1,7,2,0,35,6,38,39,4, -36,254,40,216,250,53,41,149,133,3,97,1,91,77,135,147,4,1,31,30,190,33,36,2,4, -254,236,203,170,186,8,5,21,253,235,254,114,254,142,154,1,32,1,70,2,176,251, -169,95,117,1,210,185,97,203,102,1,122,189,92,254,246,254,228,3,177,192,0,1,0, -118,255,235,4,159,5,197,0,33,0,0,5,32,0,25,1,16,0,33,50,22,23,7,46,1,35,34,2, -21,17,20,18,51,62,1,55,54,38,39,51,30,1,7,6,4,2,185,255,0,254,189,1,67,1,0, -113,178,68,63,67,144,85,175,207,207,175,136,148,4,1,27,24,190,42,16,1,4,254, -235,21,1,94,1,12,1,6,1,11,1,95,45,43,135,33,35,254,246,195,254,248,198,254, -246,1,154,137,83,181,97,197,86,78,216,230,0,0,0,0,1,0,98,255,235,3,198,4,78,0, -33,0,0,37,62,1,55,52,38,39,51,30,1,21,14,1,35,34,0,61,1,52,18,51,50,22,23,7, -46,1,35,34,6,29,1,20,22,2,81,95,78,3,10,9,189,13,14,4,204,165,230,254,247,255, -219,94,142,47,46,47,122,68,137,140,149,133,1,83,84,58,122,56,68,115,53,158, -164,1,58,227,42,226,1,58,35,31,147,27,31,231,154,42,158,229,0,0,0,0,1,0,36, -255,232,5,77,5,176,0,25,0,0,1,33,53,33,21,33,17,6,22,51,62,1,55,54,38,39,55, -30,1,7,2,0,35,6,38,39,1,252,254,40,4,128,254,29,1,91,76,135,149,4,1,32,31,191, -34,35,2,4,254,236,204,169,186,8,5,21,155,155,252,68,95,117,1,210,185,96,202, -104,1,124,187,92,254,246,254,228,3,177,192,0,0,0,0,1,0,70,255,232,4,189,4,58, -0,25,0,0,1,33,53,33,21,33,17,6,22,51,62,1,55,54,38,39,51,30,1,7,14,1,35,6,38, -39,1,168,254,158,3,139,254,156,1,90,77,106,117,4,1,32,29,189,34,36,2,4,243, -177,169,186,8,3,161,153,153,253,184,95,117,1,155,137,76,167,80,103,148,72,216, -231,3,177,192,0,0,0,0,2,0,91,0,0,6,110,5,176,0,24,0,33,0,0,33,34,36,53,52,36, -51,33,17,51,17,55,62,1,55,54,38,39,51,30,1,7,14,1,35,37,17,33,34,6,21,20,22, -51,2,70,233,254,254,1,1,234,1,103,197,83,106,116,4,1,31,30,190,33,36,2,4,243, -176,254,232,254,153,148,146,146,148,246,198,197,239,2,64,250,233,1,1,141,126, -77,167,79,100,151,72,204,218,154,2,59,160,119,123,169,0,0,0,2,0,98,255,233,6, -116,6,24,0,34,0,51,0,0,19,16,18,51,50,22,23,17,51,17,6,22,51,62,1,55,54,38,39, -55,30,1,7,2,0,35,6,38,39,14,1,35,34,2,53,1,46,1,35,34,6,29,1,20,22,51,50,54, -55,46,1,53,98,223,201,89,140,52,197,2,92,77,134,148,4,1,31,30,190,33,36,2,4, -254,236,203,120,163,41,53,161,109,198,224,2,193,39,114,78,142,135,134,141,84, -116,39,3,3,2,9,1,5,1,64,62,59,2,67,251,65,95,117,1,210,185,97,203,102,1,122, -189,92,254,246,254,228,2,85,93,87,89,1,31,234,1,61,58,67,234,187,21,164,197, -73,66,15,34,18,0,1,0,54,255,232,5,211,5,176,0,44,0,0,1,52,38,43,1,53,51,50,54, -53,52,38,35,33,53,33,50,22,21,20,6,7,30,1,29,1,6,22,51,62,1,55,54,38,39,51,30, -1,7,10,1,35,6,38,39,2,191,137,116,191,136,166,147,143,152,254,153,1,103,239, -253,117,111,118,105,1,79,67,116,128,4,1,31,30,190,34,34,1,4,254,187,160,174,8, -1,114,118,145,155,126,131,121,135,155,212,201,113,165,49,40,176,128,68,76,95, -1,212,183,97,204,102,134,179,90,254,247,254,227,3,157,171,0,0,1,0,49,255,227, -4,235,4,58,0,45,0,0,37,6,22,51,62,1,55,54,38,39,51,30,1,7,14,1,35,6,38,39,53, -52,38,43,1,39,51,50,54,53,52,38,35,33,39,33,50,22,21,20,6,7,30,1,29,1,2,236,1, -39,47,106,117,4,1,32,30,190,34,36,2,5,242,177,138,138,6,106,98,211,2,184,119, -113,114,119,254,250,6,1,12,206,226,96,93,99,89,213,42,44,2,153,137,76,164,79, -102,146,71,215,230,3,114,129,75,71,79,154,83,77,81,95,153,170,152,81,114,36, -28,122,89,77,0,2,0,80,254,219,3,253,5,176,0,33,0,39,0,0,19,53,51,50,54,53,52, -38,35,33,53,33,50,22,21,20,6,7,30,1,29,1,20,22,23,21,35,46,1,61,1,52,38,35,1, -3,35,19,53,51,112,221,167,149,143,152,254,238,1,18,239,252,117,111,119,105,31, -37,203,41,21,137,116,2,118,132,107,42,197,2,120,154,127,130,122,136,155,212, -203,112,166,48,40,176,128,136,68,108,34,25,35,131,71,132,118,145,253,100,254, -255,1,10,188,0,0,2,0,123,254,219,3,187,4,58,0,33,0,39,0,0,19,53,33,50,54,53, -52,38,35,33,53,33,50,22,21,20,6,7,30,1,29,1,20,22,23,21,35,46,1,61,1,52,38,35, -1,3,35,19,53,51,125,1,22,120,112,113,119,254,232,1,24,205,225,97,94,102,89,29, -34,203,37,20,106,98,2,11,132,107,42,197,1,183,154,83,78,81,94,153,169,153,81, -116,36,29,132,97,97,45,86,22,19,23,99,51,95,80,91,254,37,254,255,1,10,188,0,2, -0,91,0,0,4,114,5,176,0,10,0,19,0,0,1,17,51,17,33,34,36,53,52,36,51,1,17,33,34, -6,21,20,22,51,3,173,197,253,212,233,254,254,1,1,234,1,103,254,153,148,146,146, -148,3,112,2,64,250,80,246,198,197,239,253,42,2,59,160,119,123,169,0,0,0,0,1,0, -156,255,235,5,2,5,197,0,42,0,0,1,34,6,21,20,22,51,50,54,53,51,23,22,4,35,32, -36,53,52,54,55,46,1,53,52,36,33,50,4,15,1,35,52,38,35,34,6,21,20,22,59,1,21,2, -205,181,183,202,178,156,199,188,2,4,254,188,225,254,254,254,193,142,135,120, -135,1,42,1,1,223,1,50,5,1,188,195,140,178,180,167,175,184,2,152,129,133,120, -149,157,114,6,205,214,227,200,126,173,42,48,166,101,199,216,220,176,6,105,142, -144,112,114,132,156,0,0,1,0,163,0,0,4,34,6,218,0,9,0,0,1,35,53,33,17,35,17,33, -17,51,4,34,197,254,11,197,2,186,197,5,15,6,250,235,5,176,1,42,0,0,0,1,0,143,0, -0,3,16,5,100,0,9,0,0,1,35,53,35,17,35,17,33,17,51,3,16,197,247,197,1,188,197, -3,153,5,252,98,4,58,1,42,0,0,0,0,2,0,41,0,0,3,223,5,176,0,5,0,15,0,0,1,51,9,1, -35,1,33,1,39,35,7,3,1,23,51,55,1,183,150,1,146,254,113,149,254,110,2,237,254, -255,17,6,18,250,1,1,17,6,18,5,176,253,39,253,41,2,215,2,0,50,50,254,0,254,1, -50,50,0,0,0,0,1,0,163,0,0,4,255,5,176,0,20,0,0,9,2,35,1,35,21,35,53,35,17,35, -17,51,17,51,53,51,21,51,1,4,213,254,114,1,184,246,254,172,78,157,98,197,197, -98,157,76,1,61,5,176,253,79,253,1,2,146,243,243,253,110,5,176,253,124,255,255, -2,132,0,0,0,0,1,0,153,0,0,4,99,4,58,0,20,0,0,9,2,35,1,35,21,35,53,35,17,35,17, -51,17,51,53,51,21,51,19,4,64,254,173,1,118,249,254,243,23,157,75,197,197,75, -157,15,255,4,58,254,0,253,198,1,203,191,191,254,53,4,58,254,55,211,211,1,201, -0,2,0,147,0,0,4,204,5,176,0,3,0,19,0,0,1,35,17,51,1,17,35,17,33,34,38,53,17, -51,17,20,22,51,33,17,3,30,158,158,1,174,197,254,117,241,248,198,138,153,1,139, -1,60,2,189,1,183,250,80,2,74,211,237,1,166,254,90,165,127,2,202,0,2,0,115,0,0, -3,220,4,58,0,3,0,19,0,0,37,35,17,51,1,35,17,35,34,38,53,17,51,17,20,22,59,1, -17,51,2,135,158,158,1,85,197,208,236,232,197,124,147,208,197,229,2,54,252,229, -1,165,174,222,1,9,254,247,145,96,1,250,0,1,0,143,254,75,3,251,4,58,0,23,0,0,1, -17,33,17,51,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,33,17,35,17,1,84,1,226, -197,173,153,31,53,28,15,13,67,17,60,69,254,30,197,4,58,254,44,1,212,251,109, -167,181,9,9,150,5,8,103,90,2,37,254,52,4,58,0,1,0,169,254,75,4,246,5,176,0,23, -0,0,1,17,33,17,51,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,33,17,35,17,1, -110,2,195,197,173,153,31,53,28,14,14,67,17,60,69,253,61,197,5,176,253,110,2, -146,249,247,167,181,9,9,150,5,8,103,90,2,220,253,125,5,176,0,2,0,74,254,68,3, -164,7,114,0,44,0,53,0,0,1,50,54,53,52,38,35,33,53,33,50,4,21,20,6,7,30,1,21, -20,4,43,1,34,6,21,20,22,23,7,46,1,39,52,54,59,1,50,54,53,52,38,43,1,53,1,55, -51,23,1,35,1,55,51,1,156,154,146,143,137,254,208,1,48,211,1,11,130,115,129, -138,254,247,211,50,76,69,93,66,79,111,155,1,179,161,42,129,149,164,158,143,1, -10,196,171,2,254,242,198,254,243,2,170,3,57,127,114,102,133,155,213,181,103, -164,44,41,176,127,200,227,59,53,70,85,30,127,47,164,111,129,128,149,119,133, -134,155,3,137,176,6,254,255,1,1,6,0,0,0,0,2,0,73,254,68,3,121,6,26,0,44,0,53, -0,0,1,50,54,53,52,38,35,33,53,33,50,22,21,20,6,7,30,1,21,20,6,43,1,34,6,21,20, -22,23,7,46,1,39,52,54,59,1,50,54,53,52,38,43,1,53,19,55,51,23,1,35,1,55,51,1, -154,133,126,123,116,254,209,1,47,192,245,103,91,105,111,243,192,49,76,69,94, -66,80,111,155,1,179,161,41,110,127,143,138,143,196,196,171,2,254,242,198,254, -243,2,170,2,106,83,75,65,85,156,168,142,73,119,35,33,122,86,151,173,59,53,70, -86,29,127,47,164,111,129,128,91,74,82,81,155,3,0,176,6,254,255,1,1,6,0,0,0,2, -0,209,0,0,6,244,5,176,0,19,0,23,0,0,1,33,1,51,1,35,3,35,17,35,17,35,3,35,19, -33,17,35,17,51,1,33,3,35,1,151,1,126,1,52,169,2,2,201,149,161,196,148,152,201, -158,254,189,198,198,2,63,1,136,191,6,2,91,3,85,250,80,1,182,254,74,1,182,254, -74,1,183,254,73,5,176,252,170,2,51,0,0,2,0,186,0,0,5,232,4,58,0,19,0,25,0,0,1, -33,1,51,1,35,3,35,17,35,17,35,3,35,19,35,17,35,17,51,1,33,3,39,35,7,1,127,1,3, -1,2,169,1,187,201,119,106,196,113,116,201,119,196,197,197,1,199,1,36,126,18,6, -18,1,193,2,121,251,198,1,38,254,218,1,38,254,218,1,37,254,219,4,58,253,135,1, -56,68,68,255,255,0,163,0,0,4,188,5,176,0,99,1,49,1,217,2,204,51,51,76,205,0,2, -0,48,0,0,0,3,0,143,254,96,4,41,4,78,0,3,0,21,0,35,0,0,5,7,3,55,37,20,2,35,34, -38,39,17,35,17,51,23,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1,51,50,54,53, -3,125,147,175,148,1,90,224,197,100,151,53,197,151,31,53,158,105,201,223,197, -145,141,85,120,37,37,120,87,140,144,136,55,1,217,55,163,234,254,225,67,67,253, -239,5,218,140,78,82,254,193,254,250,184,237,77,67,253,245,67,75,205,162,0,0,0, -0,1,0,95,254,75,4,75,4,73,0,37,0,0,19,50,22,31,1,51,19,51,1,19,30,1,51,50,54, -55,7,14,1,35,34,38,39,3,35,1,35,1,3,46,1,35,34,6,35,53,62,1,202,129,151,42,92, -6,233,198,254,171,204,33,62,42,14,10,22,3,10,36,13,116,139,53,127,6,254,247, -209,1,127,163,33,86,60,10,54,4,20,63,4,73,160,108,222,1,219,253,61,254,20,75, -79,2,3,156,6,9,130,142,1,44,253,218,3,14,1,130,83,106,5,145,5,10,0,0,0,1,0, -160,4,140,1,122,6,23,0,5,0,0,19,55,51,3,21,35,160,121,97,21,197,5,32,247,254, -255,138,0,0,2,0,78,255,235,6,25,4,58,0,22,0,44,0,0,1,35,30,1,21,20,2,35,34,38, -39,14,1,35,34,2,53,52,54,55,35,53,33,1,46,1,39,33,14,1,7,20,22,51,50,54,61,1, -51,21,20,22,51,50,54,6,25,133,29,33,174,184,119,165,40,41,164,118,185,173,32, -30,111,5,203,254,244,3,40,34,252,209,35,40,2,83,89,98,116,198,115,99,87,84,3, -158,81,182,101,254,254,183,121,116,117,120,1,73,254,101,182,81,156,253,248,89, -182,93,94,182,88,190,239,162,175,250,250,175,162,238,0,1,255,234,0,0,4,83,5, -187,0,35,0,0,1,62,1,51,50,22,23,7,46,1,35,34,6,7,1,17,35,17,1,46,1,35,34,6,7, -39,62,1,51,50,22,23,19,23,51,55,2,230,51,123,81,34,50,26,23,5,22,13,33,55,16, -254,212,196,254,212,17,55,32,14,21,5,22,24,50,35,80,123,52,178,19,6,19,4,215, -124,104,10,14,152,3,5,35,39,253,121,253,190,2,66,2,135,39,35,5,3,152,14,10, -104,124,254,106,70,70,0,255,255,0,113,255,85,5,2,6,68,2,38,0,47,0,0,0,39,1,49, -1,248,0,131,0,7,1,49,1,248,5,167,255,255,0,97,255,99,4,42,4,217,2,38,0,79,0,0, -0,39,1,49,1,132,0,145,0,7,1,49,1,132,4,60,0,2,0,108,255,235,6,98,7,7,0,11,0, -54,0,0,1,21,39,55,33,21,35,53,35,21,35,53,5,6,2,21,16,18,51,50,54,55,30,1,51, -50,18,17,52,2,39,35,22,18,23,20,2,39,35,6,38,53,17,35,17,20,6,39,35,6,2,53,54, -18,55,2,138,175,1,3,53,177,153,178,253,242,62,93,204,215,124,176,44,43,176, -125,214,205,94,61,206,64,95,5,114,115,6,101,131,198,132,101,6,116,112,4,95,65, -6,154,130,1,238,239,130,130,130,234,105,254,55,192,254,213,254,88,173,155,155, -173,1,168,1,43,191,1,202,105,131,254,51,162,235,254,180,5,6,255,221,2,22,253, -234,221,255,6,5,1,77,234,162,1,205,131,0,0,0,2,0,127,255,235,5,210,5,182,0,11, -0,52,0,0,1,21,39,55,33,21,35,53,35,21,35,53,1,6,2,21,20,18,51,50,54,55,30,1, -51,50,18,53,52,2,39,35,22,18,23,20,6,35,34,38,53,17,35,17,20,6,35,34,38,53,54, -18,55,2,92,175,1,3,53,176,154,178,254,31,61,74,173,185,118,164,41,40,165,119, -184,174,75,60,207,65,76,4,84,87,99,115,198,116,98,89,83,3,76,65,5,73,130,1, -238,239,130,130,130,254,241,106,254,252,154,254,254,183,120,117,116,121,1,73, -254,154,1,4,106,134,254,253,127,191,238,162,175,1,44,254,212,175,162,239,190, -126,1,2,136,0,0,2,0,149,0,0,6,75,5,176,0,33,0,37,0,0,1,51,50,22,21,17,35,17, -52,38,43,1,7,17,35,17,39,35,34,6,21,17,35,17,52,54,59,1,1,51,23,55,53,33,1,51, -1,33,4,76,22,239,250,197,139,153,116,25,197,17,131,153,137,197,247,240,37,254, -121,226,5,6,3,204,253,159,10,1,28,253,190,3,46,209,234,254,141,1,115,162,126, -42,253,151,2,120,27,126,162,254,141,1,115,234,209,2,130,9,2,7,253,126,1,231,0, -2,0,149,0,0,5,87,4,59,0,31,0,34,0,0,1,51,1,30,1,29,1,35,53,52,38,43,1,7,17,35, -17,39,35,34,6,29,1,35,53,52,54,55,1,51,53,33,1,19,33,4,99,123,254,227,198,208, -198,119,132,47,11,197,6,60,133,118,197,212,205,254,228,158,2,171,254,153,176, -254,160,4,58,254,33,10,210,221,162,162,163,125,19,254,81,1,184,10,125,163,162, -162,226,208,7,1,223,1,254,36,1,64,0,4,0,190,0,0,8,130,5,176,0,3,0,7,0,41,0,45, -0,0,1,33,53,33,1,35,17,51,1,51,50,22,21,17,35,17,52,38,43,1,7,17,35,17,39,35, -34,6,21,17,35,17,52,54,59,1,1,51,23,55,53,33,1,51,1,33,4,252,252,109,3,147, -252,136,198,198,4,255,22,239,250,197,139,153,116,25,197,17,131,153,137,197, -247,240,37,254,121,226,5,6,3,204,253,159,10,1,28,253,190,2,148,154,252,210,5, -176,253,126,209,234,254,141,1,115,162,126,42,253,151,2,120,27,126,162,254,141, -1,115,234,209,2,130,9,2,7,253,126,1,231,0,0,0,0,4,0,153,0,0,7,81,4,59,0,3,0,7, -0,39,0,42,0,0,1,33,53,33,1,35,17,51,33,51,1,30,1,29,1,35,53,52,38,43,1,7,17, -35,17,39,35,34,6,29,1,35,53,52,54,55,1,51,53,33,1,19,33,4,248,252,11,3,245, -252,102,197,197,4,255,123,254,227,198,208,198,119,132,47,11,197,6,60,133,118, -197,212,205,254,228,158,2,171,254,153,176,254,160,1,194,155,253,163,4,58,254, -33,10,210,221,162,162,163,125,19,254,81,1,184,10,125,163,162,162,226,208,7,1, -223,1,254,36,1,64,0,0,22,0,91,254,114,7,238,5,174,0,13,0,28,0,42,0,59,0,65,0, -71,0,77,0,83,0,93,0,97,0,101,0,105,0,109,0,113,0,117,0,126,0,130,0,134,0,138, -0,142,0,146,0,150,0,0,1,52,38,35,34,6,29,1,20,22,51,50,54,53,5,50,54,53,52,38, -39,62,1,53,52,38,43,1,17,39,20,6,35,34,38,61,1,52,54,51,50,22,21,5,20,6,35,34, -38,53,35,7,6,22,51,50,54,53,17,35,1,17,51,21,51,21,33,53,51,53,51,17,1,17,33, -21,35,21,37,53,33,17,35,53,1,51,30,1,21,20,6,43,1,53,1,53,33,21,33,53,33,21, -33,53,33,21,1,53,33,21,33,53,33,21,33,53,33,21,19,51,50,22,21,20,6,43,1,5,35, -53,51,53,35,53,51,17,35,53,51,37,35,53,51,53,35,53,51,17,35,53,51,3,57,129, -102,102,128,128,104,101,128,1,32,92,105,54,48,40,44,111,101,188,159,74,63,66, -74,74,64,64,75,3,186,55,40,50,54,84,2,6,105,91,81,106,92,249,196,113,196,5,40, -199,111,248,109,1,53,196,5,236,1,54,111,252,218,5,47,51,53,50,126,1,78,1,22, -253,91,1,21,253,92,1,20,2,10,1,22,253,91,1,21,253,92,1,20,188,93,61,57,60,58, -93,252,241,113,113,113,113,113,113,7,34,111,111,111,111,111,111,2,68,96,123, -123,96,112,98,121,121,98,216,79,76,45,70,13,15,62,39,75,75,253,219,216,69,78, -78,69,112,68,79,79,68,155,44,54,45,46,6,77,81,92,79,1,122,251,79,1,59,202,113, -113,202,254,197,6,31,1,29,116,169,169,116,254,227,169,252,182,2,46,38,40,43, -169,3,74,116,116,116,116,116,116,249,56,113,113,113,113,113,113,4,91,32,39,40, -40,150,252,126,250,252,21,249,126,252,126,250,252,21,249,0,0,5,0,92,253,213,7, -215,8,98,0,3,0,30,0,34,0,38,0,42,0,0,9,3,5,52,54,55,62,1,53,52,38,35,34,6,31, -1,51,62,1,51,50,22,21,20,6,7,14,1,21,23,35,21,51,3,51,21,35,3,51,21,35,4,24,3, -191,252,65,252,68,4,15,26,40,72,94,169,147,136,167,3,3,194,1,59,43,54,59,51, -42,79,59,202,202,202,75,4,4,2,4,4,6,82,252,49,252,49,3,207,241,53,61,26,39, -131,78,128,151,130,130,6,51,52,63,53,50,77,28,55,90,88,91,170,253,76,4,10,141, -4,255,255,0,5,254,103,3,160,0,0,0,39,0,63,0,1,255,1,0,6,0,63,1,0,0,2,0,113, -255,235,5,2,5,195,0,33,0,48,0,0,1,53,52,54,51,50,22,29,1,16,0,33,34,0,25,1,16, -0,31,1,21,34,2,21,17,20,18,51,50,54,55,46,1,53,5,53,52,38,35,34,6,29,1,20,22, -23,62,1,53,2,29,206,165,165,205,254,181,254,248,254,254,192,1,62,250,6,172, -205,205,172,63,109,45,168,195,2,32,93,80,80,94,151,134,30,32,2,145,59,176,231, -229,178,80,254,229,254,138,1,96,1,10,1,6,1,9,1,95,4,2,154,254,255,197,254,248, -201,255,0,34,34,42,241,166,21,83,107,136,138,105,64,122,167,14,59,145,80,0,2, -0,97,255,235,4,42,4,76,0,33,0,48,0,0,1,53,52,54,51,50,22,29,1,20,0,35,34,0,61, -1,52,0,31,1,21,34,6,29,1,20,22,51,50,54,55,46,1,53,5,53,52,38,35,34,6,29,1,20, -22,51,62,1,53,1,210,169,130,129,172,254,240,203,219,254,237,1,17,215,6,136, -161,160,137,29,55,25,109,125,1,147,62,42,44,58,91,80,16,19,1,233,37,132,174, -187,140,33,211,254,230,1,36,222,54,239,1,58,4,2,153,219,173,56,155,198,12,12, -35,174,116,17,36,67,96,82,61,41,82,101,36,86,46,0,0,2,0,113,255,235,4,176,5, -197,0,26,0,38,0,0,1,53,52,54,51,50,22,21,17,16,0,35,34,0,25,1,55,17,20,22,51, -50,54,55,38,36,53,37,52,38,35,34,6,29,1,20,22,23,55,2,9,189,151,157,182,254, -207,248,238,254,216,197,182,155,165,190,2,218,254,247,1,227,73,70,66,77,150, -130,6,4,12,62,172,207,202,177,254,6,254,234,254,177,1,92,1,9,2,148,2,253,106, -200,252,237,208,8,251,192,62,108,109,109,108,64,120,158,4,2,0,1,0,112,0,0,4, -148,5,62,0,19,0,0,1,5,7,37,3,35,19,37,55,5,19,37,55,5,19,51,3,5,7,37,2,92,1, -33,71,254,221,181,174,225,254,223,71,1,37,202,254,222,73,1,35,185,171,229,1, -37,75,254,224,1,191,172,125,170,254,192,1,142,171,124,171,1,108,171,126,171,1, -74,254,105,171,124,170,0,0,8,0,59,254,196,7,212,5,175,0,15,0,31,0,47,0,63,0, -79,0,95,0,111,0,127,0,0,1,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21,1,39,38, -54,51,50,22,15,1,35,52,38,35,34,6,21,19,39,38,54,51,50,22,15,1,35,52,38,35,34, -6,21,1,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21,1,39,38,54,51,50,22,15,1,35, -52,38,35,34,6,21,1,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21,1,39,38,54,51, -50,22,15,1,35,52,38,35,34,6,21,19,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21, -3,47,2,5,112,97,96,113,4,2,104,49,50,50,47,1,230,2,5,113,96,96,114,4,2,105,48, -51,50,46,81,2,5,113,96,96,113,4,2,104,48,51,50,47,254,210,2,5,113,96,96,113,4, -2,104,48,51,50,47,253,87,2,5,112,97,96,113,4,2,104,49,50,50,47,253,85,2,5,113, -97,96,113,4,2,104,49,50,50,47,254,230,2,5,113,96,96,113,4,2,104,48,51,50,47, -61,2,5,113,96,96,114,4,2,105,48,51,50,46,4,243,6,79,103,103,79,6,43,58,58,43, -254,235,6,78,104,103,79,6,44,57,58,43,254,9,6,78,104,103,79,6,44,57,58,43,253, -249,6,78,104,103,79,6,44,57,58,43,254,228,6,80,102,102,80,6,44,57,57,44,5,26, -6,79,103,103,79,6,43,58,58,43,254,9,6,78,104,103,79,6,44,57,58,43,253,249,6, -78,104,103,79,6,44,57,58,43,0,0,0,8,0,77,254,99,7,141,5,198,0,4,0,9,0,14,0,19, -0,25,0,30,0,35,0,40,0,0,5,23,3,35,19,3,39,19,51,3,1,55,5,21,37,5,7,37,53,5,1, -55,37,23,6,5,1,7,5,39,37,3,39,3,55,19,1,23,19,7,3,4,80,11,122,96,70,58,12,122, -96,70,2,30,13,1,77,254,166,251,116,13,254,179,1,90,3,156,2,1,65,68,37,254,255, -252,243,2,254,192,69,1,38,43,17,148,65,198,3,96,17,149,66,197,60,14,254,173,1, -97,4,162,14,1,82,254,160,254,17,12,124,98,71,59,12,124,98,71,1,174,16,153,68, -23,177,252,142,17,153,69,200,2,228,2,1,70,69,254,213,252,227,2,254,187,71,1, -43,0,0,1,0,122,2,139,2,250,5,186,0,19,0,0,1,23,62,1,51,50,22,21,17,35,17,52, -38,35,34,6,7,17,35,17,1,2,31,36,110,70,122,135,180,71,65,53,72,19,180,5,171, -120,64,71,151,156,254,4,1,219,102,91,54,47,253,201,3,32,0,2,0,152,255,236,4, -147,4,78,0,21,0,30,0,0,37,14,1,35,34,0,53,52,0,51,50,0,29,1,33,17,30,1,51,50, -54,55,1,34,6,7,17,33,17,46,1,4,22,87,188,95,218,254,206,1,67,201,207,1,32,253, -0,55,141,77,95,186,87,254,144,74,141,58,2,28,54,139,94,55,59,1,73,232,226,1, -79,254,202,231,47,254,184,53,57,60,62,3,42,65,57,254,235,1,30,52,61,0,0,2,0, -105,4,111,2,206,5,197,0,5,0,11,0,0,1,19,51,21,3,35,5,51,53,55,35,7,1,150,102, -210,229,83,254,211,189,81,108,162,4,140,1,57,21,254,193,2,137,204,198,0,0,4,0, -124,255,235,5,131,5,197,0,29,0,43,0,57,0,61,0,0,1,23,22,6,35,34,38,61,1,52,54, -51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,51,50,54,53,1,20,22,51,50,54,61,1, -52,38,35,34,6,21,51,52,54,51,50,22,29,1,20,6,35,34,38,53,19,39,1,23,2,165,2,4, -150,126,129,154,153,128,126,152,4,2,138,70,64,65,70,71,66,63,69,1,14,165,138, -135,164,165,136,137,164,146,81,74,73,82,80,73,76,81,203,109,253,57,109,4,32,6, -105,145,172,127,77,127,174,148,103,6,57,78,105,74,77,74,103,80,54,252,247,128, -172,172,128,78,127,173,173,127,74,104,104,74,78,75,103,103,75,3,201,67,251, -142,67,0,0,0,255,255,0,169,0,0,8,78,5,193,0,34,0,46,0,0,0,35,0,119,5,35,255, -252,0,3,0,13,5,32,255,21,0,2,0,106,255,237,3,115,5,197,0,27,0,40,0,0,5,7,6,38, -61,1,14,1,35,53,50,54,55,17,52,54,51,50,22,29,1,20,2,7,21,20,22,51,3,53,52,38, -35,34,6,21,17,23,62,1,53,2,206,6,199,205,49,101,52,55,101,46,159,139,122,155, -203,175,96,117,32,44,36,51,50,6,85,90,13,2,4,239,211,12,12,12,180,13,13,1,217, -177,202,172,144,42,158,254,174,100,92,145,146,3,209,44,76,78,109,108,254,155, -1,64,204,109,0,0,0,3,0,164,255,235,6,17,5,176,0,10,0,19,0,43,0,0,1,17,35,17, -33,50,4,21,20,4,35,39,51,50,54,53,52,38,43,1,37,17,51,21,35,17,20,22,51,50,54, -55,23,14,1,35,34,38,53,17,35,53,51,17,1,105,197,1,98,232,1,4,254,252,232,157, -157,147,147,147,147,157,3,208,205,205,63,52,17,41,16,27,23,86,42,119,143,171, -171,2,52,253,204,5,176,249,197,199,247,155,167,122,123,170,42,254,251,146,253, -111,76,62,8,6,135,18,23,145,155,2,145,146,1,5,0,2,0,98,255,235,4,126,6,24,0, -25,0,39,0,0,1,35,17,35,39,14,1,35,34,2,61,1,16,18,51,50,22,23,53,33,53,33,17, -51,17,51,1,20,22,51,50,54,55,17,46,1,35,34,6,21,4,126,137,151,30,53,156,103, -198,224,223,201,95,147,52,255,0,1,0,197,137,252,169,134,141,88,120,38,38,121, -85,142,135,4,112,251,144,137,78,80,1,31,234,21,1,5,1,64,70,67,171,154,1,14, -254,242,252,234,164,197,80,72,1,249,67,79,234,187,255,255,0,161,0,0,3,33,0, -202,0,38,0,14,0,0,0,7,0,14,1,187,0,0,255,255,0,129,4,164,2,216,5,176,2,6,0, -154,0,0,255,255,127,255,127,255,128,1,128,1,2,6,0,3,0,0,0,2,0,34,0,0,4,235,5, -176,0,13,0,27,0,0,51,17,35,53,51,17,33,32,0,17,21,16,0,33,19,33,17,33,50,18, -61,1,52,2,35,33,17,33,169,135,135,1,202,1,29,1,91,254,165,254,227,117,254,134, -1,5,202,233,233,202,254,251,1,122,2,151,155,2,126,254,161,254,234,199,254,233, -254,163,2,151,254,3,1,10,208,201,206,1,10,254,29,0,0,0,0,2,0,34,0,0,4,235,5, -176,0,13,0,27,0,0,51,17,35,53,51,17,33,32,0,17,21,16,0,33,19,33,17,33,50,18, -61,1,52,2,35,33,17,33,169,135,135,1,202,1,29,1,91,254,165,254,227,117,254,134, -1,5,202,233,233,202,254,251,1,122,2,151,155,2,126,254,161,254,234,199,254,233, -254,163,2,151,254,3,1,10,208,201,206,1,10,254,29,0,0,0,0,1,0,18,0,0,4,0,6,24, -0,27,0,0,1,33,17,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,35,53,51, -53,51,21,33,2,216,254,124,56,163,99,173,193,197,115,114,88,130,40,197,125,125, -197,1,132,4,207,254,218,78,87,208,216,253,90,2,168,134,128,69,62,252,213,4, -207,155,174,174,0,0,0,1,0,37,0,0,4,164,5,176,0,15,0,0,1,33,17,35,17,35,53,51, -53,33,53,33,21,33,21,33,3,199,254,253,197,254,254,254,38,4,127,254,32,1,3,3, -156,252,100,3,156,155,222,155,155,222,255,255,0,167,2,26,2,245,2,180,2,6,0,13, -0,0,255,255,0,43,0,0,4,227,7,75,2,38,0,33,0,0,0,7,0,64,0,241,1,93,255,255,0, -43,0,0,4,227,7,71,2,38,0,33,0,0,0,7,0,113,1,171,1,89,255,255,0,43,0,0,4,227,7, -72,2,38,0,33,0,0,0,7,0,152,0,171,1,93,255,255,0,43,0,0,4,227,7,84,2,38,0,33,0, -0,0,7,0,158,0,166,1,97,255,255,0,43,0,0,4,227,7,13,2,38,0,33,0,0,0,7,0,102,0, -134,1,93,255,255,0,43,0,0,4,227,7,113,2,38,0,33,0,0,0,7,0,156,1,50,1,172,255, -255,0,43,0,0,4,227,7,113,2,38,0,33,0,0,0,39,0,156,1,50,1,172,0,7,0,113,1,171, -1,89,255,255,0,118,254,68,4,191,5,197,2,38,0,35,0,0,0,7,0,117,1,206,255,247, -255,255,0,163,0,0,4,36,7,75,2,38,0,37,0,0,0,7,0,64,0,205,1,93,255,255,0,163,0, -0,4,36,7,71,2,38,0,37,0,0,0,7,0,113,1,135,1,89,255,255,0,163,0,0,4,36,7,72,2, -38,0,37,0,0,0,7,0,152,0,135,1,93,255,255,0,163,0,0,4,36,7,13,2,38,0,37,0,0,0, -7,0,102,0,98,1,93,255,255,255,221,0,0,1,132,7,75,2,38,0,41,0,0,0,7,0,64,255, -139,1,93,255,255,0,190,0,0,2,104,7,71,2,38,0,41,0,0,0,7,0,113,0,68,1,89,255, -255,255,179,0,0,2,146,7,72,2,38,0,41,0,0,0,7,0,152,255,69,1,93,255,255,255, -192,0,0,2,133,7,13,2,38,0,41,0,0,0,7,0,102,255,32,1,93,255,255,0,169,0,0,4, -246,7,84,2,38,0,46,0,0,0,7,0,158,0,236,1,97,255,255,0,113,255,235,5,2,7,96,2, -38,0,47,0,0,0,7,0,64,1,36,1,114,255,255,0,113,255,235,5,2,7,92,2,38,0,47,0,0, -0,7,0,113,1,222,1,110,255,255,0,113,255,235,5,2,7,93,2,38,0,47,0,0,0,7,0,152, -0,222,1,114,255,255,0,113,255,235,5,2,7,105,2,38,0,47,0,0,0,7,0,158,0,217,1, -118,255,255,0,113,255,235,5,2,7,34,2,38,0,47,0,0,0,7,0,102,0,185,1,114,255, -255,0,147,255,235,4,220,7,75,2,38,0,53,0,0,0,7,0,64,1,34,1,93,255,255,0,147, -255,235,4,220,7,71,2,38,0,53,0,0,0,7,0,113,1,220,1,89,255,255,0,147,255,235,4, -220,7,72,2,38,0,53,0,0,0,7,0,152,0,220,1,93,255,255,0,147,255,235,4,220,7,13, -2,38,0,53,0,0,0,7,0,102,0,183,1,93,255,255,0,40,0,0,4,226,7,70,2,38,0,57,0,0, -0,7,0,113,1,169,1,88,255,255,0,106,255,235,3,243,6,9,2,38,0,65,0,0,0,7,0,64,0, -148,0,27,255,255,0,106,255,235,3,243,6,5,2,38,0,65,0,0,0,7,0,113,1,78,0,23, -255,255,0,106,255,235,3,243,6,6,2,38,0,65,0,0,0,6,0,152,78,27,0,0,255,255,0, -106,255,235,3,243,6,18,2,38,0,65,0,0,0,6,0,158,73,31,0,0,255,255,0,106,255, -235,3,243,5,203,2,38,0,65,0,0,0,6,0,102,41,27,0,0,255,255,0,106,255,235,3,243, -6,47,2,38,0,65,0,0,0,7,0,156,0,213,0,106,255,255,0,106,255,235,3,243,6,47,2, -38,0,65,0,0,0,39,0,156,0,213,0,106,0,7,0,113,1,78,0,23,255,255,0,97,254,68,3, -217,4,78,2,38,0,67,0,0,0,7,0,117,1,75,255,247,255,255,0,97,255,235,3,226,6,10, -2,38,0,69,0,0,0,7,0,64,0,150,0,28,255,255,0,97,255,235,3,226,6,6,2,38,0,69,0, -0,0,7,0,113,1,80,0,24,255,255,0,97,255,235,3,226,6,7,2,38,0,69,0,0,0,6,0,152, -80,28,0,0,255,255,0,97,255,235,3,226,5,204,2,38,0,69,0,0,0,6,0,102,43,28,0,0, -255,255,255,184,0,0,1,94,5,244,2,38,0,136,0,0,0,7,0,64,255,102,0,6,255,255,0, -153,0,0,2,67,5,240,2,38,0,136,0,0,0,6,0,113,31,2,0,0,255,255,255,142,0,0,2, -109,5,241,2,38,0,136,0,0,0,7,0,152,255,32,0,6,255,255,255,155,0,0,2,96,5,182, -2,38,0,136,0,0,0,7,0,102,254,251,0,6,255,255,0,143,0,0,3,253,6,18,2,38,0,78,0, -0,0,6,0,158,96,31,0,0,255,255,0,97,255,235,4,42,6,9,2,38,0,79,0,0,0,7,0,64,0, -175,0,27,255,255,0,97,255,235,4,42,6,5,2,38,0,79,0,0,0,7,0,113,1,105,0,23,255, -255,0,97,255,235,4,42,6,6,2,38,0,79,0,0,0,6,0,152,105,27,0,0,255,255,0,97,255, -235,4,42,6,18,2,38,0,79,0,0,0,6,0,158,100,31,0,0,255,255,0,97,255,235,4,42,5, -203,2,38,0,79,0,0,0,6,0,102,68,27,0,0,255,255,0,139,255,235,3,252,5,244,2,38, -0,85,0,0,0,7,0,64,0,173,0,6,255,255,0,139,255,235,3,252,5,240,2,38,0,85,0,0,0, -7,0,113,1,103,0,2,255,255,0,139,255,235,3,252,5,241,2,38,0,85,0,0,0,6,0,152, -103,6,0,0,255,255,0,139,255,235,3,252,5,182,2,38,0,85,0,0,0,6,0,102,66,6,0,0, -255,255,0,26,254,75,3,232,5,240,2,38,0,89,0,0,0,7,0,113,1,37,0,2,255,255,0,26, -254,75,3,232,5,182,2,38,0,89,0,0,0,6,0,102,0,6,0,0,255,255,0,43,0,0,4,227,6, -250,2,38,0,33,0,0,0,7,0,108,0,170,1,74,255,255,0,106,255,235,3,243,5,184,2,38, -0,65,0,0,0,6,0,108,77,8,0,0,255,255,0,43,0,0,4,227,7,78,2,38,0,33,0,0,0,7,0, -154,0,220,1,158,255,255,0,106,255,235,3,243,6,12,2,38,0,65,0,0,0,6,0,154,127, -92,0,0,255,255,0,43,254,98,5,39,5,176,2,38,0,33,0,0,0,7,0,157,3,71,0,0,255, -255,0,106,254,98,4,57,4,78,2,38,0,65,0,0,0,7,0,157,2,89,0,0,255,255,0,118,255, -235,4,191,7,92,2,38,0,35,0,0,0,7,0,113,1,201,1,110,255,255,0,97,255,235,3,217, -6,5,2,38,0,67,0,0,0,7,0,113,1,70,0,23,255,255,0,118,255,235,4,191,7,93,2,38,0, -35,0,0,0,7,0,152,0,201,1,114,255,255,0,97,255,235,3,217,6,6,2,38,0,67,0,0,0,6, -0,152,70,27,0,0,255,255,0,118,255,235,4,191,7,34,2,38,0,35,0,0,0,7,0,155,1, -153,1,114,255,255,0,97,255,235,3,217,5,203,2,38,0,67,0,0,0,7,0,155,1,22,0,27, -255,255,0,118,255,235,4,191,7,94,2,38,0,35,0,0,0,7,0,153,0,224,1,115,255,255, -0,97,255,235,3,217,6,7,2,38,0,67,0,0,0,6,0,153,93,28,0,0,255,255,0,169,0,0,4, -235,7,73,2,38,0,36,0,0,0,7,0,153,0,156,1,94,255,255,0,98,255,235,3,245,6,24,2, -6,0,68,0,0,255,255,0,163,0,0,4,36,6,250,2,38,0,37,0,0,0,7,0,108,0,134,1,74, -255,255,0,97,255,235,3,226,5,185,2,38,0,69,0,0,0,6,0,108,79,9,0,0,255,255,0, -163,0,0,4,36,7,78,2,38,0,37,0,0,0,7,0,154,0,184,1,158,255,255,0,97,255,235,3, -226,6,13,2,38,0,69,0,0,0,7,0,154,0,129,0,93,255,255,0,163,0,0,4,36,7,13,2,38, -0,37,0,0,0,7,0,155,1,87,1,93,255,255,0,97,255,235,3,226,5,204,2,38,0,69,0,0,0, -7,0,155,1,32,0,28,255,255,0,163,254,98,4,36,5,176,2,38,0,37,0,0,0,7,0,157,1, -56,0,0,255,255,0,97,254,98,3,226,4,78,2,38,0,69,0,0,0,7,0,157,1,31,0,0,255, -255,0,163,0,0,4,36,7,73,2,38,0,37,0,0,0,7,0,153,0,158,1,94,255,255,0,97,255, -235,3,226,6,8,2,38,0,69,0,0,0,6,0,153,103,29,0,0,255,255,0,121,255,235,4,193, -7,93,2,38,0,39,0,0,0,7,0,152,0,192,1,114,255,255,0,108,254,75,4,0,6,6,2,38,0, -71,0,0,0,6,0,152,90,27,0,0,255,255,0,121,255,235,4,193,7,99,2,38,0,39,0,0,0,7, -0,154,0,241,1,179,255,255,0,108,254,75,4,0,6,12,2,38,0,71,0,0,0,7,0,154,0,139, -0,92,255,255,0,121,255,235,4,193,7,34,2,38,0,39,0,0,0,7,0,155,1,144,1,114,255, -255,0,108,254,75,4,0,5,203,2,38,0,71,0,0,0,7,0,155,1,42,0,27,255,255,0,121, -253,207,4,193,5,197,2,38,0,39,0,0,0,7,1,110,1,157,254,162,255,255,0,108,254, -75,4,0,6,112,2,38,0,71,0,0,0,7,1,169,1,46,0,89,255,255,0,169,0,0,4,246,7,72,2, -38,0,40,0,0,0,7,0,152,0,234,1,93,255,255,255,127,0,0,4,0,7,71,2,38,0,72,0,0,0, -7,0,152,255,17,1,92,255,255,255,199,0,0,2,125,7,84,2,38,0,41,0,0,0,7,0,158, -255,64,1,97,255,255,255,162,0,0,2,88,5,253,2,38,0,136,0,0,0,7,0,158,255,27,0, -10,255,255,255,171,0,0,2,154,6,250,2,38,0,41,0,0,0,7,0,108,255,68,1,74,255, -255,255,134,0,0,2,117,5,164,2,38,0,136,0,0,0,7,0,108,255,31,255,244,255,255, -255,247,0,0,2,78,7,78,2,38,0,41,0,0,0,7,0,154,255,118,1,158,255,255,255,210,0, -0,2,41,5,247,2,38,0,136,0,0,0,7,0,154,255,81,0,71,255,255,0,57,254,98,2,7,5, -176,2,38,0,41,0,0,0,6,0,157,39,0,0,0,255,255,0,27,254,98,1,233,6,24,2,38,0,73, -0,0,0,6,0,157,9,0,0,0,255,255,0,180,0,0,1,142,7,13,2,38,0,41,0,0,0,7,0,155,0, -20,1,93,255,255,0,190,255,235,5,253,5,176,0,38,0,41,0,0,0,7,0,42,2,65,0,0,255, -255,0,159,254,75,3,118,6,24,0,38,0,73,0,0,0,7,0,74,2,4,0,0,255,255,0,74,255, -235,4,193,7,60,2,38,0,42,0,0,0,7,0,152,1,116,1,81,255,255,255,160,254,75,2, -127,5,222,2,38,0,151,0,0,0,7,0,152,255,50,255,243,255,255,0,163,253,224,4,251, -5,176,2,38,0,43,0,0,0,7,1,110,1,106,254,179,255,255,0,144,253,226,4,11,6,24,2, -38,0,75,0,0,0,7,1,110,1,23,254,181,255,255,0,168,0,0,4,51,7,8,2,38,0,44,0,0,0, -7,0,113,0,43,1,26,255,255,0,159,0,0,2,73,7,83,2,38,0,76,0,0,0,7,0,113,0,37,1, -101,255,255,0,168,253,226,4,51,5,176,2,38,0,44,0,0,0,7,1,110,1,104,254,181, -255,255,0,121,253,226,1,104,6,24,2,38,0,76,0,0,0,7,1,110,0,1,254,181,255,255, -0,168,0,0,4,51,5,176,2,6,0,44,0,0,255,255,0,159,0,0,1,100,6,24,2,6,0,76,0,0, -255,255,0,156,0,0,4,51,6,206,2,38,0,44,0,0,0,7,0,155,255,252,1,30,255,255,0, -150,0,0,1,112,7,25,2,38,0,76,0,0,0,7,0,155,255,246,1,105,255,255,0,169,0,0,4, -246,7,71,2,38,0,46,0,0,0,7,0,113,1,241,1,89,255,255,0,143,0,0,3,253,6,5,2,38, -0,78,0,0,0,7,0,113,1,101,0,23,255,255,0,169,253,226,4,246,5,176,2,38,0,46,0,0, -0,7,1,110,1,205,254,181,255,255,0,143,253,226,3,253,4,78,2,38,0,78,0,0,0,7,1, -110,1,65,254,181,255,255,0,169,0,0,4,246,7,73,2,38,0,46,0,0,0,7,0,153,1,8,1, -94,255,255,0,143,0,0,3,253,6,7,2,38,0,78,0,0,0,6,0,153,124,28,0,0,255,255,0, -143,0,0,4,223,5,179,2,38,0,78,0,0,0,7,1,110,3,120,4,192,255,255,0,113,255,235, -5,2,7,15,2,38,0,47,0,0,0,7,0,108,0,221,1,95,255,255,0,97,255,235,4,42,5,184,2, -38,0,79,0,0,0,6,0,108,104,8,0,0,255,255,0,113,255,235,5,2,7,99,2,38,0,47,0,0, -0,7,0,154,1,15,1,179,255,255,0,97,255,235,4,42,6,12,2,38,0,79,0,0,0,7,0,154,0, -154,0,92,255,255,0,113,255,235,5,2,7,96,2,38,0,47,0,0,0,7,0,159,1,107,1,114, -255,255,0,97,255,235,4,64,6,9,2,38,0,79,0,0,0,7,0,159,0,246,0,27,255,255,0, -165,0,0,4,213,7,71,2,38,0,50,0,0,0,7,0,113,1,129,1,89,255,255,0,143,0,0,2,228, -6,5,2,38,0,82,0,0,0,7,0,113,0,192,0,23,255,255,0,165,253,226,4,213,5,175,2,38, -0,50,0,0,0,7,1,110,1,93,254,181,255,255,0,119,253,226,2,170,4,78,2,38,0,82,0, -0,0,7,1,110,255,255,254,181,255,255,0,165,0,0,4,213,7,73,2,38,0,50,0,0,0,7,0, -153,0,152,1,94,255,255,0,45,0,0,3,14,6,7,2,38,0,82,0,0,0,6,0,153,216,28,0,0, -255,255,0,121,255,235,4,131,7,92,2,38,0,51,0,0,0,7,0,113,1,161,1,110,255,255, -0,103,255,235,3,201,6,5,2,38,0,83,0,0,0,7,0,113,1,58,0,23,255,255,0,121,255, -235,4,131,7,93,2,38,0,51,0,0,0,7,0,152,0,161,1,114,255,255,0,103,255,235,3, -201,6,6,2,38,0,83,0,0,0,6,0,152,58,27,0,0,255,255,0,121,254,68,4,131,5,197,2, -38,0,51,0,0,0,7,0,117,1,166,255,247,255,255,0,103,254,69,3,201,4,78,2,38,0,83, -0,0,0,7,0,117,1,63,255,248,255,255,0,121,255,235,4,131,7,94,2,38,0,51,0,0,0,7, -0,153,0,184,1,115,255,255,0,103,255,235,3,201,6,7,2,38,0,83,0,0,0,6,0,153,81, -28,0,0,255,255,0,37,253,226,4,164,5,176,2,38,0,52,0,0,0,7,1,110,1,100,254,181, -255,255,0,26,253,216,2,98,5,63,2,38,0,84,0,0,0,7,1,110,0,191,254,171,255,255, -0,37,0,0,4,164,7,72,2,38,0,52,0,0,0,7,0,153,0,159,1,93,255,255,0,26,255,235,2, -98,5,63,2,6,0,84,0,0,255,255,0,147,255,235,4,220,7,84,2,38,0,53,0,0,0,7,0,158, -0,215,1,97,255,255,0,139,255,235,3,252,5,253,2,38,0,85,0,0,0,6,0,158,98,10,0, -0,255,255,0,147,255,235,4,220,6,250,2,38,0,53,0,0,0,7,0,108,0,219,1,74,255, -255,0,139,255,235,3,252,5,164,2,38,0,85,0,0,0,6,0,108,102,244,0,0,255,255,0, -147,255,235,4,220,7,78,2,38,0,53,0,0,0,7,0,154,1,13,1,158,255,255,0,139,255, -235,3,252,5,247,2,38,0,85,0,0,0,7,0,154,0,152,0,71,255,255,0,147,255,235,4, -220,7,113,2,38,0,53,0,0,0,7,0,156,1,99,1,172,255,255,0,139,255,235,3,252,6,26, -2,38,0,85,0,0,0,7,0,156,0,238,0,85,255,255,0,147,255,235,4,220,7,75,2,38,0,53, -0,0,0,7,0,159,1,105,1,93,255,255,0,139,255,235,4,62,5,244,2,38,0,85,0,0,0,7,0, -159,0,244,0,6,255,255,0,147,254,98,4,220,5,176,2,38,0,53,0,0,0,7,0,157,1,188, -0,0,255,255,0,139,254,98,4,65,4,58,2,38,0,85,0,0,0,7,0,157,2,97,0,0,255,255,0, -37,0,0,6,191,7,72,2,38,0,55,0,0,0,7,0,152,1,148,1,93,255,255,0,45,0,0,5,220,5, -241,2,38,0,87,0,0,0,7,0,152,1,40,0,6,255,255,0,40,0,0,4,226,7,71,2,38,0,57,0, -0,0,7,0,152,0,169,1,92,255,255,0,26,254,75,3,232,5,241,2,38,0,89,0,0,0,6,0, -152,37,6,0,0,255,255,0,40,0,0,4,226,7,12,2,38,0,57,0,0,0,7,0,102,0,132,1,92, -255,255,0,97,0,0,4,109,7,71,2,38,0,58,0,0,0,7,0,113,1,132,1,89,255,255,0,94,0, -0,3,186,5,240,2,38,0,90,0,0,0,7,0,113,1,47,0,2,255,255,0,97,0,0,4,109,7,13,2, -38,0,58,0,0,0,7,0,155,1,84,1,93,255,255,0,94,0,0,3,186,5,182,2,38,0,90,0,0,0, -7,0,155,0,255,0,6,255,255,0,97,0,0,4,109,7,73,2,38,0,58,0,0,0,7,0,153,0,155,1, -94,255,255,0,94,0,0,3,186,5,242,2,38,0,90,0,0,0,6,0,153,70,7,0,0,255,255,0,14, -0,0,7,132,7,71,2,38,0,125,0,0,0,7,0,113,2,238,1,89,255,255,0,88,255,235,6,154, -6,6,2,38,0,130,0,0,0,7,0,113,2,156,0,24,255,255,0,108,255,162,4,253,7,133,2, -38,0,127,0,0,0,7,0,113,1,216,1,151,255,255,0,97,255,121,4,42,6,111,2,38,0,133, -0,0,0,7,0,113,1,105,0,129,255,255,0,121,253,206,4,131,5,197,2,38,0,51,0,0,0,7, -1,110,1,125,254,161,255,255,0,103,253,207,3,201,4,78,2,38,0,83,0,0,0,7,1,110, -1,22,254,162,255,255,0,43,0,0,4,227,7,72,2,38,0,33,0,0,0,7,0,165,1,140,1,76, -255,255,0,163,0,0,4,36,7,72,2,38,0,37,0,0,0,7,0,165,1,104,1,76,255,255,0,169, -0,0,4,246,7,72,2,38,0,40,0,0,0,7,0,165,1,203,1,76,255,255,0,185,0,0,1,137,7, -72,2,38,0,41,0,0,0,7,0,165,0,37,1,76,255,255,0,113,255,235,5,2,7,93,2,38,0,47, -0,0,0,7,0,165,1,191,1,97,255,255,0,40,0,0,4,226,7,71,2,38,0,57,0,0,0,7,0,165, -1,138,1,75,255,255,0,112,0,0,4,208,7,114,2,38,0,177,0,0,0,7,0,165,255,221,1, -118,255,255,255,204,255,235,2,144,6,92,2,38,0,186,0,0,0,7,0,166,255,43,255, -183,255,255,0,43,0,0,4,227,5,176,2,6,0,33,0,0,255,255,0,163,0,0,4,198,5,176,2, -6,0,34,0,0,255,255,0,163,0,0,4,36,5,176,2,6,0,37,0,0,255,255,0,97,0,0,4,109,5, -176,2,6,0,58,0,0,255,255,0,169,0,0,4,246,5,176,2,6,0,40,0,0,255,255,0,190,0,0, -1,132,5,176,2,6,0,41,0,0,255,255,0,163,0,0,4,251,5,176,2,6,0,43,0,0,255,255,0, -163,0,0,6,65,5,176,2,6,0,45,0,0,255,255,0,169,0,0,4,246,5,176,2,6,0,46,0,0, -255,255,0,113,255,235,5,2,5,197,2,6,0,47,0,0,255,255,0,163,0,0,4,188,5,176,2, -6,0,48,0,0,255,255,0,37,0,0,4,164,5,176,2,6,0,52,0,0,255,255,0,40,0,0,4,226,5, -176,2,6,0,57,0,0,255,255,0,66,0,0,4,214,5,176,2,6,0,56,0,0,255,255,255,192,0, -0,2,133,7,13,2,38,0,41,0,0,0,7,0,102,255,32,1,93,255,255,0,40,0,0,4,226,7,12, -2,38,0,57,0,0,0,7,0,102,0,132,1,92,255,255,0,98,255,235,4,128,6,6,2,38,0,178, -0,0,0,7,0,165,1,117,0,10,255,255,0,98,255,237,3,233,6,5,2,38,0,182,0,0,0,7,0, -165,1,43,0,9,255,255,0,143,254,97,3,245,6,6,2,38,0,184,0,0,0,7,0,165,1,70,0, -10,255,255,0,197,255,235,2,115,5,242,2,38,0,186,0,0,0,6,0,165,50,246,0,0,255, -255,0,141,255,235,4,38,6,92,2,38,0,194,0,0,0,6,0,166,84,183,0,0,255,255,0,153, -0,0,4,64,4,58,2,6,0,137,0,0,255,255,0,97,255,235,4,42,4,78,2,6,0,79,0,0,255, -255,0,153,254,96,3,242,4,58,2,6,0,114,0,0,255,255,0,46,0,0,3,228,4,58,2,6,0, -86,0,0,255,255,255,205,255,235,2,146,5,182,2,38,0,186,0,0,0,7,0,102,255,45,0, -6,255,255,0,141,255,235,4,38,5,182,2,38,0,194,0,0,0,6,0,102,86,6,0,0,255,255, -0,97,255,235,4,42,6,6,2,38,0,79,0,0,0,7,0,165,1,74,0,10,255,255,0,141,255,235, -4,38,5,242,2,38,0,194,0,0,0,7,0,165,1,92,255,246,255,255,0,108,255,235,6,96,5, -242,2,38,0,197,0,0,0,7,0,165,2,106,255,246,255,255,0,163,0,0,4,36,7,13,2,38,0, -37,0,0,0,7,0,102,0,98,1,93,255,255,0,163,0,0,4,32,7,71,2,38,0,168,0,0,0,7,0, -113,1,133,1,89,0,1,0,121,255,235,4,131,5,197,0,39,0,0,1,52,38,39,46,1,53,52, -36,51,50,0,15,1,35,52,38,35,34,6,21,20,22,23,30,1,21,20,4,35,34,36,63,1,51,20, -22,51,50,54,3,190,144,185,220,243,1,4,212,230,1,17,4,3,188,173,135,137,138, -155,179,225,233,254,233,221,211,254,189,5,2,188,208,131,138,165,1,130,95,118, -48,54,214,163,172,227,254,251,174,6,124,162,133,108,96,127,47,59,204,160,178, -231,236,198,6,137,149,143,0,0,255,255,0,190,0,0,1,132,5,176,2,6,0,41,0,0,255, -255,255,192,0,0,2,133,7,13,2,38,0,41,0,0,0,7,0,102,255,32,1,93,255,255,0,74, -255,235,3,188,5,176,2,6,0,42,0,0,255,255,0,131,4,228,2,36,5,238,2,6,0,113,0,0, -255,255,0,66,255,235,4,200,7,78,2,38,0,210,0,0,0,7,0,154,0,218,1,158,255,255, -0,163,0,0,4,251,5,176,2,6,0,43,0,0,255,255,0,43,0,0,4,227,5,176,2,6,0,33,0,0, -255,255,0,163,0,0,4,198,5,176,2,6,0,34,0,0,255,255,0,163,0,0,4,32,5,176,2,6,0, -168,0,0,255,255,0,163,0,0,4,36,5,176,2,6,0,37,0,0,255,255,0,173,0,0,4,250,7, -78,2,38,0,208,0,0,0,7,0,154,1,42,1,158,255,255,0,163,0,0,6,65,5,176,2,6,0,45, -0,0,255,255,0,169,0,0,4,246,5,176,2,6,0,40,0,0,255,255,0,113,255,235,5,2,5, -197,2,6,0,47,0,0,255,255,0,168,0,0,4,247,5,176,2,6,0,173,0,0,255,255,0,163,0, -0,4,188,5,176,2,6,0,48,0,0,255,255,0,118,255,235,4,191,5,197,2,6,0,35,0,0,255, -255,0,37,0,0,4,164,5,176,2,6,0,52,0,0,255,255,0,84,0,0,5,77,5,176,2,6,0,175,0, -0,255,255,0,66,0,0,4,214,5,176,2,6,0,56,0,0,255,255,0,106,255,235,3,243,4,78, -2,6,0,65,0,0,255,255,0,97,255,235,3,226,4,78,2,6,0,69,0,0,255,255,0,143,0,0,3, -252,5,247,2,38,0,227,0,0,0,7,0,154,0,153,0,71,255,255,0,97,255,235,4,42,4,78, -2,6,0,79,0,0,255,255,0,143,254,96,4,41,4,78,2,6,0,80,0,0,0,1,0,97,255,235,3, -217,4,78,0,29,0,0,37,50,54,53,51,23,22,6,35,34,2,61,1,52,18,51,50,22,15,1,35, -52,38,35,34,6,29,1,20,22,2,61,91,136,178,3,4,248,164,228,248,249,227,181,231, -4,2,179,129,98,145,133,131,133,121,88,6,140,217,1,54,231,42,229,1,55,224,163, -6,99,139,225,160,42,163,224,0,0,255,255,0,26,254,75,3,232,4,58,2,6,0,89,0,0, -255,255,0,46,0,0,3,212,4,58,2,6,0,88,0,0,255,255,0,97,255,235,3,226,5,204,2, -38,0,69,0,0,0,6,0,102,43,28,0,0,255,255,0,143,0,0,2,237,5,240,2,38,0,223,0,0, -0,7,0,113,0,201,0,2,255,255,0,103,255,235,3,201,4,78,2,6,0,83,0,0,255,255,0, -159,0,0,1,100,6,24,2,6,0,73,0,0,255,255,255,155,0,0,2,96,5,182,2,38,0,136,0,0, -0,7,0,102,254,251,0,6,255,255,255,190,254,75,1,114,6,24,2,6,0,74,0,0,255,255, -0,153,0,0,4,64,5,239,2,38,0,228,0,0,0,7,0,113,1,62,0,1,255,255,0,26,254,75,3, -232,5,247,2,38,0,89,0,0,0,6,0,154,86,71,0,0,255,255,0,37,0,0,6,191,7,75,2,38, -0,55,0,0,0,7,0,64,1,218,1,93,255,255,0,45,0,0,5,220,5,244,2,38,0,87,0,0,0,7,0, -64,1,110,0,6,255,255,0,37,0,0,6,191,7,71,2,38,0,55,0,0,0,7,0,113,2,148,1,89, -255,255,0,45,0,0,5,220,5,240,2,38,0,87,0,0,0,7,0,113,2,40,0,2,255,255,0,37,0, -0,6,191,7,13,2,38,0,55,0,0,0,7,0,102,1,111,1,93,255,255,0,45,0,0,5,220,5,182, -2,38,0,87,0,0,0,7,0,102,1,3,0,6,255,255,0,40,0,0,4,226,7,74,2,38,0,57,0,0,0,7, -0,64,0,239,1,92,255,255,0,26,254,75,3,232,5,244,2,38,0,89,0,0,0,6,0,64,107,6, -0,0,255,255,0,126,3,183,1,68,5,176,2,6,0,7,0,0,255,255,0,126,3,168,2,121,5, -176,2,6,3,177,0,0,255,255,0,171,0,0,3,140,5,176,0,38,3,176,0,0,0,7,3,176,2,27, -0,0,255,255,0,28,0,0,3,212,6,45,0,38,0,70,0,0,0,7,0,73,2,112,0,0,255,255,0,28, -0,0,3,212,6,45,0,38,0,70,0,0,0,7,0,76,2,112,0,0,255,255,255,158,254,75,2,127, -5,223,2,38,0,151,0,0,0,7,0,153,255,73,255,244,255,255,0,160,3,149,1,102,5,176, -2,6,1,8,0,0,255,255,0,163,0,0,6,65,7,71,2,38,0,45,0,0,0,7,0,113,2,150,1,89, -255,255,0,143,0,0,6,111,6,5,2,38,0,77,0,0,0,7,0,113,2,183,0,23,255,255,0,43,0, -0,4,227,7,113,2,38,0,33,0,0,0,7,0,156,1,50,1,172,255,255,0,106,255,235,3,243, -6,47,2,38,0,65,0,0,0,7,0,156,0,213,0,106,255,255,0,113,255,235,5,2,7,59,2,38, -0,47,0,0,0,7,1,204,0,8,1,118,255,255,0,28,0,0,6,68,6,45,0,38,0,70,0,0,0,39,0, -70,2,112,0,0,0,7,0,73,4,224,0,0,255,255,0,28,0,0,6,68,6,45,0,38,0,70,0,0,0,39, -0,70,2,112,0,0,0,7,0,76,4,224,0,0,255,255,0,163,0,0,4,36,7,75,2,38,0,37,0,0,0, -7,0,64,0,205,1,93,255,255,0,173,0,0,4,250,7,75,2,38,0,208,0,0,0,7,0,64,1,63,1, -93,255,255,0,97,255,235,3,226,6,10,2,38,0,69,0,0,0,7,0,64,0,150,0,28,255,255, -0,143,0,0,3,252,5,244,2,38,0,227,0,0,0,7,0,64,0,174,0,6,255,255,0,87,0,0,5,27, -5,176,2,6,0,176,0,0,255,255,0,91,254,38,5,77,4,58,2,6,0,196,0,0,255,255,0,22, -0,0,5,23,7,7,2,38,1,111,0,0,0,7,0,159,1,35,1,25,255,255,0,46,0,0,4,14,5,224,2, -38,1,112,0,0,0,7,0,159,0,189,255,242,255,255,0,97,254,75,8,86,4,78,0,38,0,79, -0,0,0,7,0,89,4,110,0,0,255,255,0,113,254,75,9,99,5,197,0,38,0,47,0,0,0,7,0,89, -5,123,0,0,255,255,0,120,254,8,4,223,5,197,2,38,0,207,0,0,0,7,1,50,1,174,255, -189,255,255,0,100,254,9,3,236,4,76,2,38,0,226,0,0,0,7,1,50,1,42,255,190,255, -255,0,118,253,206,4,191,5,197,2,38,0,35,0,0,0,7,1,51,1,162,255,131,255,255,0, -97,253,206,3,217,4,78,2,38,0,67,0,0,0,7,1,51,1,31,255,131,255,255,0,40,0,0,4, -226,5,176,2,6,0,57,0,0,255,255,0,46,254,95,3,228,4,58,2,6,0,180,0,0,255,255,0, -190,0,0,1,132,5,176,2,6,0,41,0,0,255,255,0,26,0,0,6,124,7,78,2,38,0,206,0,0,0, -7,0,154,1,160,1,158,255,255,0,26,0,0,5,166,5,247,2,38,0,225,0,0,0,7,0,154,1, -52,0,71,255,255,0,190,0,0,1,132,5,176,2,6,0,41,0,0,255,255,0,43,0,0,4,227,7, -78,2,38,0,33,0,0,0,7,0,154,0,220,1,158,255,255,0,106,255,235,3,243,6,12,2,38, -0,65,0,0,0,6,0,154,127,92,0,0,255,255,0,43,0,0,4,227,7,13,2,38,0,33,0,0,0,7,0, -102,0,134,1,93,255,255,0,106,255,235,3,243,5,203,2,38,0,65,0,0,0,6,0,102,41, -27,0,0,255,255,0,14,0,0,7,132,5,176,2,6,0,125,0,0,255,255,0,88,255,235,6,154, -4,78,2,6,0,130,0,0,255,255,0,163,0,0,4,36,7,78,2,38,0,37,0,0,0,7,0,154,0,184, -1,158,255,255,0,97,255,235,3,226,6,13,2,38,0,69,0,0,0,7,0,154,0,129,0,93,255, -255,0,89,255,235,5,33,6,223,2,38,1,121,0,0,0,7,0,102,0,115,1,47,255,255,0,94, -255,236,3,223,5,204,0,47,0,69,4,64,4,58,192,1,0,6,0,102,43,28,0,0,255,255,0, -26,0,0,6,124,7,13,2,38,0,206,0,0,0,7,0,102,1,74,1,93,255,255,0,26,0,0,5,166,5, -182,2,38,0,225,0,0,0,7,0,102,0,222,0,6,255,255,0,120,255,235,4,223,7,34,2,38, -0,207,0,0,0,7,0,102,0,169,1,114,255,255,0,100,255,237,3,236,5,202,2,38,0,226, -0,0,0,6,0,102,37,26,0,0,255,255,0,173,0,0,4,250,6,250,2,38,0,208,0,0,0,7,0, -108,0,248,1,74,255,255,0,143,0,0,3,252,5,164,2,38,0,227,0,0,0,6,0,108,103,244, -0,0,255,255,0,173,0,0,4,250,7,13,2,38,0,208,0,0,0,7,0,102,0,212,1,93,255,255, -0,143,0,0,3,252,5,182,2,38,0,227,0,0,0,6,0,102,67,6,0,0,255,255,0,113,255,235, -5,2,7,34,2,38,0,47,0,0,0,7,0,102,0,185,1,114,255,255,0,97,255,235,4,42,5,203, -2,38,0,79,0,0,0,6,0,102,68,27,0,0,255,255,0,113,255,235,5,2,5,197,2,6,0,253,0, -0,255,255,0,97,255,235,4,42,4,78,2,6,0,254,0,0,255,255,0,113,255,235,5,2,7,38, -2,38,0,253,0,0,0,7,0,102,0,184,1,118,255,255,0,97,255,235,4,42,5,176,2,38,0, -254,0,0,0,6,0,102,68,0,0,0,255,255,0,181,255,236,4,255,7,35,2,38,0,218,0,0,0, -7,0,102,0,178,1,115,255,255,0,99,255,235,3,227,5,203,2,38,0,242,0,0,0,6,0,102, -33,27,0,0,255,255,0,66,255,235,4,200,6,250,2,38,0,210,0,0,0,7,0,108,0,168,1, -74,255,255,0,26,254,75,3,232,5,164,2,38,0,89,0,0,0,6,0,108,36,244,0,0,255,255, -0,66,255,235,4,200,7,13,2,38,0,210,0,0,0,7,0,102,0,132,1,93,255,255,0,26,254, -75,3,232,5,182,2,38,0,89,0,0,0,6,0,102,0,6,0,0,255,255,0,66,255,235,4,200,7, -75,2,38,0,210,0,0,0,7,0,159,1,54,1,93,255,255,0,26,254,75,3,252,5,244,2,38,0, -89,0,0,0,7,0,159,0,178,0,6,255,255,0,147,0,0,4,204,7,13,2,38,0,212,0,0,0,7,0, -102,0,174,1,93,255,255,0,115,0,0,3,220,5,182,2,38,0,236,0,0,0,6,0,102,38,6,0, -0,255,255,0,163,0,0,6,50,7,13,0,38,0,217,0,0,0,39,0,41,4,174,0,0,0,7,0,102,1, -105,1,93,255,255,0,153,0,0,5,172,5,182,0,38,0,241,0,0,0,39,0,136,4,78,0,0,0,7, -0,102,1,34,0,6,255,255,0,66,254,75,5,35,5,176,2,38,0,56,0,0,0,7,1,51,3,177,0, -0,255,255,0,46,254,75,4,62,4,58,2,38,0,88,0,0,0,7,1,51,2,204,0,0,255,255,0,98, -255,235,3,245,6,24,2,6,0,68,0,0,255,255,0,69,254,75,5,187,5,176,2,38,0,209,0, -0,0,7,1,51,4,73,0,0,255,255,0,65,254,75,4,192,4,58,2,38,0,229,0,0,0,7,1,51,3, -78,0,0,255,255,0,43,0,0,4,227,7,13,2,38,0,33,0,0,0,7,0,155,1,123,1,93,255,255, -0,106,255,235,3,243,5,203,2,38,0,65,0,0,0,7,0,155,1,30,0,27,255,255,0,43,0,0, -4,227,7,157,2,38,0,33,0,0,0,7,1,41,1,214,1,234,255,255,0,106,255,235,3,243,6, -91,2,38,0,65,0,0,0,7,1,41,1,121,0,168,255,255,0,43,0,0,5,11,7,241,2,38,0,33,0, -0,0,7,1,42,0,154,1,89,255,255,0,106,255,235,4,174,6,175,2,38,0,65,0,0,0,6,1, -42,61,23,0,0,255,255,0,0,0,0,4,227,7,224,2,38,0,33,0,0,0,7,1,43,0,171,1,72, -255,255,255,163,255,235,3,243,6,158,2,38,0,65,0,0,0,6,1,43,78,6,0,0,255,255,0, -43,0,0,4,227,8,5,2,38,0,33,0,0,0,7,1,44,0,163,1,52,255,255,0,106,255,235,4, -119,6,196,2,38,0,65,0,0,0,6,1,44,70,243,0,0,255,255,0,43,0,0,4,227,8,50,2,38, -0,33,0,0,0,7,1,45,0,167,1,54,255,255,0,106,255,235,3,243,6,241,2,38,0,65,0,0, -0,6,1,45,74,245,0,0,255,255,0,43,254,176,4,227,7,72,2,38,0,33,0,0,0,39,0,152, -0,171,1,93,0,7,0,155,1,112,249,201,255,255,0,106,254,176,3,243,6,6,2,38,0,65, -0,0,0,38,0,152,78,27,0,7,0,155,0,206,249,201,0,0,255,255,0,43,0,0,4,227,7,223, -2,38,0,33,0,0,0,7,1,46,0,210,1,84,255,255,0,106,255,235,3,243,6,157,2,38,0,65, -0,0,0,6,1,46,117,18,0,0,255,255,0,43,0,0,4,227,8,34,2,38,0,33,0,0,0,7,1,64,0, -214,1,122,255,255,0,106,255,235,3,243,6,224,2,38,0,65,0,0,0,6,1,64,121,56,0,0, -255,255,0,43,0,0,4,227,8,115,2,38,0,33,0,0,0,7,1,47,0,214,1,73,255,255,0,106, -255,235,3,243,7,49,2,38,0,65,0,0,0,6,1,47,121,7,0,0,255,255,0,43,0,0,4,227,8, -37,2,38,0,33,0,0,0,7,1,48,0,214,1,81,255,255,0,106,255,235,3,243,6,227,2,38,0, -65,0,0,0,6,1,48,121,15,0,0,255,255,0,43,254,176,4,227,7,78,2,38,0,33,0,0,0,39, -0,154,0,220,1,158,0,7,0,155,1,112,249,201,255,255,0,106,254,176,3,243,6,12,2, -38,0,65,0,0,0,38,0,154,127,92,0,7,0,155,0,206,249,201,0,0,255,255,0,163,0,0,4, -36,7,13,2,38,0,37,0,0,0,7,0,155,1,87,1,93,255,255,0,97,255,235,3,226,5,204,2, -38,0,69,0,0,0,7,0,155,1,32,0,28,255,255,0,163,0,0,4,36,7,157,2,38,0,37,0,0,0, -7,1,41,1,178,1,234,255,255,0,97,255,235,3,226,6,92,2,38,0,69,0,0,0,7,1,41,1, -123,0,169,255,255,0,163,0,0,4,36,7,84,2,38,0,37,0,0,0,7,0,158,0,130,1,97,255, -255,0,97,255,235,3,226,6,19,2,38,0,69,0,0,0,6,0,158,75,32,0,0,255,255,0,163,0, -0,4,231,7,241,2,38,0,37,0,0,0,7,1,42,0,118,1,89,255,255,0,97,255,235,4,176,6, -176,2,38,0,69,0,0,0,6,1,42,63,24,0,0,255,255,255,220,0,0,4,36,7,224,2,38,0,37, -0,0,0,7,1,43,0,135,1,72,255,255,255,165,255,235,3,226,6,159,2,38,0,69,0,0,0,6, -1,43,80,7,0,0,255,255,0,163,0,0,4,176,8,5,2,38,0,37,0,0,0,7,1,44,0,127,1,52, -255,255,0,97,255,235,4,121,6,197,2,38,0,69,0,0,0,6,1,44,72,244,0,0,255,255,0, -163,0,0,4,36,8,50,2,38,0,37,0,0,0,7,1,45,0,131,1,54,255,255,0,97,255,235,3, -226,6,242,2,38,0,69,0,0,0,6,1,45,76,246,0,0,255,255,0,163,254,186,4,36,7,72,2, -38,0,37,0,0,0,39,0,152,0,135,1,93,0,7,0,155,1,86,249,211,255,255,0,97,254,176, -3,226,6,7,2,38,0,69,0,0,0,38,0,152,80,28,0,7,0,155,1,86,249,201,0,0,255,255,0, -190,0,0,2,3,7,157,2,38,0,41,0,0,0,7,1,41,0,111,1,234,255,255,0,153,0,0,1,222, -6,70,2,38,0,136,0,0,0,7,1,41,0,74,0,147,255,255,0,180,0,0,1,142,7,13,2,38,0, -41,0,0,0,7,0,155,0,20,1,93,255,255,0,149,254,186,1,111,6,24,2,38,0,73,0,0,0,7, -0,155,255,245,249,211,255,255,0,113,255,235,5,2,7,34,2,38,0,47,0,0,0,7,0,155, -1,174,1,114,255,255,0,97,255,235,4,42,5,203,2,38,0,79,0,0,0,7,0,155,1,57,0,27, -255,255,0,113,255,235,5,2,7,178,2,38,0,47,0,0,0,7,1,41,2,9,1,255,255,255,0,97, -255,235,4,42,6,91,2,38,0,79,0,0,0,7,1,41,1,148,0,168,255,255,0,113,255,235,5, -62,8,6,2,38,0,47,0,0,0,7,1,42,0,205,1,110,255,255,0,97,255,235,4,201,6,175,2, -38,0,79,0,0,0,6,1,42,88,23,0,0,255,255,0,51,255,235,5,2,7,245,2,38,0,47,0,0,0, -7,1,43,0,222,1,93,255,255,255,190,255,235,4,42,6,158,2,38,0,79,0,0,0,6,1,43, -105,6,0,0,255,255,0,113,255,235,5,7,8,26,2,38,0,47,0,0,0,7,1,44,0,214,1,73, -255,255,0,97,255,235,4,146,6,196,2,38,0,79,0,0,0,6,1,44,97,243,0,0,255,255,0, -113,255,235,5,2,8,71,2,38,0,47,0,0,0,7,1,45,0,218,1,75,255,255,0,97,255,235,4, -42,6,241,2,38,0,79,0,0,0,6,1,45,101,245,0,0,255,255,0,113,254,167,5,2,7,93,2, -38,0,47,0,0,0,39,0,152,0,222,1,114,0,7,0,155,1,172,249,192,255,255,0,97,254, -166,4,42,6,6,2,38,0,79,0,0,0,38,0,152,105,27,0,7,0,155,1,56,249,191,0,0,255, -255,0,108,255,235,6,49,6,253,2,38,0,147,0,0,0,7,0,113,1,224,1,15,255,255,0,97, -255,235,4,242,6,30,2,38,0,148,0,0,0,7,0,113,1,107,0,48,255,255,0,108,255,235, -6,49,7,1,2,38,0,147,0,0,0,7,0,64,1,38,1,19,255,255,0,97,255,235,4,242,6,30,2, -38,0,148,0,0,0,7,0,113,1,107,0,48,255,255,0,108,255,235,6,49,7,83,2,38,0,147, -0,0,0,7,1,41,2,11,1,160,255,255,0,97,255,235,4,242,6,116,2,38,0,148,0,0,0,7,1, -41,1,150,0,193,255,255,0,108,255,235,6,49,7,10,2,38,0,147,0,0,0,7,0,158,0,219, -1,23,255,255,0,97,255,235,4,42,6,18,2,38,0,79,0,0,0,6,0,158,100,31,0,0,255, -255,0,108,255,235,6,49,6,195,2,38,0,147,0,0,0,7,0,155,1,176,1,19,255,255,0,97, -255,235,4,242,5,228,2,38,0,148,0,0,0,7,0,155,1,59,0,52,255,255,0,147,255,235, -4,220,7,13,2,38,0,53,0,0,0,7,0,155,1,172,1,93,255,255,0,139,255,235,3,252,5, -182,2,38,0,85,0,0,0,7,0,155,1,55,0,6,255,255,0,147,255,235,4,220,7,157,2,38,0, -53,0,0,0,7,1,41,2,7,1,234,255,255,0,139,255,235,3,252,6,70,2,38,0,85,0,0,0,7, -1,41,1,146,0,147,255,255,0,147,255,235,6,88,6,244,2,38,0,149,0,0,0,7,0,113,1, -202,1,6,255,255,0,139,255,235,5,106,5,253,2,38,0,150,0,0,0,7,0,113,1,88,0,15, -255,255,0,147,255,235,6,88,6,248,2,38,0,149,0,0,0,7,0,64,1,16,1,10,255,255,0, -139,255,235,5,106,6,1,2,38,0,150,0,0,0,7,0,64,0,158,0,19,255,255,0,147,255, -235,6,88,7,74,2,38,0,149,0,0,0,7,1,41,1,245,1,151,255,255,0,139,255,235,5,106, -6,83,2,38,0,150,0,0,0,7,1,41,1,131,0,160,255,255,0,147,255,235,6,88,7,1,2,38, -0,149,0,0,0,7,0,158,0,197,1,14,255,255,0,139,255,235,5,106,6,10,2,38,0,150,0, -0,0,6,0,158,83,23,0,0,255,255,0,147,255,235,6,88,6,186,2,38,0,149,0,0,0,7,0, -155,1,154,1,10,255,255,0,139,255,235,5,106,5,195,2,38,0,150,0,0,0,7,0,155,1, -40,0,19,255,255,0,40,0,0,4,226,7,12,2,38,0,57,0,0,0,7,0,155,1,121,1,92,255, -255,0,26,254,75,3,232,5,182,2,38,0,89,0,0,0,7,0,155,0,245,0,6,255,255,0,40,0, -0,4,226,7,156,2,38,0,57,0,0,0,7,1,41,1,212,1,233,255,255,0,26,254,75,3,232,6, -70,2,38,0,89,0,0,0,7,1,41,1,80,0,147,255,255,0,40,0,0,4,226,7,83,2,38,0,57,0, -0,0,7,0,158,0,164,1,96,255,255,0,26,254,75,3,232,5,253,2,38,0,89,0,0,0,6,0, -158,32,10,0,0,255,255,0,98,255,12,4,126,6,24,2,38,1,209,0,0,0,7,0,63,0,148, -255,166,255,255,0,163,254,210,5,58,5,176,2,38,0,43,0,0,0,7,1,49,4,21,0,0,255, -255,0,71,254,210,3,209,4,58,2,38,0,233,0,0,0,7,1,49,1,216,0,0,255,255,0,169, -254,210,5,135,5,176,2,38,0,40,0,0,0,7,1,49,4,98,0,0,255,255,0,143,254,210,4, -140,4,58,2,38,0,231,0,0,0,7,1,49,3,103,0,0,255,255,0,37,254,210,4,164,5,176,2, -38,0,52,0,0,0,7,1,49,2,48,0,0,255,255,0,71,254,210,3,209,4,58,2,38,0,233,0,0, -0,7,1,49,1,216,0,0,255,255,0,66,254,210,4,240,5,176,2,38,0,56,0,0,0,7,1,49,3, -203,0,0,255,255,0,46,254,210,4,11,4,58,2,38,0,88,0,0,0,7,1,49,2,230,0,0,255, -255,0,147,254,210,5,93,5,176,2,38,0,212,0,0,0,7,1,49,4,56,0,0,255,255,0,115, -254,210,4,109,4,58,2,38,0,236,0,0,0,7,1,49,3,72,0,0,255,255,0,147,254,210,4, -204,5,176,2,38,0,212,0,0,0,7,1,49,3,21,0,0,255,255,0,115,254,210,3,220,4,58,2, -38,0,236,0,0,0,7,1,49,2,36,0,0,255,255,0,163,254,210,4,32,5,176,2,38,0,168,0, -0,0,7,1,49,0,212,0,0,255,255,0,143,254,210,2,190,4,58,2,38,0,223,0,0,0,7,1,49, -0,177,0,0,255,255,0,26,254,210,6,195,5,176,2,38,0,206,0,0,0,7,1,49,5,158,0,0, -255,255,0,26,254,210,5,202,4,58,2,38,0,225,0,0,0,7,1,49,4,165,0,0,255,255,0, -77,254,98,6,44,5,195,2,38,1,127,0,0,0,7,0,157,2,108,0,0,255,255,255,223,254, -98,4,94,4,78,2,38,1,128,0,0,0,7,0,157,1,102,0,0,255,255,0,143,0,0,4,0,6,24,2, -6,0,72,0,0,0,2,255,156,0,0,4,0,4,58,0,18,0,27,0,0,1,33,21,33,50,22,21,20,6,35, -33,17,35,53,51,53,51,21,33,1,17,33,50,54,53,52,38,35,2,98,254,252,1,13,192, -213,215,190,254,46,253,253,197,1,4,254,252,1,13,106,101,102,105,3,31,129,184, -147,148,191,3,31,155,128,128,254,74,254,150,102,76,74,110,0,0,0,0,2,255,175,0, -0,4,187,5,176,0,18,0,27,0,0,1,33,21,33,50,4,21,20,4,35,33,17,35,53,51,53,51, -21,33,1,17,33,50,54,53,52,38,35,2,117,254,243,1,103,233,1,3,254,252,232,253, -212,244,244,197,1,13,254,243,1,103,147,148,147,148,4,77,221,239,197,198,246,4, -77,155,200,200,253,237,253,197,169,123,119,160,0,0,2,255,156,0,0,4,0,4,58,0, -18,0,27,0,0,1,33,21,33,50,22,21,20,6,35,33,17,35,53,51,53,51,21,33,1,17,33,50, -54,53,52,38,35,2,98,254,252,1,13,192,213,215,190,254,46,253,253,197,1,4,254, -252,1,13,106,101,102,105,3,31,129,184,147,148,191,3,31,155,128,128,254,74,254, -150,102,76,74,110,0,0,0,0,2,255,175,0,0,4,187,5,176,0,18,0,27,0,0,1,33,21,33, -50,4,21,20,4,35,33,17,35,53,51,53,51,21,33,1,17,33,50,54,53,52,38,35,2,117, -254,243,1,103,233,1,3,254,252,232,253,212,244,244,197,1,13,254,243,1,103,147, -148,147,148,4,77,221,239,197,198,246,4,77,155,200,200,253,237,253,197,169,123, -119,160,0,0,1,255,205,0,0,4,32,5,176,0,13,0,0,1,33,17,35,17,35,53,51,17,33,21, -33,17,33,2,147,254,213,197,214,214,3,125,253,72,1,43,2,169,253,87,2,169,155,2, -108,155,254,47,0,0,0,0,1,255,213,0,0,2,190,4,58,0,13,0,0,1,33,17,35,17,35,53, -51,17,33,21,33,17,33,2,155,254,185,197,186,186,2,47,254,150,1,71,1,220,254,36, -1,220,155,1,195,156,254,217,0,0,0,0,1,255,179,0,0,4,251,5,176,0,22,0,0,1,35, -17,35,17,35,53,51,53,51,21,33,21,33,17,51,1,51,23,9,1,7,35,1,251,147,197,240, -240,197,1,17,254,239,128,2,8,222,2,253,196,2,103,3,239,2,146,253,110,4,130, -155,147,147,155,254,170,2,132,5,253,80,253,10,5,0,0,1,255,157,0,0,4,11,6,24,0, -20,0,0,1,35,17,35,17,35,53,51,53,51,21,33,21,33,17,51,1,51,9,1,35,1,206,121, -197,243,243,197,1,14,254,242,119,1,49,236,254,137,1,153,233,1,243,254,13,4, -190,155,191,191,155,253,210,1,170,254,14,253,184,0,0,0,255,255,0,173,254,224, -5,133,7,78,2,38,0,208,0,0,0,39,0,154,1,42,1,158,0,7,1,110,4,30,255,179,255, -255,0,143,254,224,4,135,5,247,2,38,0,227,0,0,0,39,0,154,0,153,0,71,0,7,1,110, -3,32,255,179,255,255,0,169,254,224,5,129,5,176,2,38,0,40,0,0,0,7,1,110,4,26, -255,179,255,255,0,143,254,224,4,134,4,58,2,38,0,231,0,0,0,7,1,110,3,31,255, -179,255,255,0,163,254,224,6,204,5,176,2,38,0,45,0,0,0,7,1,110,5,101,255,179, -255,255,0,153,254,224,5,224,4,58,2,38,0,230,0,0,0,7,1,110,4,121,255,179,255, -255,0,65,254,224,4,135,4,58,2,38,0,229,0,0,0,7,1,110,3,32,255,179,255,255,0, -69,254,224,5,130,5,176,2,38,0,209,0,0,0,7,1,110,4,27,255,179,0,1,0,40,0,0,4, -226,5,176,0,15,0,0,9,1,51,1,51,21,35,7,17,35,17,33,53,51,1,51,2,133,1,124,225, -254,93,159,243,8,196,254,249,179,254,93,225,2,204,2,228,252,250,155,15,254,0, -2,15,155,3,6,0,0,0,1,0,46,254,95,3,228,4,58,0,17,0,0,5,33,17,35,17,35,53,51,1, -51,1,23,51,55,19,51,1,51,3,120,254,245,197,246,218,254,162,202,1,0,17,6,19, -249,201,254,166,238,13,254,108,1,148,155,3,172,253,5,76,76,2,251,252,84,0,1,0, -66,0,0,4,214,5,176,0,17,0,0,1,35,1,35,9,1,35,1,35,53,51,1,51,9,1,51,1,51,3, -252,211,1,173,235,254,163,254,162,238,1,173,185,171,254,107,236,1,82,1,84,238, -254,106,198,2,155,253,101,2,66,253,190,2,155,155,2,122,253,200,2,56,253,134,0, -0,0,0,1,0,46,0,0,3,212,4,58,0,17,0,0,1,35,1,35,11,1,35,1,35,53,51,1,51,27,1, -51,1,51,3,95,199,1,60,226,240,240,228,1,59,208,197,254,218,227,227,230,230, -254,217,188,1,222,254,34,1,153,254,103,1,222,155,1,193,254,113,1,143,254,63,0, -0,0,255,255,255,206,254,75,4,32,5,176,2,38,0,168,0,0,0,39,1,130,255,90,0,33,0, -7,1,51,1,153,0,0,255,255,255,214,254,75,2,190,4,58,2,38,0,223,0,0,0,39,1,130, -255,98,255,85,0,7,1,51,0,219,0,0,255,255,0,108,255,235,6,98,7,114,2,38,0,251, -0,0,0,7,0,255,1,43,1,118,255,255,0,127,255,235,5,210,5,252,2,38,0,252,0,0,0,7, -0,255,0,240,0,0,255,255,0,98,255,237,3,233,4,76,2,6,0,182,0,0,255,255,255,237, -0,0,4,52,5,176,2,38,0,38,0,0,0,7,1,130,255,121,254,127,255,255,0,187,2,136,5, -243,3,35,0,70,1,33,175,0,102,102,64,0,0,2,0,70,0,0,4,162,5,176,0,27,0,31,0,0, -1,35,3,35,19,35,53,33,19,33,53,33,19,51,3,51,19,51,3,51,21,35,3,51,21,35,3,35, -3,51,19,35,2,200,255,80,151,80,236,1,8,68,255,0,1,28,82,151,82,255,82,151,82, -199,226,68,219,247,80,152,147,255,68,255,1,154,254,102,1,154,140,1,92,142,1, -160,254,96,1,160,254,96,142,254,164,140,254,102,2,38,1,92,0,2,0,171,0,0,1,113, -5,176,0,3,0,7,0,0,1,35,17,51,19,35,53,51,1,112,197,197,1,198,198,1,222,3,210, -250,80,205,0,0,0,2,0,126,3,168,2,121,5,176,0,4,0,10,0,0,1,7,35,17,51,1,7,35, -55,17,51,2,121,101,97,198,254,203,101,97,1,197,4,162,250,2,8,254,242,250,240, -1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,152,0,242,1,4,1,42,1,80,1,112,1,136,1, -152,1,166,1,178,1,192,1,238,1,254,2,42,2,104,2,136,2,188,2,252,3,24,3,96,3, -158,3,170,3,182,3,206,3,226,3,250,4,44,4,160,4,190,4,246,5,42,5,82,5,108,5, -130,5,184,5,208,5,220,5,250,6,26,6,42,6,76,6,102,6,154,6,190,6,250,7,50,7,112, -7,132,7,166,7,190,7,234,8,10,8,34,8,56,8,76,8,90,8,108,8,132,8,146,8,162,8, -226,9,22,9,68,9,120,9,174,9,210,10,20,10,54,10,72,10,108,10,136,10,148,10,204, -10,238,11,28,11,80,11,132,11,162,11,222,12,4,12,38,12,62,12,104,12,134,12,176, -12,198,12,246,13,4,13,50,13,92,13,104,13,158,13,212,14,32,14,74,14,94,14,198, -14,218,15,52,15,118,15,130,15,146,15,246,16,4,16,42,16,74,16,118,16,180,16, -196,16,234,17,2,17,16,17,44,17,60,17,102,17,114,17,132,17,150,17,168,17,178, -17,220,17,254,18,82,18,122,18,180,19,22,19,98,19,124,19,202,19,254,20,40,20, -52,20,84,20,112,20,136,20,180,20,230,21,36,21,136,21,182,21,210,22,8,22,72,22, -130,22,178,22,226,23,0,23,22,23,44,23,74,23,88,23,126,23,156,23,188,23,214,23, -224,23,236,23,248,24,0,24,12,24,26,24,52,24,60,24,78,24,102,24,162,24,184,24, -212,24,230,25,8,25,72,25,118,25,176,25,244,26,52,26,80,26,138,26,200,26,254, -27,32,27,86,27,116,27,172,27,240,28,24,28,74,28,128,28,180,28,200,28,238,29, -44,29,98,29,162,29,204,30,6,30,62,30,110,30,144,30,168,30,208,30,250,31,38,31, -102,31,128,31,160,31,202,31,226,32,0,32,26,32,56,32,96,32,140,32,176,32,232, -33,36,33,76,33,148,33,200,33,218,34,2,34,46,34,108,34,134,34,166,34,196,34, -228,34,252,35,14,35,34,35,124,35,148,35,176,35,202,35,232,36,16,36,60,36,96, -36,150,36,206,36,248,37,54,37,106,37,160,37,208,37,252,38,20,38,90,38,154,38, -234,39,52,39,72,39,102,39,118,39,134,39,182,39,230,39,240,39,250,40,10,40,26, -40,42,40,54,40,66,40,78,40,104,40,130,40,166,40,190,40,206,41,74,41,100,41, -126,41,140,41,172,41,234,42,42,42,86,42,104,42,122,42,140,42,158,42,216,42, -236,43,14,43,28,43,54,43,136,43,180,43,216,43,232,43,248,44,2,44,32,44,62,44, -90,44,134,44,180,44,216,45,14,45,68,45,82,45,112,45,140,45,172,45,188,45,232, -46,38,46,70,46,122,46,186,46,214,47,30,47,92,47,138,47,168,47,204,48,2,48,50, -48,86,48,112,48,134,48,184,48,208,48,220,48,250,49,26,49,42,49,74,49,100,49, -146,49,182,49,236,50,36,50,96,50,116,50,148,50,172,50,208,50,240,51,8,51,30, -51,74,51,90,51,134,51,196,51,228,52,22,52,82,52,110,52,182,52,242,53,28,53,44, -53,88,53,150,53,182,53,232,54,36,54,62,54,134,54,194,54,210,54,250,55,34,55, -80,55,122,55,166,55,208,55,248,56,32,56,74,56,116,56,174,56,184,56,212,56,240, -57,18,57,52,57,122,57,184,57,212,57,226,58,4,58,38,58,104,58,166,58,200,58, -238,59,36,59,88,59,146,59,204,60,8,60,62,60,110,60,156,60,212,61,38,61,106,61, -174,61,234,62,38,62,76,62,140,62,162,62,184,62,222,63,4,63,40,63,76,63,110,63, -150,63,190,64,16,64,96,64,142,64,190,64,204,65,8,65,72,65,88,65,156,65,216,65, -232,65,248,66,78,66,158,66,218,67,18,67,94,67,164,67,164,67,164,67,164,67,164, -67,164,67,164,67,164,67,164,67,164,67,164,67,164,68,126,68,196,68,208,69,28, -69,100,69,100,69,100,69,162,69,206,70,136,70,224,71,2,71,56,71,82,71,172,71, -188,71,250,72,60,72,122,72,134,72,142,72,150,72,200,72,250,73,38,73,66,73,74, -73,86,73,98,73,110,73,122,73,134,73,146,73,162,73,174,73,186,73,198,73,210,73, -222,73,234,73,246,74,2,74,14,74,26,74,38,74,50,74,62,74,74,74,86,74,98,74,110, -74,122,74,134,74,146,74,158,74,170,74,182,74,194,74,206,74,218,74,234,74,246, -75,2,75,14,75,26,75,38,75,50,75,62,75,74,75,86,75,98,75,110,75,122,75,134,75, -146,75,158,75,170,75,182,75,194,75,206,75,218,75,230,75,242,75,254,76,10,76, -22,76,34,76,46,76,58,76,70,76,82,76,94,76,106,76,118,76,130,76,142,76,154,76, -162,76,174,76,186,76,198,76,210,76,222,76,234,76,246,77,2,77,14,77,26,77,38, -77,50,77,62,77,74,77,86,77,98,77,110,77,122,77,134,77,146,77,158,77,170,77, -182,77,194,77,206,77,218,77,230,77,242,77,254,78,10,78,22,78,34,78,46,78,58, -78,70,78,82,78,94,78,106,78,118,78,126,78,134,78,146,78,158,78,170,78,182,78, -194,78,206,78,218,78,230,78,242,78,254,79,10,79,22,79,34,79,46,79,58,79,70,79, -82,79,94,79,106,79,118,79,130,79,142,79,154,79,166,79,178,79,190,79,202,79, -214,79,226,79,238,79,250,80,6,80,14,80,26,80,38,80,50,80,62,80,74,80,86,80,98, -80,110,80,122,80,134,80,146,80,158,80,170,80,182,80,194,80,206,80,218,80,230, -80,242,80,254,81,10,81,22,81,34,81,46,81,58,81,70,81,82,81,94,81,106,81,118, -81,130,81,142,81,154,81,166,81,178,81,190,81,202,81,210,81,218,81,226,81,234, -81,242,81,250,82,2,82,10,82,18,82,26,82,34,82,42,82,50,82,58,82,70,82,82,82, -94,82,106,82,118,82,130,82,142,82,150,82,158,82,166,82,174,82,186,82,198,82, -210,82,222,82,234,82,246,83,2,83,64,83,72,83,84,83,92,83,100,83,112,83,120,83, -128,83,136,83,144,83,152,83,164,83,172,83,180,83,188,83,196,83,204,83,212,83, -220,83,228,83,236,83,244,83,252,84,8,84,16,84,24,84,70,84,78,84,86,84,98,84, -110,84,118,84,126,84,138,84,146,84,158,84,170,84,182,84,194,84,206,84,218,84, -230,84,242,84,254,85,10,85,18,85,26,85,38,85,50,85,62,85,74,85,82,85,94,85, -106,85,118,85,130,85,142,85,158,85,174,85,186,85,198,85,210,85,222,85,230,85, -238,85,250,86,6,86,18,86,30,86,42,86,54,86,66,86,78,86,86,86,94,86,102,86,114, -86,126,86,134,86,146,86,158,86,170,86,182,86,190,86,198,86,210,86,222,86,234, -86,248,87,4,87,16,87,28,87,40,87,52,87,64,87,76,87,88,87,100,87,112,87,120,87, -128,87,140,87,152,87,164,87,176,87,188,87,200,87,212,87,224,87,236,87,248,88, -4,88,16,88,32,88,48,88,60,88,72,88,80,88,92,88,104,88,116,88,128,88,140,88, -152,88,164,88,176,88,188,88,200,88,212,88,224,88,236,88,248,89,8,89,24,89,36, -89,48,89,60,89,72,89,84,89,96,89,108,89,120,89,136,89,152,89,164,89,176,89, -188,89,200,89,212,89,224,89,236,89,248,90,4,90,16,90,28,90,40,90,52,90,64,90, -80,90,96,90,108,90,120,90,132,90,144,90,156,90,168,90,180,90,192,90,204,90, -216,90,228,90,240,90,252,91,8,91,20,91,32,91,48,91,64,91,76,91,88,91,100,91, -112,91,124,91,136,91,148,91,160,91,172,91,184,91,196,91,208,91,220,91,232,91, -244,92,0,92,12,92,24,92,36,92,48,92,60,92,72,92,84,92,96,92,108,92,120,92,132, -92,144,92,156,92,168,92,180,92,192,92,204,92,216,92,228,92,240,92,252,93,8,93, -20,93,32,93,44,93,56,93,68,93,80,93,92,93,104,93,116,93,128,93,140,93,148,93, -194,93,240,94,30,94,76,94,104,94,132,94,172,94,210,94,226,94,242,94,254,95,10, -95,22,95,34,95,46,95,58,95,90,95,124,95,164,95,202,95,218,95,234,95,246,96,2, -96,10,96,22,96,32,96,86,96,106,96,132,0,0,0,0,0,1,0,0,32,210,0,1,5,118,24,0,0, -10,8,196,0,8,0,42,255,162,0,8,0,54,0,40,0,8,0,55,0,37,0,8,0,57,0,45,0,16,0,16, -0,4,0,16,0,17,255,221,0,16,0,19,255,252,0,16,0,20,0,5,0,16,0,21,255,253,0,16, -0,22,0,4,0,16,0,23,255,213,0,16,0,25,0,6,0,17,0,18,255,250,0,17,0,19,255,250, -0,17,0,21,255,250,0,17,0,23,255,254,0,18,0,16,255,239,0,18,0,17,255,239,0,18, -0,18,0,8,0,18,0,21,255,242,0,18,0,22,255,239,0,18,0,23,255,233,0,18,0,24,255, -238,0,18,0,25,0,2,0,19,0,17,255,236,0,19,0,18,255,253,0,19,0,19,0,7,0,19,0,20, -0,15,0,19,0,21,0,4,0,19,0,22,255,253,0,19,0,23,255,228,0,19,0,24,0,5,0,19,0, -25,255,255,0,20,0,16,0,3,0,20,0,18,255,225,0,20,0,20,0,34,0,20,0,21,0,17,0,20, -0,22,0,3,0,20,0,23,255,173,0,20,0,24,0,19,0,21,0,17,255,252,0,21,0,18,255,234, -0,21,0,19,0,6,0,21,0,20,0,17,0,21,0,21,0,5,0,21,0,22,255,254,0,21,0,23,255, -253,0,21,0,24,0,6,0,21,0,25,255,229,0,22,0,16,0,2,0,22,0,17,255,217,0,22,0,18, -255,232,0,22,0,20,0,23,0,22,0,21,0,9,0,22,0,22,0,2,0,22,0,23,255,216,0,22,0, -24,0,11,0,23,0,17,0,36,0,23,0,20,255,94,0,23,0,21,255,225,0,23,0,22,255,217,0, -23,0,23,0,38,0,23,0,24,255,234,0,23,0,25,255,249,0,24,0,16,255,255,0,24,0,17, -255,234,0,24,0,19,0,11,0,24,0,20,0,20,0,24,0,21,0,8,0,24,0,22,255,255,0,25,0, -16,0,3,0,25,0,17,255,218,0,25,0,18,255,247,0,25,0,20,0,5,0,25,0,21,255,252,0, -25,0,22,0,3,0,25,0,23,255,209,0,25,0,25,0,5,0,33,0,35,255,218,0,33,0,39,255, -217,0,33,0,47,255,214,0,33,0,49,255,217,0,33,0,52,255,104,0,33,0,53,255,211,0, -33,0,54,255,108,0,33,0,55,255,157,0,33,0,57,255,93,0,33,0,65,0,5,0,33,0,67, -255,236,0,33,0,68,255,229,0,33,0,69,255,232,0,33,0,71,255,240,0,33,0,79,255, -232,0,33,0,81,255,240,0,33,0,83,0,3,0,33,0,84,255,192,0,33,0,85,255,233,0,33, -0,86,255,173,0,33,0,87,255,188,0,33,0,90,0,24,0,33,1,8,255,120,0,33,1,12,255, -120,0,33,1,66,255,236,0,33,1,70,255,233,0,33,1,78,255,233,0,33,1,80,255,236,0, -33,1,83,255,139,0,33,1,84,255,225,0,33,1,85,255,152,0,33,1,86,255,185,0,33,1, -88,255,133,0,34,0,57,255,93,0,34,0,65,0,10,0,34,0,73,255,252,0,34,0,76,255, -252,0,34,0,79,0,6,0,34,0,82,0,2,0,34,0,85,0,5,0,34,0,89,0,4,0,35,0,35,255,250, -0,35,0,39,255,250,0,35,0,47,255,247,0,35,0,49,255,250,0,35,0,73,255,244,0,35, -0,82,255,250,0,35,0,85,255,250,0,35,0,89,0,11,0,35,0,90,255,247,0,35,1,66,255, -250,0,35,1,70,255,249,0,35,1,78,255,249,0,35,1,80,255,250,0,36,0,54,255,213,0, -36,0,55,255,230,0,36,0,65,255,253,0,36,0,69,0,4,0,36,0,79,0,4,0,36,0,85,0,4,0, -37,0,54,0,17,0,37,0,55,0,16,0,37,0,57,0,18,0,37,0,66,255,245,0,37,0,67,255, -218,0,37,0,68,255,213,0,37,0,69,255,217,0,37,0,70,255,219,0,37,0,71,255,222,0, -37,0,73,255,246,0,37,0,74,255,249,0,37,0,75,255,248,0,37,0,76,255,246,0,37,0, -77,255,238,0,37,0,78,255,238,0,37,0,79,255,217,0,37,0,80,255,242,0,37,0,81, -255,222,0,37,0,82,255,240,0,37,0,84,255,212,0,37,0,85,255,222,0,37,0,86,255, -203,0,37,0,87,255,210,0,37,0,88,0,5,0,37,0,89,255,207,0,37,0,90,0,6,0,37,1,85, -255,224,0,37,1,86,255,218,0,37,1,88,255,223,0,38,0,12,254,205,0,38,0,14,254, -205,0,38,0,33,255,135,0,38,0,65,255,187,0,38,0,69,255,212,0,38,0,73,255,249,0, -38,0,76,255,247,0,38,0,79,255,212,0,38,0,82,255,203,0,38,0,85,255,210,0,38,0, -89,255,206,0,38,1,63,255,124,0,39,0,65,0,1,0,39,0,69,0,4,0,39,0,78,255,255,0, -39,0,79,0,1,0,39,0,82,0,2,0,39,0,85,0,1,0,39,0,89,0,1,0,40,0,65,255,250,0,40, -0,69,255,246,0,40,0,79,255,246,0,40,0,85,255,247,0,40,0,89,255,253,0,41,0,65, -255,248,0,41,0,67,255,248,0,41,0,68,255,238,0,41,0,70,255,244,0,41,0,71,255, -248,0,41,0,77,255,248,0,41,0,78,255,248,0,41,0,79,255,244,0,41,0,80,255,252,0, -41,0,82,255,248,0,41,0,83,255,248,0,41,0,84,255,247,0,41,0,85,255,248,0,41,0, -86,255,250,0,41,0,87,255,252,0,41,0,89,255,250,0,42,0,65,255,247,0,42,0,79, -255,247,0,43,0,35,255,200,0,43,0,39,255,196,0,43,0,47,255,193,0,43,0,49,255, -196,0,43,0,65,255,246,0,43,0,69,255,202,0,43,0,73,255,247,0,43,0,79,255,201,0, -43,0,82,255,248,0,43,0,85,255,208,0,43,0,87,255,177,0,43,0,89,255,175,0,43,1, -66,255,207,0,43,1,70,255,203,0,43,1,78,255,204,0,43,1,80,255,204,0,44,0,33,0, -39,0,44,0,35,255,213,0,44,0,39,255,209,0,44,0,47,255,205,0,44,0,49,255,209,0, -44,0,52,255,100,0,44,0,53,255,206,0,44,0,54,255,71,0,44,0,55,255,147,0,44,0, -57,255,79,0,44,0,74,255,254,0,44,0,85,255,227,0,44,0,87,255,170,0,44,0,89,255, -147,0,44,1,8,254,233,0,44,1,12,254,230,0,44,1,63,0,38,0,44,1,66,255,229,0,44, -1,70,255,225,0,44,1,78,255,227,0,44,1,80,255,227,0,44,1,83,255,118,0,44,1,84, -255,220,0,44,1,85,255,109,0,44,1,86,255,172,0,44,1,88,255,106,0,45,0,65,255, -249,0,45,0,69,255,245,0,45,0,74,255,248,0,45,0,78,255,249,0,45,0,79,255,245,0, -45,0,85,255,249,0,45,0,89,255,252,0,46,0,69,255,247,0,46,0,79,255,247,0,46,0, -89,255,253,0,47,0,33,255,214,0,47,0,52,255,201,0,47,0,54,255,211,0,47,0,55, -255,233,0,47,0,56,255,210,0,47,0,57,255,198,0,47,0,67,0,2,0,47,0,68,255,252,0, -47,0,69,0,2,0,47,0,70,0,1,0,47,0,71,0,2,0,47,0,74,255,245,0,47,0,79,0,2,0,47, -0,80,255,255,0,47,0,81,0,5,0,47,0,83,255,255,0,47,0,84,0,4,0,47,0,85,0,2,0,47, -0,88,255,244,0,47,0,89,0,7,0,47,0,90,255,241,0,47,1,63,255,215,0,47,1,85,255, -254,0,47,1,86,255,255,0,47,1,87,255,233,0,48,0,12,254,176,0,48,0,14,254,176,0, -48,0,33,255,146,0,48,0,37,255,250,0,48,0,40,255,250,0,48,0,41,255,250,0,48,0, -65,255,234,0,48,0,69,255,230,0,48,0,72,255,254,0,48,0,73,255,248,0,48,0,76, -255,250,0,48,0,78,255,250,0,48,0,79,255,230,0,48,0,82,255,252,0,48,0,83,255, -244,0,48,0,84,0,29,0,48,0,89,0,31,0,48,1,63,255,138,0,48,1,68,255,253,0,48,1, -71,255,253,0,48,1,72,255,253,0,49,0,33,0,28,0,49,0,52,255,188,0,49,0,53,255, -242,0,49,0,54,255,199,0,49,0,55,255,216,0,49,0,56,0,24,0,49,0,57,255,185,0,49, -0,65,255,255,0,49,0,85,255,252,0,49,1,63,0,28,0,49,1,83,255,244,0,49,1,84,255, -249,0,49,1,85,255,240,0,49,1,86,255,244,0,49,1,87,0,13,0,49,1,88,255,238,0,50, -0,35,255,245,0,50,0,39,255,245,0,50,0,47,255,242,0,50,0,49,255,245,0,50,0,52, -255,215,0,50,0,53,255,242,0,50,0,54,255,217,0,50,0,55,255,226,0,50,0,57,255, -158,0,50,0,65,255,252,0,50,0,69,255,241,0,50,0,79,255,241,0,50,0,85,255,248,0, -50,0,89,255,254,0,50,1,66,255,246,0,50,1,70,255,245,0,50,1,78,255,245,0,50,1, -80,255,245,0,50,1,83,255,253,0,50,1,84,255,245,0,50,1,86,255,248,0,51,0,65,0, -1,0,51,0,69,255,253,0,51,0,74,255,247,0,51,0,77,255,250,0,51,0,78,255,250,0, -51,0,79,255,253,0,51,0,80,255,254,0,51,0,81,255,255,0,51,0,85,255,254,0,51,0, -87,0,6,0,51,0,89,0,5,0,52,0,12,255,92,0,52,0,13,255,96,0,52,0,14,255,92,0,52, -0,26,255,102,0,52,0,27,255,100,0,52,0,33,255,94,0,52,0,35,255,204,0,52,0,39, -255,200,0,52,0,47,255,199,0,52,0,49,255,202,0,52,0,51,255,223,0,52,0,52,0,32, -0,52,0,54,0,32,0,52,0,55,0,31,0,52,0,56,0,21,0,52,0,57,0,33,0,52,0,65,255,97, -0,52,0,69,255,94,0,52,0,73,255,249,0,52,0,77,255,122,0,52,0,79,255,94,0,52,0, -82,255,122,0,52,0,83,255,101,0,52,0,85,255,122,0,52,0,87,255,159,0,52,0,89, -255,156,0,52,0,90,255,133,0,52,1,8,0,7,0,52,1,63,255,91,0,52,1,66,255,110,0, -52,1,70,255,110,0,52,1,78,255,110,0,52,1,80,255,110,0,52,1,82,255,117,0,52,1, -83,255,225,0,52,1,85,255,235,0,52,1,86,255,225,0,52,1,87,255,218,0,52,1,88, -255,236,0,53,0,33,255,211,0,53,0,68,255,240,0,53,0,70,255,252,0,53,0,71,255, -248,0,53,0,77,255,248,0,53,0,78,255,248,0,53,0,80,255,248,0,53,0,82,255,248,0, -53,0,83,255,244,0,53,0,84,255,255,0,53,0,88,255,241,0,53,0,90,255,237,0,53,1, -63,255,212,0,54,0,9,0,40,0,54,0,12,255,76,0,54,0,13,255,181,0,54,0,14,255,81, -0,54,0,26,255,193,0,54,0,27,255,193,0,54,0,33,255,103,0,54,0,35,255,213,0,54, -0,39,255,213,0,54,0,47,255,210,0,54,0,49,255,213,0,54,0,61,0,34,0,54,0,65,255, -161,0,54,0,69,255,165,0,54,0,79,255,161,0,54,0,82,255,194,0,54,0,85,255,198,0, -54,0,89,255,234,0,54,0,93,0,38,0,54,1,8,0,12,0,54,1,12,0,12,0,54,1,63,255,100, -0,54,1,66,255,177,0,54,1,70,255,177,0,54,1,78,255,177,0,54,1,80,255,177,0,55, -0,9,0,31,0,55,0,12,255,138,0,55,0,13,255,213,0,55,0,14,255,138,0,55,0,26,255, -212,0,55,0,27,255,211,0,55,0,33,255,147,0,55,0,35,255,228,0,55,0,39,255,228,0, -55,0,47,255,225,0,55,0,49,255,228,0,55,0,52,0,29,0,55,0,61,0,25,0,55,0,65,255, -189,0,55,0,69,255,193,0,55,0,79,255,193,0,55,0,82,255,213,0,55,0,85,255,217,0, -55,0,89,255,247,0,55,0,93,0,29,0,55,1,8,0,9,0,55,1,12,0,9,0,55,1,63,255,148,0, -55,1,66,255,209,0,55,1,70,255,205,0,55,1,78,255,205,0,55,1,80,255,205,0,55,1, -83,255,254,0,56,0,35,255,209,0,56,0,39,255,209,0,56,0,47,255,205,0,56,0,49, -255,209,0,56,0,69,255,203,0,56,0,85,255,212,0,56,0,89,255,192,0,56,1,8,255, -249,0,56,1,66,255,209,0,56,1,70,255,205,0,56,1,78,255,205,0,56,1,80,255,208,0, -57,0,9,0,41,0,57,0,12,255,69,0,57,0,13,255,150,0,57,0,14,255,69,0,57,0,26,255, -167,0,57,0,27,255,168,0,57,0,33,255,88,0,57,0,35,255,202,0,57,0,39,255,200,0, -57,0,47,255,196,0,57,0,49,255,200,0,57,0,52,0,34,0,57,0,54,0,36,0,57,0,55,0, -34,0,57,0,56,0,27,0,57,0,57,0,37,0,57,0,61,0,37,0,57,0,65,255,127,0,57,0,69, -255,122,0,57,0,79,255,122,0,57,0,81,255,131,0,57,0,84,255,210,0,57,0,85,255, -176,0,57,0,86,255,216,0,57,0,93,0,39,0,57,1,63,255,81,0,57,1,66,255,151,0,57, -1,70,255,147,0,57,1,78,255,147,0,57,1,80,255,147,0,57,1,83,255,230,0,57,1,85, -255,238,0,57,1,86,255,230,0,57,1,87,255,222,0,57,1,88,255,239,0,58,0,33,0,27, -0,58,0,35,255,209,0,58,0,39,255,205,0,58,0,47,255,202,0,58,0,49,255,205,0,58, -0,65,255,254,0,58,0,69,255,213,0,58,0,73,255,247,0,58,0,79,255,212,0,58,0,85, -255,218,0,58,0,87,255,200,0,58,0,89,255,201,0,58,1,63,0,27,0,58,1,66,255,218, -0,58,1,70,255,214,0,58,1,78,255,216,0,58,1,80,255,216,0,59,0,42,255,219,0,65, -1,8,255,225,0,65,1,12,255,225,0,66,0,86,255,233,0,66,0,87,255,240,0,66,0,89, -255,233,0,66,1,8,255,197,0,66,1,12,255,197,0,67,1,8,255,246,0,67,1,12,255,246, -0,68,1,8,255,247,0,68,1,12,255,247,0,69,0,89,255,230,0,69,1,8,255,227,0,69,1, -12,255,227,0,70,0,7,0,32,0,70,0,9,0,41,0,70,0,61,0,37,0,70,0,71,255,207,0,70, -0,93,0,39,0,70,1,8,0,32,0,70,1,12,0,32,0,70,3,177,0,28,0,71,1,8,255,247,0,71, -1,12,255,247,0,72,1,8,255,198,0,72,1,12,255,198,0,73,1,8,255,249,0,73,1,12, -255,249,0,75,0,69,255,215,0,76,1,8,255,245,0,76,1,12,255,245,0,77,1,8,255,220, -0,77,1,12,255,220,0,78,1,8,255,227,0,78,1,12,255,227,0,79,0,86,255,226,0,79,0, -87,255,237,0,79,0,88,255,214,0,79,0,89,255,226,0,79,1,8,255,216,0,79,1,12,255, -216,0,80,0,87,255,240,0,80,1,8,255,223,0,80,1,12,255,223,0,82,0,12,255,126,0, -82,0,14,255,126,0,82,0,67,255,218,0,82,0,68,255,220,0,82,0,69,255,218,0,82,0, -70,0,31,0,82,0,75,0,1,0,82,0,79,255,216,0,82,0,81,255,221,0,82,0,84,0,34,0,82, -0,85,0,1,0,82,0,86,0,36,0,82,0,87,0,35,0,82,0,88,0,18,0,82,0,89,0,36,0,82,0, -90,0,10,0,82,1,8,0,32,0,82,1,12,0,32,0,83,1,8,255,247,0,83,1,12,255,247,0,84, -1,8,255,249,0,84,1,12,255,249,0,85,1,8,255,248,0,85,1,12,255,248,0,86,0,12, -255,135,0,86,0,14,255,139,0,86,0,65,255,226,0,86,0,67,255,229,0,86,0,68,255, -229,0,86,0,69,255,229,0,86,0,79,255,225,0,86,0,81,255,229,0,86,1,8,0,34,0,86, -1,12,0,34,0,87,0,12,255,162,0,87,0,14,255,166,0,87,0,67,255,236,0,87,0,68,255, -236,0,87,0,69,255,232,0,87,0,81,255,236,0,88,0,67,255,215,0,88,0,68,255,219,0, -88,0,69,255,215,0,88,0,79,255,215,0,88,0,81,255,219,0,88,1,8,0,18,0,88,1,12,0, -18,0,89,0,12,255,118,0,89,0,14,255,128,0,89,0,67,255,223,0,89,0,68,255,223,0, -89,0,69,255,223,0,89,0,79,255,223,0,89,0,81,255,217,0,89,1,8,0,28,0,89,1,12,0, -28,0,90,0,67,255,223,0,90,0,68,255,226,0,90,0,69,255,223,0,90,0,79,255,223,0, -90,1,8,0,7,0,90,1,12,0,7,0,91,0,42,255,215,0,168,0,12,254,206,0,168,0,13,254, -204,0,168,0,14,254,210,0,168,0,35,255,199,0,168,0,39,255,197,0,168,0,47,255, -197,0,168,0,49,255,197,0,168,0,52,0,34,0,168,0,54,0,33,0,168,0,55,0,30,0,168, -0,57,0,33,0,168,0,105,254,208,0,168,0,120,254,210,0,168,0,127,255,195,0,168,0, -142,255,195,0,168,0,169,255,66,0,168,0,170,255,197,0,168,0,171,255,66,0,168,0, -175,255,108,0,168,0,178,254,244,0,168,0,180,254,241,0,168,0,181,255,223,0,168, -0,182,254,249,0,168,0,184,255,14,0,168,0,186,254,246,0,168,0,189,255,70,0,168, -0,190,254,237,0,168,0,191,254,240,0,168,0,192,254,231,0,168,0,193,255,92,0, -168,0,194,254,250,0,168,0,195,254,252,0,168,0,196,255,1,0,168,0,197,254,244,0, -168,1,5,254,207,0,168,1,6,254,207,0,170,0,12,255,217,0,170,0,14,255,226,0,170, -0,33,255,224,0,170,0,52,255,203,0,170,0,54,255,224,0,170,0,55,255,238,0,170,0, -56,255,216,0,170,0,57,255,206,0,170,0,58,255,219,0,170,0,125,255,206,0,170,0, -169,255,217,0,170,0,171,255,224,0,170,0,172,255,228,0,170,0,174,255,217,0,171, -0,7,255,115,0,171,0,31,255,140,0,171,0,33,0,36,0,171,0,35,255,219,0,171,0,39, -255,215,0,171,0,47,255,215,0,171,0,49,255,215,0,171,0,52,255,75,0,171,0,53, -255,212,0,171,0,54,255,113,0,171,0,55,255,156,0,171,0,57,255,85,0,171,0,67, -255,234,0,171,0,68,255,229,0,171,0,69,255,234,0,171,0,71,255,238,0,171,0,79, -255,234,0,171,0,81,255,238,0,171,0,85,255,235,0,171,0,125,0,38,0,171,0,127, -255,236,0,171,0,133,255,238,0,171,0,142,255,215,0,171,0,143,255,238,0,171,0, -169,0,38,0,171,0,170,255,215,0,171,0,175,255,202,0,171,0,176,255,156,0,171,0, -193,255,149,0,171,1,8,255,119,0,171,1,12,255,119,0,171,3,177,255,119,0,172,0, -170,255,225,0,172,0,187,0,27,0,174,0,7,255,246,0,174,0,35,255,211,0,174,0,39, -255,209,0,174,0,47,255,209,0,174,0,49,255,209,0,174,0,127,255,232,0,174,0,142, -255,205,0,174,0,170,255,209,0,174,0,175,255,151,0,174,0,187,0,36,0,174,1,8, -255,246,0,174,1,12,255,246,0,174,3,177,255,246,0,175,0,171,255,199,0,175,0, -187,255,193,0,176,0,12,255,84,0,176,0,14,255,88,0,176,0,171,255,157,0,176,0, -181,255,243,0,176,0,190,255,224,0,176,0,192,255,237,0,176,0,195,255,244,0,176, -0,197,255,240,0,178,0,187,0,34,0,180,0,7,0,32,0,180,0,70,0,29,0,180,0,181,255, -239,0,180,0,189,0,27,0,180,0,190,255,211,0,180,0,193,0,30,0,180,0,197,255,236, -0,180,1,8,0,32,0,180,1,12,0,32,0,180,3,177,0,32,0,181,0,193,255,225,0,182,0,7, -255,239,0,182,0,191,255,243,0,182,0,192,255,243,0,182,0,195,255,242,0,182,1,8, -255,244,0,182,1,12,255,244,0,182,3,177,255,240,0,183,0,178,255,209,0,183,0, -180,0,10,0,183,0,181,255,216,0,183,0,182,255,226,0,183,0,184,255,233,0,183,0, -186,255,237,0,183,0,187,0,11,0,183,0,188,255,223,0,183,0,189,0,14,0,183,0,191, -255,199,0,183,0,192,255,205,0,183,0,193,0,15,0,183,0,194,255,238,0,183,0,195, -255,219,0,183,0,196,255,239,0,183,0,197,255,217,0,184,0,7,255,217,0,184,1,8, -255,227,0,184,1,12,255,227,0,186,0,7,255,186,0,186,0,178,255,225,0,186,0,180, -255,191,0,186,0,185,255,217,0,186,0,186,255,239,0,186,0,187,0,37,0,186,0,189, -255,214,0,186,0,193,255,190,0,186,0,195,255,212,0,186,1,8,255,249,0,186,1,12, -255,249,0,186,3,177,255,184,0,187,0,7,255,58,0,187,0,70,255,209,0,187,0,180, -255,145,0,187,0,185,255,212,0,187,0,187,0,33,0,187,0,189,255,212,0,187,0,193, -255,125,0,187,1,8,255,63,0,187,1,12,255,63,0,187,3,177,255,58,0,188,0,178,255, -179,0,188,0,187,0,17,0,190,0,87,255,240,0,190,0,88,255,226,0,190,0,90,255,232, -0,190,0,193,255,215,0,190,1,8,255,223,0,190,1,12,255,223,0,192,0,180,0,17,0, -192,0,189,0,19,0,192,0,193,0,20,0,193,0,7,0,34,0,193,0,70,0,29,0,193,0,120, -255,233,0,193,0,180,0,27,0,193,0,181,255,223,0,193,0,189,0,29,0,193,0,191,255, -214,0,193,0,192,255,211,0,193,0,193,0,29,0,193,1,8,0,34,0,193,1,12,0,34,0,193, -1,63,255,122,0,193,1,66,255,220,0,193,1,70,255,216,0,193,1,78,255,218,0,193,1, -80,255,216,0,193,1,82,255,234,0,193,1,83,0,29,0,193,1,85,0,27,0,193,1,86,0,20, -0,193,1,87,0,8,0,193,1,88,0,27,0,193,3,177,0,34,0,195,0,88,255,220,0,195,0,90, -255,220,0,196,0,88,255,228,0,196,0,90,255,228,0,197,0,88,255,226,0,197,0,90, -255,226,0,197,0,180,255,234,0,198,0,7,255,170,0,198,0,198,255,185,0,198,0,202, -255,186,0,198,0,206,255,233,0,198,0,210,255,223,0,198,0,212,255,194,0,198,0, -215,255,188,0,198,0,233,255,164,0,198,0,236,255,239,0,198,0,239,255,200,0,198, -1,8,255,175,0,198,1,12,255,175,0,198,3,177,255,171,0,200,0,7,255,126,0,200,0, -202,255,67,0,200,0,206,255,232,0,200,0,209,255,243,0,200,0,210,255,220,0,200, -0,212,255,194,0,200,0,215,255,141,0,200,0,233,255,161,0,200,0,236,255,241,0, -200,0,239,255,201,0,200,1,8,255,146,0,200,1,12,255,146,0,200,3,177,255,135,0, -201,0,7,255,125,0,201,0,198,255,68,0,201,0,202,255,66,0,201,0,206,255,230,0, -201,0,210,255,219,0,201,0,212,255,193,0,201,0,215,255,140,0,201,0,233,255,159, -0,201,0,236,255,240,0,201,0,239,255,200,0,201,1,8,255,144,0,201,1,12,255,144, -0,201,3,177,255,134,0,202,0,198,255,181,0,202,0,202,255,179,0,202,0,215,255, -184,0,202,0,233,255,158,0,202,0,236,255,225,0,202,0,239,255,194,0,204,0,198, -255,206,0,204,0,210,255,225,0,204,0,212,255,202,0,204,0,215,255,208,0,204,0, -225,255,227,0,204,0,233,255,168,0,204,0,236,255,242,0,204,0,239,255,204,0,205, -0,198,255,196,0,205,0,200,0,40,0,205,0,202,255,197,0,205,0,205,0,46,0,205,0, -209,0,40,0,205,0,212,255,197,0,205,0,215,255,199,0,205,0,224,0,44,0,205,0,229, -0,40,0,205,0,236,255,196,0,205,0,247,0,40,0,205,0,253,255,213,0,206,0,13,255, -141,0,206,0,199,255,206,0,206,0,200,0,36,0,206,0,209,0,36,0,206,0,221,255,210, -0,206,0,229,0,37,0,206,0,233,255,181,0,206,0,236,255,161,0,206,0,247,0,37,0, -206,0,253,255,206,0,207,0,17,255,236,0,207,0,18,255,253,0,207,0,19,0,7,0,207, -0,20,0,15,0,207,0,21,0,4,0,207,0,22,255,253,0,207,0,23,255,228,0,207,0,24,0,5, -0,207,0,25,255,255,0,207,0,207,0,11,0,207,0,209,255,239,0,207,0,210,255,236,0, -207,0,215,255,228,0,208,0,65,255,252,0,208,0,69,255,255,0,208,0,79,255,252,0, -208,0,85,255,255,0,208,0,89,0,2,0,210,0,7,0,15,0,210,0,13,255,177,0,210,0,14, -255,135,0,210,0,67,255,229,0,210,0,68,255,229,0,210,0,69,255,229,0,210,0,79, -255,229,0,210,0,81,255,225,0,210,0,199,255,210,0,210,0,200,255,138,0,210,0, -205,255,53,0,210,0,209,255,138,0,210,0,215,0,36,0,210,0,222,255,187,0,210,0, -223,255,187,0,210,0,224,255,69,0,210,0,227,255,187,0,210,0,228,255,187,0,210, -0,229,255,116,0,210,0,230,255,187,0,210,0,231,255,187,0,210,0,232,255,187,0, -210,0,234,255,154,0,210,0,235,255,187,0,210,0,236,255,207,0,210,0,237,255,187, -0,210,0,238,255,185,0,210,0,240,255,187,0,210,0,241,255,187,0,210,0,243,255, -185,0,210,0,244,255,172,0,210,0,246,255,150,0,210,0,247,255,116,0,210,0,248, -255,187,0,210,0,250,255,187,0,210,0,254,255,153,0,210,1,8,0,31,0,210,1,12,0, -31,0,210,3,177,0,13,0,211,0,200,0,39,0,211,0,205,0,96,0,211,0,209,0,49,0,211, -0,212,255,195,0,211,0,224,0,104,0,211,0,229,0,58,0,211,0,236,255,194,0,211,0, -247,0,39,0,214,0,198,255,218,0,214,0,200,0,42,0,214,0,205,0,48,0,214,0,209,0, -42,0,214,0,210,0,22,0,214,0,212,255,218,0,214,0,215,255,219,0,214,0,218,255, -242,0,214,0,224,0,45,0,214,0,229,0,40,0,214,0,233,255,223,0,214,0,236,255,217, -0,214,0,239,255,225,0,214,0,247,0,40,0,215,0,7,255,124,0,215,0,198,255,65,0, -215,0,202,255,63,0,215,0,212,255,190,0,215,0,215,255,137,0,215,0,233,255,158, -0,215,0,239,255,198,0,215,1,8,255,139,0,215,1,12,255,139,0,215,3,177,255,133, -0,217,0,7,255,131,0,217,0,198,255,69,0,217,0,202,255,67,0,217,0,212,255,194,0, -217,0,215,255,141,0,217,0,233,255,164,0,217,0,239,255,200,0,217,1,8,255,145,0, -217,1,12,255,145,0,217,3,177,255,135,0,218,0,198,255,206,0,218,0,200,255,207, -0,218,0,202,255,205,0,218,0,205,255,202,0,218,0,206,255,207,0,218,0,209,255, -207,0,218,0,210,255,217,0,218,0,229,255,214,0,218,0,247,255,214,0,219,0,198, -255,202,0,219,0,200,255,206,0,219,0,202,255,202,0,219,0,205,255,203,0,219,0, -206,255,207,0,219,0,209,255,206,0,219,0,210,255,217,0,219,0,224,255,203,0,219, -0,229,255,214,0,219,0,247,255,214,0,220,0,35,255,250,0,220,0,39,255,250,0,220, -0,47,255,253,0,220,0,49,255,250,0,220,0,52,255,214,0,220,0,53,255,249,0,220,0, -54,255,236,0,220,0,55,255,243,0,220,0,57,255,229,0,220,0,69,255,252,0,220,0, -79,255,250,0,220,0,85,255,253,0,220,0,89,0,6,0,220,1,66,255,253,0,220,1,70, -255,249,0,220,1,78,255,249,0,220,1,80,255,249,0,220,1,83,0,1,0,220,1,84,255, -253,0,220,1,85,0,1,0,220,1,88,0,1,0,221,0,224,255,225,0,221,0,225,255,224,0, -221,0,233,255,223,0,221,0,239,255,241,0,222,0,7,255,191,0,222,0,225,255,237,0, -222,0,233,255,230,0,222,0,236,255,238,0,222,0,239,255,235,0,222,1,8,255,230,0, -222,1,12,255,230,0,222,3,177,255,190,0,223,0,224,255,132,0,223,0,229,255,171, -0,223,0,246,255,211,0,223,0,247,255,171,0,224,0,224,0,42,0,224,0,233,255,219, -0,224,0,236,255,216,0,224,0,239,255,223,0,225,0,7,0,11,0,225,0,234,255,236,0, -225,0,236,255,245,0,225,0,246,255,218,0,225,0,254,255,220,0,225,1,8,0,11,0, -225,1,12,0,11,0,225,3,177,0,11,0,226,0,7,255,232,0,226,0,233,255,237,0,226,0, -236,255,240,0,226,1,8,255,236,0,226,1,12,255,236,0,226,3,177,255,232,0,228,0, -221,255,233,0,228,0,234,255,224,0,228,0,236,255,242,0,228,0,246,255,211,0,228, -0,254,255,213,0,228,1,8,0,12,0,228,1,12,0,12,0,228,1,66,255,212,0,228,1,70, -255,208,0,228,1,78,255,212,0,228,1,80,255,212,0,233,0,7,0,34,0,233,0,70,0,29, -0,233,0,224,255,133,0,233,0,229,255,172,0,233,0,234,255,223,0,233,0,246,255, -211,0,233,0,247,255,172,0,233,0,254,255,213,0,233,1,8,0,31,0,233,1,12,0,31,0, -233,1,63,255,122,0,233,1,66,255,220,0,233,1,70,255,216,0,233,1,78,255,218,0, -233,1,80,255,216,0,233,1,82,255,234,0,233,1,83,0,29,0,233,1,85,0,27,0,233,1, -86,0,20,0,233,1,87,0,8,0,233,1,88,0,27,0,233,3,177,0,34,0,234,0,88,255,244,0, -234,0,90,255,244,0,234,0,225,255,236,0,234,0,229,255,246,0,234,0,233,255,229, -0,234,0,239,255,237,0,234,0,247,255,246,0,235,0,224,0,37,0,235,0,229,0,32,0, -235,0,233,255,222,0,235,0,236,255,220,0,235,0,239,255,224,0,235,0,247,0,32,0, -238,0,224,0,43,0,238,0,229,0,38,0,238,0,233,255,206,0,238,0,236,255,203,0,238, -0,239,255,215,0,238,0,242,255,242,0,238,0,246,255,224,0,238,0,247,0,38,0,239, -0,233,255,122,0,239,0,236,255,203,0,239,0,239,255,178,0,241,0,7,254,253,0,241, -0,233,255,118,0,241,0,236,255,202,0,241,0,239,255,174,0,241,1,8,255,35,0,241, -1,12,255,39,0,241,3,177,255,10,0,242,0,224,255,218,0,242,0,225,255,218,0,242, -0,229,255,225,0,242,0,239,255,222,0,242,0,247,255,225,0,243,0,224,255,217,0, -243,0,225,255,217,0,243,0,226,255,245,0,243,0,229,255,223,0,243,0,239,255,232, -0,246,0,7,255,240,0,246,1,8,255,244,0,246,1,12,255,244,0,246,3,177,255,240,0, -247,0,225,255,232,0,247,0,233,255,116,0,247,0,234,0,11,0,247,0,236,255,200,0, -247,0,239,255,172,0,248,0,225,255,236,0,248,0,233,255,121,0,248,0,236,255,203, -0,248,0,239,255,177,1,7,0,33,255,120,1,7,0,52,0,12,1,7,0,54,0,16,1,7,0,55,0, -18,1,7,0,57,0,9,1,7,0,65,255,225,1,7,0,67,255,217,1,7,0,68,255,197,1,7,0,69, -255,217,1,7,0,70,0,5,1,7,0,71,255,222,1,7,0,77,255,247,1,7,0,78,255,247,1,7,0, -79,255,217,1,7,0,81,255,222,1,7,0,83,255,237,1,7,0,84,0,11,1,7,0,85,255,254,1, -7,0,86,0,36,1,7,0,87,0,32,1,7,0,88,0,18,1,7,0,89,0,36,1,7,0,90,0,8,1,7,1,7, -255,241,1,8,0,68,255,172,1,8,0,77,255,243,1,8,0,82,255,247,1,8,0,83,255,216,1, -8,0,84,0,6,1,8,0,86,0,27,1,8,1,8,255,245,1,11,0,33,255,118,1,11,0,52,0,9,1,11, -0,54,0,10,1,11,0,55,0,12,1,11,0,57,0,7,1,11,0,65,255,223,1,11,0,67,255,215,1, -11,0,68,255,191,1,11,0,69,255,215,1,11,0,71,255,215,1,11,0,77,255,245,1,11,0, -78,255,245,1,11,0,79,255,211,1,11,0,80,255,249,1,11,0,81,255,219,1,11,0,82, -255,245,1,11,0,83,255,230,1,11,0,84,0,4,1,11,0,85,255,252,1,11,0,86,0,27,1,11, -0,87,0,23,1,11,0,88,0,12,1,11,0,89,0,27,1,11,0,90,0,3,1,63,1,66,255,227,1,63, -1,70,255,227,1,63,1,78,255,227,1,63,1,80,255,227,1,63,1,83,255,125,1,63,1,84, -255,216,1,63,1,85,255,139,1,63,1,86,255,175,1,63,1,88,255,123,1,66,1,66,255, -254,1,66,1,70,255,254,1,66,1,78,255,254,1,66,1,80,255,254,1,67,1,85,255,220,1, -67,1,86,255,234,1,68,1,85,0,4,1,68,1,88,0,4,1,69,1,63,255,162,1,74,1,66,255, -212,1,74,1,70,255,208,1,74,1,78,255,212,1,74,1,80,255,212,1,75,1,63,0,35,1,75, -1,66,255,224,1,75,1,70,255,220,1,75,1,78,255,222,1,75,1,80,255,223,1,75,1,83, -255,115,1,75,1,84,255,215,1,75,1,85,255,107,1,75,1,86,255,167,1,75,1,88,255, -101,1,78,1,63,255,229,1,78,1,83,255,219,1,78,1,85,255,225,1,78,1,86,255,239,1, -78,1,87,255,215,1,78,1,88,255,211,1,79,1,63,255,168,1,79,1,68,255,245,1,79,1, -71,255,245,1,79,1,72,255,245,1,80,1,63,0,13,1,80,1,83,255,208,1,80,1,84,255, -246,1,80,1,85,255,213,1,80,1,86,255,226,1,80,1,88,255,201,1,81,1,66,255,252,1, -81,1,70,255,252,1,81,1,78,255,252,1,81,1,80,255,252,1,81,1,83,255,228,1,81,1, -84,255,245,1,81,1,85,255,226,1,81,1,86,255,233,1,81,1,88,255,219,1,83,1,63, -255,122,1,83,1,66,255,220,1,83,1,70,255,216,1,83,1,78,255,218,1,83,1,80,255, -216,1,83,1,82,255,234,1,83,1,83,0,29,1,83,1,85,0,27,1,83,1,86,0,20,1,83,1,87, -0,8,1,83,1,88,0,27,1,84,1,63,255,221,1,85,1,63,255,140,1,85,1,66,255,228,1,85, -1,70,255,224,1,85,1,78,255,224,1,85,1,80,255,224,1,86,1,63,255,182,1,86,1,66, -255,239,1,86,1,70,255,239,1,86,1,78,255,239,1,86,1,80,255,239,1,86,1,83,0,28, -1,87,1,66,255,218,1,87,1,70,255,214,1,87,1,78,255,214,1,87,1,80,255,214,1,88, -1,63,255,124,1,88,1,66,255,217,1,88,1,70,255,213,1,88,1,78,255,213,1,88,1,80, -255,213,1,88,1,83,0,31,1,88,1,85,0,33,1,88,1,86,0,27,1,88,1,87,0,14,1,88,1,88, -0,33,1,89,1,63,0,25,1,89,1,66,255,224,1,89,1,70,255,224,1,89,1,78,255,224,1, -89,1,80,255,224,1,111,0,9,0,40,1,111,0,12,255,76,1,111,0,13,255,181,1,111,0, -14,255,81,1,111,0,26,255,193,1,111,0,27,255,193,1,111,0,33,255,103,1,111,0,35, -255,213,1,111,0,39,255,213,1,111,0,47,255,210,1,111,0,49,255,213,1,111,0,61,0, -34,1,111,0,65,255,161,1,111,0,69,255,165,1,111,0,79,255,161,1,111,0,82,255, -194,1,111,0,85,255,198,1,111,0,89,255,234,1,111,0,93,0,38,1,111,1,8,0,12,1, -111,1,12,0,12,1,111,1,63,255,100,1,111,1,66,255,177,1,111,1,70,255,177,1,111, -1,78,255,177,1,111,1,80,255,177,1,112,0,12,255,135,1,112,0,14,255,139,1,112,0, -65,255,226,1,112,0,67,255,229,1,112,0,68,255,229,1,112,0,69,255,229,1,112,0, -79,255,225,1,112,0,81,255,229,1,112,1,8,0,34,1,112,1,12,0,34,1,113,0,35,255, -253,1,113,0,39,255,253,1,113,0,47,255,254,1,113,0,49,255,253,1,113,0,65,0,8,1, -113,0,73,255,247,1,113,0,82,255,255,1,113,0,85,255,252,1,113,0,89,0,16,1,113, -0,90,0,2,1,114,1,8,255,234,1,114,1,12,255,234,1,137,0,65,255,250,1,137,0,69, -255,246,1,137,0,79,255,246,1,137,0,85,255,247,1,137,0,89,255,253,1,141,0,35, -255,250,1,141,0,39,255,250,1,141,0,47,255,247,1,141,0,49,255,250,1,141,0,73, -255,244,1,141,0,82,255,250,1,141,0,85,255,250,1,141,0,89,0,11,1,141,0,90,255, -247,1,141,1,66,255,250,1,141,1,70,255,249,1,141,1,78,255,249,1,141,1,80,255, -250,1,142,1,8,255,246,1,142,1,12,255,246,0,0,0,0,0,22,1,14,0,1,0,0,0,0,0,0,0, -31,0,0,0,1,0,0,0,0,0,1,0,6,0,31,0,1,0,0,0,0,0,2,0,7,0,37,0,1,0,0,0,0,0,3,0,18, -0,44,0,1,0,0,0,0,0,4,0,14,0,62,0,1,0,0,0,0,0,5,0,21,0,76,0,1,0,0,0,0,0,6,0,14, -0,97,0,1,0,0,0,0,0,7,0,32,0,111,0,1,0,0,0,0,0,9,0,6,0,143,0,1,0,0,0,0,0,11,0, -10,0,149,0,1,0,0,0,0,0,12,0,19,0,159,0,3,0,1,4,9,0,0,0,62,0,178,0,3,0,1,4,9,0, -1,0,12,0,240,0,3,0,1,4,9,0,2,0,14,0,252,0,3,0,1,4,9,0,3,0,36,1,10,0,3,0,1,4,9, -0,4,0,28,1,46,0,3,0,1,4,9,0,5,0,42,1,74,0,3,0,1,4,9,0,6,0,28,1,116,0,3,0,1,4, -9,0,7,0,64,1,144,0,3,0,1,4,9,0,9,0,12,1,208,0,3,0,1,4,9,0,11,0,20,1,220,0,3,0, -1,4,9,0,12,0,38,1,240,70,111,110,116,32,100,97,116,97,32,99,111,112,121,114, -105,103,104,116,32,71,111,111,103,108,101,32,50,48,49,49,82,111,98,111,116, -111,82,101,103,117,108,97,114,71,111,111,103,108,101,58,82,111,98,111,116,111, -58,50,48,49,49,82,111,98,111,116,111,32,82,101,103,117,108,97,114,86,101,114, -115,105,111,110,32,49,46,48,48,48,48,48,59,32,50,48,49,49,82,111,98,111,116, -111,45,82,101,103,117,108,97,114,82,111,98,111,116,111,32,105,115,32,97,32, -116,114,97,100,101,109,97,114,107,32,111,102,32,71,111,111,103,108,101,46,71, -111,111,103,108,101,71,111,111,103,108,101,46,99,111,109,67,104,114,105,115, -116,105,97,110,32,82,111,98,101,114,116,115,111,110,0,70,0,111,0,110,0,116,0, -32,0,100,0,97,0,116,0,97,0,32,0,99,0,111,0,112,0,121,0,114,0,105,0,103,0,104, -0,116,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,32,0,50,0,48,0,49,0,49,0,82,0, -111,0,98,0,111,0,116,0,111,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,71,0,111, -0,111,0,103,0,108,0,101,0,58,0,82,0,111,0,98,0,111,0,116,0,111,0,58,0,50,0,48, -0,49,0,49,0,82,0,111,0,98,0,111,0,116,0,111,0,32,0,82,0,101,0,103,0,117,0,108, -0,97,0,114,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,48, -0,48,0,48,0,48,0,59,0,32,0,50,0,48,0,49,0,49,0,82,0,111,0,98,0,111,0,116,0, -111,0,45,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,82,0,111,0,98,0,111,0,116, -0,111,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97, -0,114,0,107,0,32,0,111,0,102,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,46,0, -71,0,111,0,111,0,103,0,108,0,101,0,71,0,111,0,111,0,103,0,108,0,101,0,46,0,99, -0,111,0,109,0,67,0,104,0,114,0,105,0,115,0,116,0,105,0,97,0,110,0,32,0,82,0, -111,0,98,0,101,0,114,0,116,0,115,0,111,0,110,0,2,0,0,0,0,0,0,255,106,0,100,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,178,0,0,1,2,0,2,0,3,0,7,0,8,0,9,0,10, -0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0, -26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41, -0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0, -57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72, -0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0, -88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0,132,0,133,0,189,0,150, -0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,1,3,0,131,0,147,0,242,0,243,0, -141,0,151,0,136,1,4,0,222,0,241,0,158,0,170,0,245,0,244,0,246,0,162,0,144,0, -240,0,145,0,237,0,137,0,160,0,234,0,184,0,161,0,238,1,5,0,215,1,6,0,226,0,227, -1,7,1,8,0,176,0,177,1,9,1,10,0,166,1,11,1,12,1,13,1,14,1,15,0,216,0,225,0,219, -0,220,0,221,0,224,0,217,0,223,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1, -25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,0,159,1,33,1,34,1,35,1,36,1,37,1,38,1, -39,1,40,1,41,1,42,1,43,0,155,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1, -53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68, -1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1, -84,1,85,1,86,1,87,1,88,1,89,1,90,1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99, -1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112, -1,113,1,114,0,178,0,179,0,182,0,183,0,196,1,115,0,180,0,181,0,197,0,130,0,194, -0,135,0,171,0,198,0,190,0,191,0,188,1,116,1,117,1,118,0,140,1,119,1,120,1,121, -1,122,0,152,0,154,0,153,0,239,0,165,0,146,0,156,0,143,0,148,0,149,1,123,1,124, -1,125,1,126,1,127,1,128,1,129,1,130,1,131,1,132,1,133,1,134,1,135,1,136,1,137, -1,138,1,139,1,140,1,141,1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150, -1,151,1,152,1,153,1,154,1,155,1,156,1,157,1,158,1,159,1,160,1,161,1,162,1,163, -1,164,1,165,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,1,176, -1,177,1,178,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,189, -1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,201,1,202, -1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,1,214,1,215, -1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,226,1,227,1,228, -1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,0,185,1,238,1,239,1,240, -1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,251,1,252,1,253, -1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14, -2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,2,26,2,27,2,28,2,29,2, -30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,0,172,2,38,0,233,2,39,2,40,2,41,0,173,0, -201,0,199,0,174,0,98,0,99,2,42,0,100,0,203,0,101,0,200,0,202,0,207,0,204,0, -205,0,206,0,102,0,211,0,208,0,209,0,175,0,103,0,214,0,212,0,213,0,104,0,235,0, -106,0,105,0,107,0,109,0,108,0,110,2,43,0,111,0,113,0,112,0,114,0,115,0,117,0, -116,0,118,0,119,0,120,0,122,0,121,0,123,0,125,0,124,0,127,0,126,0,128,0,129,0, -236,0,186,2,44,2,45,2,46,2,47,2,48,2,49,0,253,0,254,2,50,2,51,2,52,2,53,0,255, -1,0,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,64,2,65,2,66,2,67,0, -248,0,249,2,68,2,69,2,70,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,2, -81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,2,96, -2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,2,109,2, -110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,0,251,0,252,0,228,0, -229,2,120,2,121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,2, -132,2,133,2,134,2,135,2,136,2,137,2,138,2,139,0,187,2,140,2,141,2,142,2,143,0, -230,0,231,2,144,2,145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2, -155,2,156,2,157,2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,2, -168,2,169,2,170,2,171,2,172,2,173,2,174,2,175,2,176,2,177,2,178,2,179,2,180,2, -181,2,182,2,183,2,184,2,185,2,186,2,187,2,188,2,189,2,190,2,191,2,192,2,193,2, -194,2,195,2,196,2,197,2,198,2,199,2,200,2,201,2,202,2,203,2,204,2,205,2,206,2, -207,2,208,2,209,2,210,2,211,2,212,2,213,2,214,2,215,2,216,2,217,2,218,2,219,2, -220,2,221,2,222,2,223,2,224,2,225,2,226,2,227,2,228,2,229,2,230,2,231,2,232,2, -233,2,234,2,235,2,236,2,237,2,238,2,239,2,240,2,241,2,242,2,243,2,244,2,245,2, -246,2,247,2,248,2,249,2,250,2,251,2,252,2,253,2,254,2,255,3,0,3,1,3,2,3,3,3,4, -3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3,16,3,17,3,18,3,19,3,20,3, -21,3,22,3,23,3,24,3,25,3,26,3,27,3,28,3,29,3,30,3,31,3,32,3,33,3,34,3,35,3,36, -3,37,3,38,3,39,3,40,3,41,3,42,3,43,3,44,3,45,3,46,3,47,3,48,3,49,3,50,3,51,3, -52,3,53,3,54,3,55,3,56,3,57,3,58,3,59,3,60,3,61,3,62,3,63,3,64,3,65,3,66,3,67, -3,68,3,69,3,70,3,71,3,72,3,73,3,74,3,75,3,76,3,77,3,78,3,79,3,80,3,81,3,82,3, -83,3,84,3,85,3,86,3,87,3,88,3,89,3,90,3,91,3,92,3,93,3,94,3,95,3,96,3,97,3,98, -3,99,3,100,3,101,3,102,3,103,3,104,3,105,3,106,3,107,3,108,3,109,3,110,3,111, -3,112,3,113,3,114,3,115,3,116,3,117,3,118,3,119,3,120,3,121,3,122,3,123,3,124, -3,125,3,126,3,127,3,128,3,129,3,130,3,131,3,132,3,133,3,134,3,135,3,136,3,137, -3,138,3,139,3,140,3,141,3,142,3,143,3,144,3,145,3,146,3,147,3,148,3,149,3,150, -3,151,3,152,3,153,3,154,3,155,3,156,3,157,3,158,3,159,3,160,3,161,3,162,3,163, -3,164,3,165,3,166,3,167,3,168,3,169,3,170,3,171,3,172,3,173,3,174,3,175,3,176, -3,177,3,178,3,179,3,180,3,181,3,182,3,183,3,184,3,185,3,186,0,247,3,187,0,6,0, -4,0,5,5,46,110,117,108,108,6,109,97,99,114,111,110,14,112,101,114,105,111,100, -99,101,110,116,101,114,101,100,4,72,98,97,114,12,107,103,114,101,101,110,108, -97,110,100,105,99,3,69,110,103,3,101,110,103,4,116,98,97,114,5,108,111,110, -103,115,5,79,104,111,114,110,5,111,104,111,114,110,5,85,104,111,114,110,5,117, -104,111,114,110,7,117,110,105,48,50,51,55,7,117,110,105,48,50,70,51,9,103,114, -97,118,101,99,111,109,98,9,97,99,117,116,101,99,111,109,98,9,116,105,108,100, -101,99,111,109,98,7,117,110,105,48,51,48,70,5,116,111,110,111,115,13,100,105, -101,114,101,115,105,115,116,111,110,111,115,9,97,110,111,116,101,108,101,105, -97,5,71,97,109,109,97,5,68,101,108,116,97,5,84,104,101,116,97,6,76,97,109,98, -100,97,2,88,105,2,80,105,5,83,105,103,109,97,3,80,104,105,3,80,115,105,5,97, -108,112,104,97,4,98,101,116,97,5,103,97,109,109,97,5,100,101,108,116,97,7,101, -112,115,105,108,111,110,4,122,101,116,97,3,101,116,97,5,116,104,101,116,97,4, -105,111,116,97,6,108,97,109,98,100,97,2,120,105,3,114,104,111,6,115,105,103, -109,97,49,5,115,105,103,109,97,3,116,97,117,7,117,112,115,105,108,111,110,3, -112,104,105,3,112,115,105,5,111,109,101,103,97,7,117,110,105,48,52,48,50,7, -117,110,105,48,52,48,52,7,117,110,105,48,52,48,57,7,117,110,105,48,52,48,65,7, -117,110,105,48,52,48,66,7,117,110,105,48,52,48,70,7,117,110,105,48,52,49,49,7, -117,110,105,48,52,49,52,7,117,110,105,48,52,49,54,7,117,110,105,48,52,49,55,7, -117,110,105,48,52,49,56,7,117,110,105,48,52,49,66,7,117,110,105,48,52,50,51,7, -117,110,105,48,52,50,54,7,117,110,105,48,52,50,55,7,117,110,105,48,52,50,56,7, -117,110,105,48,52,50,57,7,117,110,105,48,52,50,65,7,117,110,105,48,52,50,66,7, -117,110,105,48,52,50,67,7,117,110,105,48,52,50,68,7,117,110,105,48,52,50,69,7, -117,110,105,48,52,50,70,7,117,110,105,48,52,51,49,7,117,110,105,48,52,51,50,7, -117,110,105,48,52,51,51,7,117,110,105,48,52,51,52,7,117,110,105,48,52,51,54,7, -117,110,105,48,52,51,55,7,117,110,105,48,52,51,56,7,117,110,105,48,52,51,65,7, -117,110,105,48,52,51,66,7,117,110,105,48,52,51,67,7,117,110,105,48,52,51,68,7, -117,110,105,48,52,51,70,7,117,110,105,48,52,52,50,7,117,110,105,48,52,52,52,7, -117,110,105,48,52,52,54,7,117,110,105,48,52,52,55,7,117,110,105,48,52,52,56,7, -117,110,105,48,52,52,57,7,117,110,105,48,52,52,65,7,117,110,105,48,52,52,66,7, -117,110,105,48,52,52,67,7,117,110,105,48,52,52,68,7,117,110,105,48,52,52,69,7, -117,110,105,48,52,52,70,7,117,110,105,48,52,53,50,7,117,110,105,48,52,53,52,7, -117,110,105,48,52,53,57,7,117,110,105,48,52,53,65,7,117,110,105,48,52,53,66,7, -117,110,105,48,52,53,70,7,117,110,105,48,52,54,48,7,117,110,105,48,52,54,49,7, -117,110,105,48,52,55,50,7,117,110,105,48,52,55,51,7,117,110,105,48,52,56,51,7, -117,110,105,48,52,56,52,7,117,110,105,48,52,56,53,7,117,110,105,48,52,56,54,7, -117,110,105,48,52,69,48,7,117,110,105,48,52,69,49,13,113,117,111,116,101,114, -101,118,101,114,115,101,100,7,117,110,105,50,48,55,52,4,108,105,114,97,4,69, -117,114,111,9,111,110,101,101,105,103,104,116,104,12,116,104,114,101,101,101, -105,103,104,116,104,115,11,102,105,118,101,101,105,103,104,116,104,115,12,115, -101,118,101,110,101,105,103,104,116,104,115,8,100,111,116,98,101,108,111,119, -4,104,111,111,107,19,99,105,114,99,117,109,102,108,101,120,97,99,117,116,101, -99,111,109,98,19,99,105,114,99,117,109,102,108,101,120,103,114,97,118,101,99, -111,109,98,18,99,105,114,99,117,109,102,108,101,120,104,111,111,107,99,111, -109,98,19,99,105,114,99,117,109,102,108,101,120,116,105,108,100,101,99,111, -109,98,14,98,114,101,118,101,97,99,117,116,101,99,111,109,98,13,98,114,101, -118,101,104,111,111,107,99,111,109,98,14,98,114,101,118,101,116,105,108,100, -101,99,111,109,98,11,99,121,114,105,108,108,105,99,116,105,99,16,99,121,114, -105,108,108,105,99,104,111,111,107,108,101,102,116,12,99,121,114,105,108,108, -105,99,104,111,111,107,14,108,97,114,103,101,114,105,103,104,116,104,111,111, -107,8,111,110,101,46,108,110,117,109,8,116,119,111,46,108,110,117,109,10,116, -104,114,101,101,46,108,110,117,109,9,102,111,117,114,46,108,110,117,109,9,102, -105,118,101,46,108,110,117,109,8,115,105,120,46,108,110,117,109,10,115,101, -118,101,110,46,108,110,117,109,10,101,105,103,104,116,46,108,110,117,109,9, -110,105,110,101,46,108,110,117,109,9,122,101,114,111,46,108,110,117,109,6,65, -46,115,109,99,112,14,98,114,101,118,101,103,114,97,118,101,99,111,109,98,6,66, -46,115,109,99,112,6,67,46,115,109,99,112,6,68,46,115,109,99,112,6,69,46,115, -109,99,112,6,70,46,115,109,99,112,6,71,46,115,109,99,112,6,72,46,115,109,99, -112,6,73,46,115,109,99,112,6,74,46,115,109,99,112,6,75,46,115,109,99,112,6,76, -46,115,109,99,112,6,77,46,115,109,99,112,6,78,46,115,109,99,112,6,79,46,115, -109,99,112,6,80,46,115,109,99,112,6,81,46,115,109,99,112,6,82,46,115,109,99, -112,6,83,46,115,109,99,112,6,84,46,115,109,99,112,6,85,46,115,109,99,112,6,86, -46,115,109,99,112,6,87,46,115,109,99,112,6,88,46,115,109,99,112,6,89,46,115, -109,99,112,6,90,46,115,109,99,112,9,122,101,114,111,46,115,109,99,112,8,111, -110,101,46,115,109,99,112,8,116,119,111,46,115,109,99,112,10,116,104,114,101, -101,46,115,109,99,112,9,102,111,117,114,46,115,109,99,112,9,102,105,118,101, -46,115,109,99,112,8,115,105,120,46,115,109,99,112,10,115,101,118,101,110,46, -115,109,99,112,10,101,105,103,104,116,46,115,109,99,112,9,110,105,110,101,46, -115,109,99,112,8,122,101,114,111,46,115,117,112,7,111,110,101,46,115,117,112, -7,116,119,111,46,115,117,112,9,116,104,114,101,101,46,115,117,112,8,102,111, -117,114,46,115,117,112,8,102,105,118,101,46,115,117,112,7,115,105,120,46,115, -117,112,9,115,101,118,101,110,46,115,117,112,9,101,105,103,104,116,46,115,117, -112,8,110,105,110,101,46,115,117,112,11,99,111,109,109,97,97,99,99,101,110, -116,7,117,110,105,48,52,55,52,7,117,110,105,48,52,55,53,7,117,110,105,48,52, -56,48,7,117,110,105,48,52,56,49,7,117,110,105,48,52,67,51,7,117,110,105,48,52, -67,52,7,117,110,105,48,52,57,52,7,117,110,105,48,52,57,53,7,117,110,105,48,52, -65,54,7,117,110,105,48,52,65,55,7,117,110,105,48,52,68,56,7,117,110,105,48,52, -68,57,7,117,110,105,48,52,65,52,7,117,110,105,48,52,65,53,7,117,110,105,48,52, -66,52,7,117,110,105,48,52,66,53,7,117,110,105,48,52,66,67,7,117,110,105,48,52, -66,68,7,117,110,105,48,52,66,65,8,99,114,111,115,115,98,97,114,7,117,110,105, -48,52,65,48,7,117,110,105,48,52,65,49,7,117,110,105,48,52,54,52,7,117,110,105, -48,52,54,53,7,117,110,105,48,52,54,54,7,117,110,105,48,52,54,55,7,117,110,105, -48,53,48,65,7,117,110,105,48,53,48,66,7,117,110,105,48,53,48,57,7,117,110,105, -48,53,48,56,7,117,110,105,48,53,48,67,7,117,110,105,48,53,48,68,7,117,110,105, -48,53,48,69,7,117,110,105,48,53,48,70,7,117,110,105,48,53,48,50,7,117,110,105, -48,53,48,51,7,117,110,105,48,53,48,52,7,117,110,105,48,53,48,53,7,117,110,105, -48,53,48,54,7,117,110,105,48,53,48,55,7,117,110,105,48,53,48,48,7,117,110,105, -48,53,49,48,7,117,110,105,48,52,57,48,7,117,110,105,48,52,57,49,7,117,110,105, -48,52,57,67,7,117,110,105,48,52,57,68,7,117,110,105,48,52,66,56,7,117,110,105, -48,52,66,57,7,117,110,105,48,52,67,56,7,117,110,105,48,52,67,55,7,117,110,105, -48,52,54,69,7,117,110,105,48,52,54,70,7,117,110,105,48,52,54,56,7,117,110,105, -48,52,54,57,7,117,110,105,48,52,56,69,7,117,110,105,48,52,56,70,3,99,104,105, -17,99,111,109,109,97,97,99,99,101,110,116,114,111,116,97,116,101,7,117,110, -105,48,51,68,54,7,117,110,105,48,51,68,50,7,117,110,105,48,52,55,65,7,117,110, -105,48,52,55,66,7,117,110,105,48,52,55,69,7,117,110,105,48,52,55,70,7,117,110, -105,48,52,54,65,7,117,110,105,48,52,54,66,7,117,110,105,48,52,54,67,7,117,110, -105,48,52,54,68,7,117,110,105,50,48,48,48,7,117,110,105,50,48,48,49,7,117,110, -105,50,48,48,50,7,117,110,105,50,48,48,51,7,117,110,105,50,48,48,52,7,117,110, -105,50,48,48,53,7,117,110,105,50,48,48,54,7,117,110,105,50,48,48,55,7,117,110, -105,50,48,48,56,7,117,110,105,50,48,48,57,7,117,110,105,50,48,48,65,7,117,110, -105,70,70,70,67,7,117,110,105,70,70,70,68,13,117,110,100,101,114,115,99,111, -114,101,100,98,108,7,117,110,105,48,52,65,56,7,117,110,105,48,52,65,57,7,117, -110,105,50,48,48,66,7,117,110,105,70,69,70,70,7,117,110,105,48,51,68,49,7,117, -110,105,48,52,56,50,7,117,110,105,48,52,56,56,7,117,110,105,48,52,56,57,9,110, -115,117,112,101,114,105,111,114,9,101,115,116,105,109,97,116,101,100,9,100,97, -115,105,97,111,120,105,97,7,117,110,105,50,49,48,53,7,117,110,105,50,49,49,54, -7,117,110,105,50,49,49,51,6,112,101,115,101,116,97,6,100,99,114,111,97,116,7, -117,110,105,50,48,50,53,13,99,121,114,105,108,108,105,99,98,114,101,118,101,6, -68,99,114,111,97,116,4,104,98,97,114,4,84,98,97,114,7,117,110,105,48,48,65,68, -10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117,116, -101,7,65,109,97,99,114,111,110,7,97,109,97,99,114,111,110,6,65,98,114,101,118, -101,6,97,98,114,101,118,101,7,65,111,103,111,110,101,107,7,97,111,103,111,110, -101,107,11,67,99,105,114,99,117,109,102,108,101,120,11,99,99,105,114,99,117, -109,102,108,101,120,4,67,100,111,116,4,99,100,111,116,6,68,99,97,114,111,110, -6,100,99,97,114,111,110,7,69,109,97,99,114,111,110,7,101,109,97,99,114,111, -110,6,69,98,114,101,118,101,6,101,98,114,101,118,101,10,69,100,111,116,97,99, -99,101,110,116,10,101,100,111,116,97,99,99,101,110,116,7,69,111,103,111,110, -101,107,7,101,111,103,111,110,101,107,6,69,99,97,114,111,110,6,101,99,97,114, -111,110,11,71,99,105,114,99,117,109,102,108,101,120,11,103,99,105,114,99,117, -109,102,108,101,120,4,71,100,111,116,4,103,100,111,116,12,71,99,111,109,109, -97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,99,99,101,110,116,11,72, -99,105,114,99,117,109,102,108,101,120,11,104,99,105,114,99,117,109,102,108, -101,120,6,73,116,105,108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114, -111,110,7,105,109,97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101, -118,101,7,73,111,103,111,110,101,107,7,105,111,103,111,110,101,107,10,73,100, -111,116,97,99,99,101,110,116,2,73,74,2,105,106,11,74,99,105,114,99,117,109, -102,108,101,120,11,106,99,105,114,99,117,109,102,108,101,120,12,75,99,111,109, -109,97,97,99,99,101,110,116,12,107,99,111,109,109,97,97,99,99,101,110,116,6, -76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,99,99, -101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,114,111, -110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6,78,97,99,117, -116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99,99,101,110,116, -12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114,111,110,6,110,99, -97,114,111,110,11,110,97,112,111,115,116,114,111,112,104,101,7,79,109,97,99, -114,111,110,7,111,109,97,99,114,111,110,6,79,98,114,101,118,101,6,111,98,114, -101,118,101,13,79,104,117,110,103,97,114,117,109,108,97,117,116,13,111,104, -117,110,103,97,114,117,109,108,97,117,116,6,82,97,99,117,116,101,6,114,97,99, -117,116,101,12,82,99,111,109,109,97,97,99,99,101,110,116,12,114,99,111,109, -109,97,97,99,99,101,110,116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6, -83,97,99,117,116,101,6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102, -108,101,120,11,115,99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109, -97,97,99,99,101,110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99, -97,114,111,110,6,116,99,97,114,111,110,6,85,116,105,108,100,101,6,117,116,105, -108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,99,114,111,110,6,85,98, -114,101,118,101,6,117,98,114,101,118,101,5,85,114,105,110,103,5,117,114,105, -110,103,13,85,104,117,110,103,97,114,117,109,108,97,117,116,13,117,104,117, -110,103,97,114,117,109,108,97,117,116,7,85,111,103,111,110,101,107,7,117,111, -103,111,110,101,107,11,87,99,105,114,99,117,109,102,108,101,120,11,119,99,105, -114,99,117,109,102,108,101,120,11,89,99,105,114,99,117,109,102,108,101,120,11, -121,99,105,114,99,117,109,102,108,101,120,6,90,97,99,117,116,101,6,122,97,99, -117,116,101,10,90,100,111,116,97,99,99,101,110,116,10,122,100,111,116,97,99, -99,101,110,116,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115, -108,97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101, -12,83,99,111,109,109,97,97,99,99,101,110,116,12,115,99,111,109,109,97,97,99, -99,101,110,116,10,65,108,112,104,97,116,111,110,111,115,12,69,112,115,105,108, -111,110,116,111,110,111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97, -116,111,110,111,115,12,79,109,105,99,114,111,110,116,111,110,111,115,12,85, -112,115,105,108,111,110,116,111,110,111,115,10,79,109,101,103,97,116,111,110, -111,115,17,105,111,116,97,100,105,101,114,101,115,105,115,116,111,110,111,115, -5,65,108,112,104,97,4,66,101,116,97,7,69,112,115,105,108,111,110,4,90,101,116, -97,3,69,116,97,4,73,111,116,97,5,75,97,112,112,97,2,77,117,2,78,117,7,79,109, -105,99,114,111,110,3,82,104,111,3,84,97,117,7,85,112,115,105,108,111,110,3,67, -104,105,12,73,111,116,97,100,105,101,114,101,115,105,115,15,85,112,115,105, -108,111,110,100,105,101,114,101,115,105,115,10,97,108,112,104,97,116,111,110, -111,115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101,116,97,116, -111,110,111,115,9,105,111,116,97,116,111,110,111,115,20,117,112,115,105,108, -111,110,100,105,101,114,101,115,105,115,116,111,110,111,115,5,107,97,112,112, -97,7,111,109,105,99,114,111,110,7,117,110,105,48,51,66,67,2,110,117,12,105, -111,116,97,100,105,101,114,101,115,105,115,15,117,112,115,105,108,111,110,100, -105,101,114,101,115,105,115,12,111,109,105,99,114,111,110,116,111,110,111,115, -12,117,112,115,105,108,111,110,116,111,110,111,115,10,111,109,101,103,97,116, -111,110,111,115,7,117,110,105,48,52,48,49,7,117,110,105,48,52,48,51,7,117,110, -105,48,52,48,53,7,117,110,105,48,52,48,54,7,117,110,105,48,52,48,55,7,117,110, -105,48,52,48,56,7,117,110,105,48,52,48,67,7,117,110,105,48,52,48,69,7,117,110, -105,48,52,49,65,7,117,110,105,48,52,49,48,7,117,110,105,48,52,49,50,7,117,110, -105,48,52,49,51,7,117,110,105,48,52,49,53,7,117,110,105,48,52,49,57,7,117,110, -105,48,52,49,67,7,117,110,105,48,52,49,68,7,117,110,105,48,52,49,69,7,117,110, -105,48,52,49,70,7,117,110,105,48,52,50,48,7,117,110,105,48,52,50,49,7,117,110, -105,48,52,50,50,7,117,110,105,48,52,50,52,7,117,110,105,48,52,50,53,7,117,110, -105,48,52,51,48,7,117,110,105,48,52,51,53,7,117,110,105,48,52,51,57,7,117,110, -105,48,52,51,69,7,117,110,105,48,52,52,48,7,117,110,105,48,52,52,49,7,117,110, -105,48,52,52,51,7,117,110,105,48,52,52,53,7,117,110,105,48,52,53,49,7,117,110, -105,48,52,53,51,7,117,110,105,48,52,53,53,7,117,110,105,48,52,53,54,7,117,110, -105,48,52,53,55,7,117,110,105,48,52,53,56,7,117,110,105,48,52,53,67,7,117,110, -105,48,52,53,69,6,87,103,114,97,118,101,6,119,103,114,97,118,101,6,87,97,99, -117,116,101,6,119,97,99,117,116,101,9,87,100,105,101,114,101,115,105,115,9, -119,100,105,101,114,101,115,105,115,6,89,103,114,97,118,101,6,121,103,114,97, -118,101,6,109,105,110,117,116,101,6,115,101,99,111,110,100,9,101,120,99,108, -97,109,100,98,108,7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117, -110,105,48,49,70,48,7,117,110,105,48,50,66,67,7,117,110,105,49,69,51,69,7,117, -110,105,49,69,51,70,7,117,110,105,49,69,48,48,7,117,110,105,49,69,48,49,7,117, -110,105,49,70,52,68,7,117,110,105,70,66,48,51,7,117,110,105,70,66,48,52,7,117, -110,105,48,52,48,48,7,117,110,105,48,52,48,68,7,117,110,105,48,52,53,48,7,117, -110,105,48,52,53,68,7,117,110,105,48,52,55,48,7,117,110,105,48,52,55,49,7,117, -110,105,48,52,55,54,7,117,110,105,48,52,55,55,7,117,110,105,48,52,55,57,7,117, -110,105,48,52,55,56,7,117,110,105,48,52,57,56,7,117,110,105,48,52,57,57,7,117, -110,105,48,52,65,65,7,117,110,105,48,52,65,66,7,117,110,105,48,52,65,69,7,117, -110,105,48,52,65,70,7,117,110,105,48,52,67,48,7,117,110,105,48,52,67,49,7,117, -110,105,48,52,67,50,7,117,110,105,48,52,67,70,7,117,110,105,48,52,68,48,7,117, -110,105,48,52,68,49,7,117,110,105,48,52,68,50,7,117,110,105,48,52,68,51,7,117, -110,105,48,52,68,52,7,117,110,105,48,52,68,53,7,117,110,105,48,52,68,54,7,117, -110,105,48,52,68,55,7,117,110,105,48,52,68,65,7,117,110,105,48,52,68,66,7,117, -110,105,48,52,68,67,7,117,110,105,48,52,68,68,7,117,110,105,48,52,68,69,7,117, -110,105,48,52,68,70,7,117,110,105,48,52,69,50,7,117,110,105,48,52,69,51,7,117, -110,105,48,52,69,52,7,117,110,105,48,52,69,53,7,117,110,105,48,52,69,54,7,117, -110,105,48,52,69,55,7,117,110,105,48,52,69,56,7,117,110,105,48,52,69,57,7,117, -110,105,48,52,69,65,7,117,110,105,48,52,69,66,7,117,110,105,48,52,69,67,7,117, -110,105,48,52,69,68,7,117,110,105,48,52,69,69,7,117,110,105,48,52,69,70,7,117, -110,105,48,52,70,48,7,117,110,105,48,52,70,49,7,117,110,105,48,52,70,50,7,117, -110,105,48,52,70,51,7,117,110,105,48,52,70,52,7,117,110,105,48,52,70,53,7,117, -110,105,48,52,70,56,7,117,110,105,48,52,70,57,7,117,110,105,48,52,70,67,7,117, -110,105,48,52,70,68,7,117,110,105,48,53,48,49,7,117,110,105,48,53,49,50,7,117, -110,105,48,53,49,51,7,117,110,105,49,69,65,48,7,117,110,105,49,69,65,49,7,117, -110,105,49,69,65,50,7,117,110,105,49,69,65,51,7,117,110,105,49,69,65,52,7,117, -110,105,49,69,65,53,7,117,110,105,49,69,65,54,7,117,110,105,49,69,65,55,7,117, -110,105,49,69,65,56,7,117,110,105,49,69,65,57,7,117,110,105,49,69,65,65,7,117, -110,105,49,69,65,66,7,117,110,105,49,69,65,67,7,117,110,105,49,69,65,68,7,117, -110,105,49,69,65,69,7,117,110,105,49,69,65,70,7,117,110,105,49,69,66,48,7,117, -110,105,49,69,66,49,7,117,110,105,49,69,66,50,7,117,110,105,49,69,66,51,7,117, -110,105,49,69,66,52,7,117,110,105,49,69,66,53,7,117,110,105,49,69,66,54,7,117, -110,105,49,69,66,55,7,117,110,105,49,69,66,56,7,117,110,105,49,69,66,57,7,117, -110,105,49,69,66,65,7,117,110,105,49,69,66,66,7,117,110,105,49,69,66,67,7,117, -110,105,49,69,66,68,7,117,110,105,49,69,66,69,7,117,110,105,49,69,66,70,7,117, -110,105,49,69,67,48,7,117,110,105,49,69,67,49,7,117,110,105,49,69,67,50,7,117, -110,105,49,69,67,51,7,117,110,105,49,69,67,52,7,117,110,105,49,69,67,53,7,117, -110,105,49,69,67,54,7,117,110,105,49,69,67,55,7,117,110,105,49,69,67,56,7,117, -110,105,49,69,67,57,7,117,110,105,49,69,67,65,7,117,110,105,49,69,67,66,7,117, -110,105,49,69,67,67,7,117,110,105,49,69,67,68,7,117,110,105,49,69,67,69,7,117, -110,105,49,69,67,70,7,117,110,105,49,69,68,48,7,117,110,105,49,69,68,49,7,117, -110,105,49,69,68,50,7,117,110,105,49,69,68,51,7,117,110,105,49,69,68,52,7,117, -110,105,49,69,68,53,7,117,110,105,49,69,68,54,7,117,110,105,49,69,68,55,7,117, -110,105,49,69,68,56,7,117,110,105,49,69,68,57,7,117,110,105,49,69,68,65,7,117, -110,105,49,69,68,66,7,117,110,105,49,69,68,67,7,117,110,105,49,69,68,68,7,117, -110,105,49,69,68,69,7,117,110,105,49,69,68,70,7,117,110,105,49,69,69,48,7,117, -110,105,49,69,69,49,7,117,110,105,49,69,69,50,7,117,110,105,49,69,69,51,7,117, -110,105,49,69,69,52,7,117,110,105,49,69,69,53,7,117,110,105,49,69,69,54,7,117, -110,105,49,69,69,55,7,117,110,105,49,69,69,56,7,117,110,105,49,69,69,57,7,117, -110,105,49,69,69,65,7,117,110,105,49,69,69,66,7,117,110,105,49,69,69,67,7,117, -110,105,49,69,69,68,7,117,110,105,49,69,69,69,7,117,110,105,49,69,69,70,7,117, -110,105,49,69,70,48,7,117,110,105,49,69,70,49,7,117,110,105,49,69,70,52,7,117, -110,105,49,69,70,53,7,117,110,105,49,69,70,54,7,117,110,105,49,69,70,55,7,117, -110,105,49,69,70,56,7,117,110,105,49,69,70,57,7,117,110,105,50,48,65,66,7,117, -110,105,48,52,57,65,7,117,110,105,48,52,57,66,7,117,110,105,48,52,65,50,7,117, -110,105,48,52,65,51,7,117,110,105,48,52,65,67,7,117,110,105,48,52,65,68,7,117, -110,105,48,52,66,50,7,117,110,105,48,52,66,51,7,117,110,105,48,52,66,54,7,117, -110,105,48,52,66,55,7,117,110,105,48,52,67,66,7,117,110,105,48,52,67,67,7,117, -110,105,48,52,70,54,7,117,110,105,48,52,70,55,7,117,110,105,48,52,57,54,7,117, -110,105,48,52,57,55,7,117,110,105,48,52,66,69,7,117,110,105,48,52,66,70,7,117, -110,105,48,52,66,66,7,117,110,105,48,52,56,68,7,117,110,105,48,52,56,67,7,117, -110,105,48,52,54,51,7,117,110,105,48,52,54,50,7,117,110,105,48,52,57,50,7,117, -110,105,48,52,57,51,7,117,110,105,48,52,57,69,7,117,110,105,48,52,57,70,7,117, -110,105,48,52,56,65,7,117,110,105,48,52,56,66,7,117,110,105,48,52,67,57,7,117, -110,105,48,52,67,65,7,117,110,105,48,52,67,68,7,117,110,105,48,52,67,69,7,117, -110,105,48,52,67,53,7,117,110,105,48,52,67,54,7,117,110,105,48,52,66,48,7,117, -110,105,48,52,66,49,7,117,110,105,48,52,70,69,7,117,110,105,48,52,70,70,7,117, -110,105,48,52,70,65,7,117,110,105,48,52,70,66,7,117,110,105,48,52,55,67,7,117, -110,105,48,52,55,68,7,117,110,105,48,53,49,49,7,117,110,105,50,48,49,53,0,0,0, -0,1,0,0,0,12,0,0,0,0,0,0,0,2,0,4,0,255,1,2,0,1,1,180,1,192,0,1,1,196,1,204,0, -1,1,206,1,207,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,10,0,30,0,44,0,1,108,97,116,110,0, -8,0,4,0,0,0,0,255,255,0,1,0,0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2, -0,0,0,1,0,8,0,1,24,50,0,4,0,0,0,148,1,50,1,68,1,102,1,120,1,154,1,192,1,222,2, -4,2,38,2,68,2,94,2,128,3,6,3,40,3,94,3,120,3,238,4,32,4,62,4,84,4,150,4,160,4, -226,5,76,5,106,5,120,5,222,6,52,6,118,6,204,6,250,7,152,7,206,8,56,8,170,8, -220,9,106,9,176,9,182,9,192,9,214,9,224,9,234,9,248,10,26,10,36,10,46,10,56, -10,62,10,72,10,82,10,92,10,118,10,132,10,206,10,216,10,226,10,236,11,22,11,48, -11,78,11,116,11,142,11,148,12,38,12,96,12,226,12,236,13,34,13,44,13,78,13,84, -13,126,13,132,13,162,13,228,13,242,14,36,14,78,14,88,14,114,14,128,14,222,14, -232,14,242,15,0,15,54,15,108,15,162,15,188,15,222,16,16,16,58,16,112,16,134, -17,36,17,70,17,128,17,170,17,212,17,250,18,36,18,122,18,140,18,174,18,192,18, -210,18,244,19,14,19,60,19,150,19,180,19,206,19,240,19,254,20,28,20,50,20,72, -20,90,20,112,20,130,20,228,21,2,21,100,21,138,21,156,21,166,21,176,21,182,21, -200,21,242,22,12,22,30,22,56,22,94,22,140,22,146,22,168,22,194,22,212,22,254, -23,20,23,126,23,168,23,210,23,220,23,242,24,40,0,4,0,42,255,162,0,54,0,40,0, -55,0,37,0,57,0,45,0,8,0,16,0,4,0,17,255,221,0,19,255,252,0,20,0,5,0,21,255, -253,0,22,0,4,0,23,255,213,0,25,0,6,0,4,0,18,255,250,0,19,255,250,0,21,255,250, -0,23,255,254,0,8,0,16,255,239,0,17,255,239,0,18,0,8,0,21,255,242,0,22,255,239, -0,23,255,233,0,24,255,238,0,25,0,2,0,9,0,17,255,236,0,18,255,253,0,19,0,7,0, -20,0,15,0,21,0,4,0,22,255,253,0,23,255,228,0,24,0,5,0,25,255,255,0,7,0,16,0,3, -0,18,255,225,0,20,0,34,0,21,0,17,0,22,0,3,0,23,255,173,0,24,0,19,0,9,0,17,255, -252,0,18,255,234,0,19,0,6,0,20,0,17,0,21,0,5,0,22,255,254,0,23,255,253,0,24,0, -6,0,25,255,229,0,8,0,16,0,2,0,17,255,217,0,18,255,232,0,20,0,23,0,21,0,9,0,22, -0,2,0,23,255,216,0,24,0,11,0,7,0,17,0,36,0,20,255,94,0,21,255,225,0,22,255, -217,0,23,0,38,0,24,255,234,0,25,255,249,0,6,0,16,255,255,0,17,255,234,0,19,0, -11,0,20,0,20,0,21,0,8,0,22,255,255,0,8,0,16,0,3,0,17,255,218,0,18,255,247,0, -20,0,5,0,21,255,252,0,22,0,3,0,23,255,209,0,25,0,5,0,33,0,35,255,218,0,39,255, -217,0,47,255,214,0,49,255,217,0,52,255,104,0,53,255,211,0,54,255,108,0,55,255, -157,0,57,255,93,0,65,0,5,0,67,255,236,0,68,255,229,0,69,255,232,0,71,255,240, -0,79,255,232,0,81,255,240,0,83,0,3,0,84,255,192,0,85,255,233,0,86,255,173,0, -87,255,188,0,90,0,24,1,8,255,120,1,12,255,120,1,66,255,236,1,70,255,233,1,78, -255,233,1,80,255,236,1,83,255,139,1,84,255,225,1,85,255,152,1,86,255,185,1,88, -255,133,0,8,0,57,255,93,0,65,0,10,0,73,255,252,0,76,255,252,0,79,0,6,0,82,0,2, -0,85,0,5,0,89,0,4,0,13,0,35,255,250,0,39,255,250,0,47,255,247,0,49,255,250,0, -73,255,244,0,82,255,250,0,85,255,250,0,89,0,11,0,90,255,247,1,66,255,250,1,70, -255,249,1,78,255,249,1,80,255,250,0,6,0,54,255,213,0,55,255,230,0,65,255,253, -0,69,0,4,0,79,0,4,0,85,0,4,0,29,0,54,0,17,0,55,0,16,0,57,0,18,0,66,255,245,0, -67,255,218,0,68,255,213,0,69,255,217,0,70,255,219,0,71,255,222,0,73,255,246,0, -74,255,249,0,75,255,248,0,76,255,246,0,77,255,238,0,78,255,238,0,79,255,217,0, -80,255,242,0,81,255,222,0,82,255,240,0,84,255,212,0,85,255,222,0,86,255,203,0, -87,255,210,0,88,0,5,0,89,255,207,0,90,0,6,1,85,255,224,1,86,255,218,1,88,255, -223,0,12,0,12,254,205,0,14,254,205,0,33,255,135,0,65,255,187,0,69,255,212,0, -73,255,249,0,76,255,247,0,79,255,212,0,82,255,203,0,85,255,210,0,89,255,206,1, -63,255,124,0,7,0,65,0,1,0,69,0,4,0,78,255,255,0,79,0,1,0,82,0,2,0,85,0,1,0,89, -0,1,0,5,0,65,255,250,0,69,255,246,0,79,255,246,0,85,255,247,0,89,255,253,0,16, -0,65,255,248,0,67,255,248,0,68,255,238,0,70,255,244,0,71,255,248,0,77,255,248, -0,78,255,248,0,79,255,244,0,80,255,252,0,82,255,248,0,83,255,248,0,84,255,247, -0,85,255,248,0,86,255,250,0,87,255,252,0,89,255,250,0,2,0,65,255,247,0,79,255, -247,0,16,0,35,255,200,0,39,255,196,0,47,255,193,0,49,255,196,0,65,255,246,0, -69,255,202,0,73,255,247,0,79,255,201,0,82,255,248,0,85,255,208,0,87,255,177,0, -89,255,175,1,66,255,207,1,70,255,203,1,78,255,204,1,80,255,204,0,26,0,33,0,39, -0,35,255,213,0,39,255,209,0,47,255,205,0,49,255,209,0,52,255,100,0,53,255,206, -0,54,255,71,0,55,255,147,0,57,255,79,0,74,255,254,0,85,255,227,0,87,255,170,0, -89,255,147,1,8,254,233,1,12,254,230,1,63,0,38,1,66,255,229,1,70,255,225,1,78, -255,227,1,80,255,227,1,83,255,118,1,84,255,220,1,85,255,109,1,86,255,172,1,88, -255,106,0,7,0,65,255,249,0,69,255,245,0,74,255,248,0,78,255,249,0,79,255,245, -0,85,255,249,0,89,255,252,0,3,0,69,255,247,0,79,255,247,0,89,255,253,0,25,0, -33,255,214,0,52,255,201,0,54,255,211,0,55,255,233,0,56,255,210,0,57,255,198,0, -67,0,2,0,68,255,252,0,69,0,2,0,70,0,1,0,71,0,2,0,74,255,245,0,79,0,2,0,80,255, -255,0,81,0,5,0,83,255,255,0,84,0,4,0,85,0,2,0,88,255,244,0,89,0,7,0,90,255, -241,1,63,255,215,1,85,255,254,1,86,255,255,1,87,255,233,0,21,0,12,254,176,0, -14,254,176,0,33,255,146,0,37,255,250,0,40,255,250,0,41,255,250,0,65,255,234,0, -69,255,230,0,72,255,254,0,73,255,248,0,76,255,250,0,78,255,250,0,79,255,230,0, -82,255,252,0,83,255,244,0,84,0,29,0,89,0,31,1,63,255,138,1,68,255,253,1,71, -255,253,1,72,255,253,0,16,0,33,0,28,0,52,255,188,0,53,255,242,0,54,255,199,0, -55,255,216,0,56,0,24,0,57,255,185,0,65,255,255,0,85,255,252,1,63,0,28,1,83, -255,244,1,84,255,249,1,85,255,240,1,86,255,244,1,87,0,13,1,88,255,238,0,21,0, -35,255,245,0,39,255,245,0,47,255,242,0,49,255,245,0,52,255,215,0,53,255,242,0, -54,255,217,0,55,255,226,0,57,255,158,0,65,255,252,0,69,255,241,0,79,255,241,0, -85,255,248,0,89,255,254,1,66,255,246,1,70,255,245,1,78,255,245,1,80,255,245,1, -83,255,253,1,84,255,245,1,86,255,248,0,11,0,65,0,1,0,69,255,253,0,74,255,247, -0,77,255,250,0,78,255,250,0,79,255,253,0,80,255,254,0,81,255,255,0,85,255,254, -0,87,0,6,0,89,0,5,0,39,0,12,255,92,0,13,255,96,0,14,255,92,0,26,255,102,0,27, -255,100,0,33,255,94,0,35,255,204,0,39,255,200,0,47,255,199,0,49,255,202,0,51, -255,223,0,52,0,32,0,54,0,32,0,55,0,31,0,56,0,21,0,57,0,33,0,65,255,97,0,69, -255,94,0,73,255,249,0,77,255,122,0,79,255,94,0,82,255,122,0,83,255,101,0,85, -255,122,0,87,255,159,0,89,255,156,0,90,255,133,1,8,0,7,1,63,255,91,1,66,255, -110,1,70,255,110,1,78,255,110,1,80,255,110,1,82,255,117,1,83,255,225,1,85,255, -235,1,86,255,225,1,87,255,218,1,88,255,236,0,13,0,33,255,211,0,68,255,240,0, -70,255,252,0,71,255,248,0,77,255,248,0,78,255,248,0,80,255,248,0,82,255,248,0, -83,255,244,0,84,255,255,0,88,255,241,0,90,255,237,1,63,255,212,0,26,0,9,0,40, -0,12,255,76,0,13,255,181,0,14,255,81,0,26,255,193,0,27,255,193,0,33,255,103,0, -35,255,213,0,39,255,213,0,47,255,210,0,49,255,213,0,61,0,34,0,65,255,161,0,69, -255,165,0,79,255,161,0,82,255,194,0,85,255,198,0,89,255,234,0,93,0,38,1,8,0, -12,1,12,0,12,1,63,255,100,1,66,255,177,1,70,255,177,1,78,255,177,1,80,255,177, -0,28,0,9,0,31,0,12,255,138,0,13,255,213,0,14,255,138,0,26,255,212,0,27,255, -211,0,33,255,147,0,35,255,228,0,39,255,228,0,47,255,225,0,49,255,228,0,52,0, -29,0,61,0,25,0,65,255,189,0,69,255,193,0,79,255,193,0,82,255,213,0,85,255,217, -0,89,255,247,0,93,0,29,1,8,0,9,1,12,0,9,1,63,255,148,1,66,255,209,1,70,255, -205,1,78,255,205,1,80,255,205,1,83,255,254,0,12,0,35,255,209,0,39,255,209,0, -47,255,205,0,49,255,209,0,69,255,203,0,85,255,212,0,89,255,192,1,8,255,249,1, -66,255,209,1,70,255,205,1,78,255,205,1,80,255,208,0,35,0,9,0,41,0,12,255,69,0, -13,255,150,0,14,255,69,0,26,255,167,0,27,255,168,0,33,255,88,0,35,255,202,0, -39,255,200,0,47,255,196,0,49,255,200,0,52,0,34,0,54,0,36,0,55,0,34,0,56,0,27, -0,57,0,37,0,61,0,37,0,65,255,127,0,69,255,122,0,79,255,122,0,81,255,131,0,84, -255,210,0,85,255,176,0,86,255,216,0,93,0,39,1,63,255,81,1,66,255,151,1,70,255, -147,1,78,255,147,1,80,255,147,1,83,255,230,1,85,255,238,1,86,255,230,1,87,255, -222,1,88,255,239,0,17,0,33,0,27,0,35,255,209,0,39,255,205,0,47,255,202,0,49, -255,205,0,65,255,254,0,69,255,213,0,73,255,247,0,79,255,212,0,85,255,218,0,87, -255,200,0,89,255,201,1,63,0,27,1,66,255,218,1,70,255,214,1,78,255,216,1,80, -255,216,0,1,0,42,255,219,0,2,1,8,255,225,1,12,255,225,0,5,0,86,255,233,0,87, -255,240,0,89,255,233,1,8,255,197,1,12,255,197,0,2,1,8,255,246,1,12,255,246,0, -2,1,8,255,247,1,12,255,247,0,3,0,89,255,230,1,8,255,227,1,12,255,227,0,8,0,7, -0,32,0,9,0,41,0,61,0,37,0,71,255,207,0,93,0,39,1,8,0,32,1,12,0,32,3,177,0,28, -0,2,1,8,255,247,1,12,255,247,0,2,1,8,255,198,1,12,255,198,0,2,1,8,255,249,1, -12,255,249,0,1,0,69,255,215,0,2,1,8,255,245,1,12,255,245,0,2,1,8,255,220,1,12, -255,220,0,2,1,8,255,227,1,12,255,227,0,6,0,86,255,226,0,87,255,237,0,88,255, -214,0,89,255,226,1,8,255,216,1,12,255,216,0,3,0,87,255,240,1,8,255,223,1,12, -255,223,0,18,0,12,255,126,0,14,255,126,0,67,255,218,0,68,255,220,0,69,255,218, -0,70,0,31,0,75,0,1,0,79,255,216,0,81,255,221,0,84,0,34,0,85,0,1,0,86,0,36,0, -87,0,35,0,88,0,18,0,89,0,36,0,90,0,10,1,8,0,32,1,12,0,32,0,2,1,8,255,247,1,12, -255,247,0,2,1,8,255,249,1,12,255,249,0,2,1,8,255,248,1,12,255,248,0,10,0,12, -255,135,0,14,255,139,0,65,255,226,0,67,255,229,0,68,255,229,0,69,255,229,0,79, -255,225,0,81,255,229,1,8,0,34,1,12,0,34,0,6,0,12,255,162,0,14,255,166,0,67, -255,236,0,68,255,236,0,69,255,232,0,81,255,236,0,7,0,67,255,215,0,68,255,219, -0,69,255,215,0,79,255,215,0,81,255,219,1,8,0,18,1,12,0,18,0,9,0,12,255,118,0, -14,255,128,0,67,255,223,0,68,255,223,0,69,255,223,0,79,255,223,0,81,255,217,1, -8,0,28,1,12,0,28,0,6,0,67,255,223,0,68,255,226,0,69,255,223,0,79,255,223,1,8, -0,7,1,12,0,7,0,1,0,42,255,215,0,36,0,12,254,206,0,13,254,204,0,14,254,210,0, -35,255,199,0,39,255,197,0,47,255,197,0,49,255,197,0,52,0,34,0,54,0,33,0,55,0, -30,0,57,0,33,0,105,254,208,0,120,254,210,0,127,255,195,0,142,255,195,0,169, -255,66,0,170,255,197,0,171,255,66,0,175,255,108,0,178,254,244,0,180,254,241,0, -181,255,223,0,182,254,249,0,184,255,14,0,186,254,246,0,189,255,70,0,190,254, -237,0,191,254,240,0,192,254,231,0,193,255,92,0,194,254,250,0,195,254,252,0, -196,255,1,0,197,254,244,1,5,254,207,1,6,254,207,0,14,0,12,255,217,0,14,255, -226,0,33,255,224,0,52,255,203,0,54,255,224,0,55,255,238,0,56,255,216,0,57,255, -206,0,58,255,219,0,125,255,206,0,169,255,217,0,171,255,224,0,172,255,228,0, -174,255,217,0,32,0,7,255,115,0,31,255,140,0,33,0,36,0,35,255,219,0,39,255,215, -0,47,255,215,0,49,255,215,0,52,255,75,0,53,255,212,0,54,255,113,0,55,255,156, -0,57,255,85,0,67,255,234,0,68,255,229,0,69,255,234,0,71,255,238,0,79,255,234, -0,81,255,238,0,85,255,235,0,125,0,38,0,127,255,236,0,133,255,238,0,142,255, -215,0,143,255,238,0,169,0,38,0,170,255,215,0,175,255,202,0,176,255,156,0,193, -255,149,1,8,255,119,1,12,255,119,3,177,255,119,0,2,0,170,255,225,0,187,0,27,0, -13,0,7,255,246,0,35,255,211,0,39,255,209,0,47,255,209,0,49,255,209,0,127,255, -232,0,142,255,205,0,170,255,209,0,175,255,151,0,187,0,36,1,8,255,246,1,12,255, -246,3,177,255,246,0,2,0,171,255,199,0,187,255,193,0,8,0,12,255,84,0,14,255,88, -0,171,255,157,0,181,255,243,0,190,255,224,0,192,255,237,0,195,255,244,0,197, -255,240,0,1,0,187,0,34,0,10,0,7,0,32,0,70,0,29,0,181,255,239,0,189,0,27,0,190, -255,211,0,193,0,30,0,197,255,236,1,8,0,32,1,12,0,32,3,177,0,32,0,1,0,193,255, -225,0,7,0,7,255,239,0,191,255,243,0,192,255,243,0,195,255,242,1,8,255,244,1, -12,255,244,3,177,255,240,0,16,0,178,255,209,0,180,0,10,0,181,255,216,0,182, -255,226,0,184,255,233,0,186,255,237,0,187,0,11,0,188,255,223,0,189,0,14,0,191, -255,199,0,192,255,205,0,193,0,15,0,194,255,238,0,195,255,219,0,196,255,239,0, -197,255,217,0,3,0,7,255,217,1,8,255,227,1,12,255,227,0,12,0,7,255,186,0,178, -255,225,0,180,255,191,0,185,255,217,0,186,255,239,0,187,0,37,0,189,255,214,0, -193,255,190,0,195,255,212,1,8,255,249,1,12,255,249,3,177,255,184,0,10,0,7,255, -58,0,70,255,209,0,180,255,145,0,185,255,212,0,187,0,33,0,189,255,212,0,193, -255,125,1,8,255,63,1,12,255,63,3,177,255,58,0,2,0,178,255,179,0,187,0,17,0,6, -0,87,255,240,0,88,255,226,0,90,255,232,0,193,255,215,1,8,255,223,1,12,255,223, -0,3,0,180,0,17,0,189,0,19,0,193,0,20,0,23,0,7,0,34,0,70,0,29,0,120,255,233,0, -180,0,27,0,181,255,223,0,189,0,29,0,191,255,214,0,192,255,211,0,193,0,29,1,8, -0,34,1,12,0,34,1,63,255,122,1,66,255,220,1,70,255,216,1,78,255,218,1,80,255, -216,1,82,255,234,1,83,0,29,1,85,0,27,1,86,0,20,1,87,0,8,1,88,0,27,3,177,0,34, -0,2,0,88,255,220,0,90,255,220,0,2,0,88,255,228,0,90,255,228,0,3,0,88,255,226, -0,90,255,226,0,180,255,234,0,13,0,7,255,170,0,198,255,185,0,202,255,186,0,206, -255,233,0,210,255,223,0,212,255,194,0,215,255,188,0,233,255,164,0,236,255,239, -0,239,255,200,1,8,255,175,1,12,255,175,3,177,255,171,0,13,0,7,255,126,0,202, -255,67,0,206,255,232,0,209,255,243,0,210,255,220,0,212,255,194,0,215,255,141, -0,233,255,161,0,236,255,241,0,239,255,201,1,8,255,146,1,12,255,146,3,177,255, -135,0,13,0,7,255,125,0,198,255,68,0,202,255,66,0,206,255,230,0,210,255,219,0, -212,255,193,0,215,255,140,0,233,255,159,0,236,255,240,0,239,255,200,1,8,255, -144,1,12,255,144,3,177,255,134,0,6,0,198,255,181,0,202,255,179,0,215,255,184, -0,233,255,158,0,236,255,225,0,239,255,194,0,8,0,198,255,206,0,210,255,225,0, -212,255,202,0,215,255,208,0,225,255,227,0,233,255,168,0,236,255,242,0,239,255, -204,0,12,0,198,255,196,0,200,0,40,0,202,255,197,0,205,0,46,0,209,0,40,0,212, -255,197,0,215,255,199,0,224,0,44,0,229,0,40,0,236,255,196,0,247,0,40,0,253, -255,213,0,10,0,13,255,141,0,199,255,206,0,200,0,36,0,209,0,36,0,221,255,210,0, -229,0,37,0,233,255,181,0,236,255,161,0,247,0,37,0,253,255,206,0,13,0,17,255, -236,0,18,255,253,0,19,0,7,0,20,0,15,0,21,0,4,0,22,255,253,0,23,255,228,0,24,0, -5,0,25,255,255,0,207,0,11,0,209,255,239,0,210,255,236,0,215,255,228,0,5,0,65, -255,252,0,69,255,255,0,79,255,252,0,85,255,255,0,89,0,2,0,39,0,7,0,15,0,13, -255,177,0,14,255,135,0,67,255,229,0,68,255,229,0,69,255,229,0,79,255,229,0,81, -255,225,0,199,255,210,0,200,255,138,0,205,255,53,0,209,255,138,0,215,0,36,0, -222,255,187,0,223,255,187,0,224,255,69,0,227,255,187,0,228,255,187,0,229,255, -116,0,230,255,187,0,231,255,187,0,232,255,187,0,234,255,154,0,235,255,187,0, -236,255,207,0,237,255,187,0,238,255,185,0,240,255,187,0,241,255,187,0,243,255, -185,0,244,255,172,0,246,255,150,0,247,255,116,0,248,255,187,0,250,255,187,0, -254,255,153,1,8,0,31,1,12,0,31,3,177,0,13,0,8,0,200,0,39,0,205,0,96,0,209,0, -49,0,212,255,195,0,224,0,104,0,229,0,58,0,236,255,194,0,247,0,39,0,14,0,198, -255,218,0,200,0,42,0,205,0,48,0,209,0,42,0,210,0,22,0,212,255,218,0,215,255, -219,0,218,255,242,0,224,0,45,0,229,0,40,0,233,255,223,0,236,255,217,0,239,255, -225,0,247,0,40,0,10,0,7,255,124,0,198,255,65,0,202,255,63,0,212,255,190,0,215, -255,137,0,233,255,158,0,239,255,198,1,8,255,139,1,12,255,139,3,177,255,133,0, -10,0,7,255,131,0,198,255,69,0,202,255,67,0,212,255,194,0,215,255,141,0,233, -255,164,0,239,255,200,1,8,255,145,1,12,255,145,3,177,255,135,0,9,0,198,255, -206,0,200,255,207,0,202,255,205,0,205,255,202,0,206,255,207,0,209,255,207,0, -210,255,217,0,229,255,214,0,247,255,214,0,10,0,198,255,202,0,200,255,206,0, -202,255,202,0,205,255,203,0,206,255,207,0,209,255,206,0,210,255,217,0,224,255, -203,0,229,255,214,0,247,255,214,0,21,0,35,255,250,0,39,255,250,0,47,255,253,0, -49,255,250,0,52,255,214,0,53,255,249,0,54,255,236,0,55,255,243,0,57,255,229,0, -69,255,252,0,79,255,250,0,85,255,253,0,89,0,6,1,66,255,253,1,70,255,249,1,78, -255,249,1,80,255,249,1,83,0,1,1,84,255,253,1,85,0,1,1,88,0,1,0,4,0,224,255, -225,0,225,255,224,0,233,255,223,0,239,255,241,0,8,0,7,255,191,0,225,255,237,0, -233,255,230,0,236,255,238,0,239,255,235,1,8,255,230,1,12,255,230,3,177,255, -190,0,4,0,224,255,132,0,229,255,171,0,246,255,211,0,247,255,171,0,4,0,224,0, -42,0,233,255,219,0,236,255,216,0,239,255,223,0,8,0,7,0,11,0,234,255,236,0,236, -255,245,0,246,255,218,0,254,255,220,1,8,0,11,1,12,0,11,3,177,0,11,0,6,0,7,255, -232,0,233,255,237,0,236,255,240,1,8,255,236,1,12,255,236,3,177,255,232,0,11,0, -221,255,233,0,234,255,224,0,236,255,242,0,246,255,211,0,254,255,213,1,8,0,12, -1,12,0,12,1,66,255,212,1,70,255,208,1,78,255,212,1,80,255,212,0,22,0,7,0,34,0, -70,0,29,0,224,255,133,0,229,255,172,0,234,255,223,0,246,255,211,0,247,255,172, -0,254,255,213,1,8,0,31,1,12,0,31,1,63,255,122,1,66,255,220,1,70,255,216,1,78, -255,218,1,80,255,216,1,82,255,234,1,83,0,29,1,85,0,27,1,86,0,20,1,87,0,8,1,88, -0,27,3,177,0,34,0,7,0,88,255,244,0,90,255,244,0,225,255,236,0,229,255,246,0, -233,255,229,0,239,255,237,0,247,255,246,0,6,0,224,0,37,0,229,0,32,0,233,255, -222,0,236,255,220,0,239,255,224,0,247,0,32,0,8,0,224,0,43,0,229,0,38,0,233, -255,206,0,236,255,203,0,239,255,215,0,242,255,242,0,246,255,224,0,247,0,38,0, -3,0,233,255,122,0,236,255,203,0,239,255,178,0,7,0,7,254,253,0,233,255,118,0, -236,255,202,0,239,255,174,1,8,255,35,1,12,255,39,3,177,255,10,0,5,0,224,255, -218,0,225,255,218,0,229,255,225,0,239,255,222,0,247,255,225,0,5,0,224,255,217, -0,225,255,217,0,226,255,245,0,229,255,223,0,239,255,232,0,4,0,7,255,240,1,8, -255,244,1,12,255,244,3,177,255,240,0,5,0,225,255,232,0,233,255,116,0,234,0,11, -0,236,255,200,0,239,255,172,0,4,0,225,255,236,0,233,255,121,0,236,255,203,0, -239,255,177,0,24,0,33,255,120,0,52,0,12,0,54,0,16,0,55,0,18,0,57,0,9,0,65,255, -225,0,67,255,217,0,68,255,197,0,69,255,217,0,70,0,5,0,71,255,222,0,77,255,247, -0,78,255,247,0,79,255,217,0,81,255,222,0,83,255,237,0,84,0,11,0,85,255,254,0, -86,0,36,0,87,0,32,0,88,0,18,0,89,0,36,0,90,0,8,1,7,255,241,0,7,0,68,255,172,0, -77,255,243,0,82,255,247,0,83,255,216,0,84,0,6,0,86,0,27,1,8,255,245,0,24,0,33, -255,118,0,52,0,9,0,54,0,10,0,55,0,12,0,57,0,7,0,65,255,223,0,67,255,215,0,68, -255,191,0,69,255,215,0,71,255,215,0,77,255,245,0,78,255,245,0,79,255,211,0,80, -255,249,0,81,255,219,0,82,255,245,0,83,255,230,0,84,0,4,0,85,255,252,0,86,0, -27,0,87,0,23,0,88,0,12,0,89,0,27,0,90,0,3,0,9,1,66,255,227,1,70,255,227,1,78, -255,227,1,80,255,227,1,83,255,125,1,84,255,216,1,85,255,139,1,86,255,175,1,88, -255,123,0,4,1,66,255,254,1,70,255,254,1,78,255,254,1,80,255,254,0,2,1,85,255, -220,1,86,255,234,0,2,1,85,0,4,1,88,0,4,0,1,1,63,255,162,0,4,1,66,255,212,1,70, -255,208,1,78,255,212,1,80,255,212,0,10,1,63,0,35,1,66,255,224,1,70,255,220,1, -78,255,222,1,80,255,223,1,83,255,115,1,84,255,215,1,85,255,107,1,86,255,167,1, -88,255,101,0,6,1,63,255,229,1,83,255,219,1,85,255,225,1,86,255,239,1,87,255, -215,1,88,255,211,0,4,1,63,255,168,1,68,255,245,1,71,255,245,1,72,255,245,0,6, -1,63,0,13,1,83,255,208,1,84,255,246,1,85,255,213,1,86,255,226,1,88,255,201,0, -9,1,66,255,252,1,70,255,252,1,78,255,252,1,80,255,252,1,83,255,228,1,84,255, -245,1,85,255,226,1,86,255,233,1,88,255,219,0,11,1,63,255,122,1,66,255,220,1, -70,255,216,1,78,255,218,1,80,255,216,1,82,255,234,1,83,0,29,1,85,0,27,1,86,0, -20,1,87,0,8,1,88,0,27,0,1,1,63,255,221,0,5,1,63,255,140,1,66,255,228,1,70,255, -224,1,78,255,224,1,80,255,224,0,6,1,63,255,182,1,66,255,239,1,70,255,239,1,78, -255,239,1,80,255,239,1,83,0,28,0,4,1,66,255,218,1,70,255,214,1,78,255,214,1, -80,255,214,0,10,1,63,255,124,1,66,255,217,1,70,255,213,1,78,255,213,1,80,255, -213,1,83,0,31,1,85,0,33,1,86,0,27,1,87,0,14,1,88,0,33,0,5,1,63,0,25,1,66,255, -224,1,70,255,224,1,78,255,224,1,80,255,224,0,26,0,9,0,40,0,12,255,76,0,13,255, -181,0,14,255,81,0,26,255,193,0,27,255,193,0,33,255,103,0,35,255,213,0,39,255, -213,0,47,255,210,0,49,255,213,0,61,0,34,0,65,255,161,0,69,255,165,0,79,255, -161,0,82,255,194,0,85,255,198,0,89,255,234,0,93,0,38,1,8,0,12,1,12,0,12,1,63, -255,100,1,66,255,177,1,70,255,177,1,78,255,177,1,80,255,177,0,10,0,12,255,135, -0,14,255,139,0,65,255,226,0,67,255,229,0,68,255,229,0,69,255,229,0,79,255,225, -0,81,255,229,1,8,0,34,1,12,0,34,0,10,0,35,255,253,0,39,255,253,0,47,255,254,0, -49,255,253,0,65,0,8,0,73,255,247,0,82,255,255,0,85,255,252,0,89,0,16,0,90,0,2, -0,2,1,8,255,234,1,12,255,234,0,5,0,65,255,250,0,69,255,246,0,79,255,246,0,85, -255,247,0,89,255,253,0,13,0,35,255,250,0,39,255,250,0,47,255,247,0,49,255,250, -0,73,255,244,0,82,255,250,0,85,255,250,0,89,0,11,0,90,255,247,1,66,255,250,1, -70,255,249,1,78,255,249,1,80,255,250,0,2,1,8,255,246,1,12,255,246,0,2,0,35,0, -8,0,8,0,0,0,16,0,25,0,1,0,33,0,59,0,11,0,65,0,73,0,38,0,75,0,80,0,47,0,82,0, -91,0,53,0,168,0,168,0,63,0,170,0,172,0,64,0,174,0,176,0,67,0,178,0,178,0,70,0, -180,0,184,0,71,0,186,0,188,0,76,0,190,0,190,0,79,0,192,0,193,0,80,0,195,0,198, -0,82,0,200,0,202,0,86,0,204,0,208,0,89,0,210,0,211,0,94,0,214,0,215,0,96,0, -217,0,226,0,98,0,228,0,228,0,108,0,233,0,235,0,109,0,238,0,239,0,112,0,241,0, -243,0,114,0,246,0,248,0,117,1,7,1,8,0,120,1,11,1,11,0,122,1,63,1,63,0,123,1, -66,1,69,0,124,1,74,1,75,0,128,1,78,1,81,0,130,1,83,1,89,0,134,1,111,1,114,0, -141,1,137,1,137,0,145,1,141,1,142,0,146,0,1,0,0,0,10,0,32,0,58,0,1,108,97,116, -110,0,8,0,4,0,0,0,0,255,255,0,2,0,0,0,1,0,2,108,105,103,97,0,14,115,109,99, -112,0,20,0,0,0,1,0,0,0,0,0,1,0,1,0,2,0,6,0,14,0,4,0,0,0,1,0,16,0,1,0,0,0,1,0, -26,0,1,0,148,0,1,0,8,0,1,0,4,0,130,0,2,0,69,0,2,0,136,0,62,1,90,1,91,1,92,1, -93,1,94,1,95,1,96,1,97,1,98,1,99,1,63,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72, -1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1, -88,1,89,1,63,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77, -1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,0,1,0,1,0,65,0,2, -0,3,0,16,0,25,0,0,0,33,0,58,0,10,0,65,0,90,0,36}; +static const char +default_font_bitmap[] = +{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,3,154,0,0,0,14,8,6,0,0,0,78, +234,99,67,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,9,112,72,89,115, +0,0,14,194,0,0,14,194,1,21,40,74,128,0,0,0,25,116,69,88,116,83,111,102,116, +119,97,114,101,0,112,97,105,110,116,46,110,101,116,32,52,46,48,46,50,49,241, +32,105,149,0,0,29,22,73,68,65,84,120,94,237,92,61,168,109,75,82,126,8,134,166, +26,138,32,152,152,60,16,68,12,6,28,159,130,136,129,58,193,168,136,99,96,224,4, +38,47,83,208,64,197,224,129,168,32,19,61,13,12,100,20,20,196,72,196,216,159, +200,68,19,49,209,72,65,20,19,17,217,246,87,95,215,174,175,126,122,239,117,206, +61,87,158,48,181,169,123,86,87,125,93,93,127,221,107,173,125,238,189,31,220, +62,184,221,192,31,20,114,249,164,115,82,204,35,28,232,10,238,10,6,116,21,7, +122,132,123,169,141,43,248,9,247,104,222,132,159,104,194,169,76,229,87,232, +234,188,171,56,208,251,192,42,238,132,125,164,3,93,153,251,104,62,232,165,184, +61,124,74,111,105,247,173,48,78,142,189,106,243,25,206,233,125,224,21,115,5, +183,135,15,73,237,93,153,243,8,127,146,59,61,211,43,93,193,94,193,76,164,243, +174,206,125,41,30,116,117,206,85,92,165,151,204,187,130,123,169,173,183,198, +130,94,138,175,116,117,238,75,214,120,107,155,142,59,97,85,127,194,40,93,197, +190,47,123,255,223,112,239,34,175,58,167,147,254,165,114,167,103,122,208,85, +125,197,60,155,7,58,97,92,94,117,39,185,147,234,79,24,167,215,98,183,40,209, +85,253,30,38,250,44,233,78,228,115,222,199,188,43,24,165,151,226,157,238,243, +238,179,11,87,73,30,5,87,73,30,5,87,201,73,174,60,75,201,251,74,13,236,208,44, +56,149,143,137,169,24,227,219,237,211,197,159,96,164,100,200,140,221,154,32, +67,60,192,108,41,237,63,192,41,65,119,199,125,225,126,5,255,64,159,222,37,87, +109,56,95,141,243,118,251,207,197,95,18,153,95,125,105,241,191,44,254,72,116, +160,143,22,67,14,253,182,58,218,197,218,234,191,243,158,241,152,128,147,57, +199,121,134,186,128,3,25,242,141,177,134,202,184,132,13,73,215,57,153,246,160, +47,186,113,62,200,80,47,199,109,233,153,10,254,157,236,190,22,115,31,9,155,60, +99,111,183,95,76,163,96,236,171,44,225,124,149,40,87,252,201,238,98,179,195, +79,72,39,60,100,85,250,28,71,251,170,87,238,113,53,155,105,254,35,31,186,46, +143,170,190,172,147,248,9,214,124,226,231,136,1,59,37,121,181,13,158,236,203, +120,152,147,71,19,243,19,146,193,63,227,151,246,214,98,211,95,181,15,86,108, +220,35,50,171,31,143,108,213,92,20,172,249,230,227,11,88,208,93,246,0,159,112, +39,214,249,101,173,196,15,112,109,157,215,216,204,81,100,230,39,75,116,148, +237,144,79,53,3,87,123,87,234,187,174,156,18,6,156,113,87,237,129,243,200,185, +198,115,202,97,197,93,93,247,5,254,89,188,252,60,151,187,159,83,61,106,12,29, +51,219,124,34,119,50,237,3,61,200,16,131,254,46,169,62,241,185,235,171,246, +211,101,37,14,167,53,138,185,154,223,154,83,159,95,215,42,118,155,158,188,87, +203,4,185,96,140,183,106,164,132,173,189,48,244,64,26,169,95,213,103,126,56, +170,118,31,205,203,107,102,221,213,245,234,188,194,78,107,148,145,213,230,137, +235,188,136,239,227,197,246,204,63,229,206,214,84,137,114,181,249,12,239,172, +243,170,206,185,74,242,40,184,74,242,40,184,74,110,183,111,177,171,42,87,158, +165,228,125,165,6,44,120,144,73,67,62,54,115,197,24,127,150,95,52,127,198,254, +140,23,185,223,16,221,85,27,206,95,123,209,108,100,200,55,198,26,42,227,18,54, +36,93,231,100,90,215,127,238,126,69,198,56,75,246,172,76,134,122,57,110,75, +207,84,240,239,100,247,181,152,61,66,191,253,215,98,28,166,91,107,31,31,129, +208,155,255,97,87,65,31,167,27,4,56,231,24,125,170,212,241,92,179,18,15,116, +112,173,209,140,255,56,97,136,171,107,35,190,105,47,130,43,246,147,230,39,152, +107,227,129,228,195,197,154,191,121,63,234,126,206,58,191,58,157,3,176,143, +117,162,30,92,163,198,0,106,103,198,146,103,223,163,118,147,239,96,207,233, +148,71,215,225,204,83,13,108,230,135,51,112,212,223,99,80,98,60,189,166,19, +246,211,39,189,5,127,148,162,103,122,252,115,47,64,171,190,240,97,164,246,121, +238,217,217,87,167,220,3,90,223,37,145,156,247,126,9,187,17,71,240,132,71,252, +181,38,192,193,119,91,111,115,239,49,214,33,114,16,56,158,1,129,59,249,132,49, +228,31,10,214,251,164,18,253,113,92,212,16,54,156,24,71,237,11,222,179,29,155, +237,56,19,83,107,50,219,99,125,61,78,16,99,128,141,192,89,157,64,91,18,121, +201,56,183,87,251,240,211,182,238,28,115,206,31,184,219,114,202,251,146,235, +106,190,89,75,237,211,25,199,28,214,56,118,204,38,189,34,143,124,79,231,133, +238,159,169,102,179,205,39,114,39,211,62,208,131,12,81,244,50,3,53,168,123, +169,159,101,148,165,115,21,180,116,97,155,189,135,154,125,210,114,202,121,167, +179,253,247,22,255,214,226,222,3,228,189,90,38,200,5,99,188,85,35,37,44,123,1, +107,195,223,143,90,175,68,143,118,191,217,67,244,21,18,245,131,57,240,30,203, +245,14,57,251,83,115,20,235,193,159,156,7,250,192,61,7,137,174,151,253,244, +125,76,251,148,123,236,49,7,76,223,177,14,40,98,9,121,95,11,204,188,229,179, +170,230,46,143,126,121,49,124,1,127,197,100,213,102,196,0,174,123,62,98,1,206, +81,129,207,92,37,121,20,92,37,252,243,27,23,255,210,226,239,218,227,9,247,23, +139,191,167,201,149,103,41,121,95,169,97,43,16,200,164,33,31,155,185,98,140, +125,211,149,41,134,204,216,173,9,50,196,3,204,150,210,254,3,156,18,116,119,28, +27,6,5,196,38,255,176,52,203,158,209,201,80,129,35,95,141,19,27,43,31,64,170, +173,58,208,243,195,141,184,126,88,146,247,140,199,4,156,204,57,206,51,212,5, +28,200,144,111,140,53,84,198,37,108,72,186,206,201,180,174,231,161,136,220, +242,32,173,249,31,230,131,12,245,114,220,150,158,169,224,223,201,238,107,48, +247,43,246,211,191,46,158,111,38,224,210,155,251,39,110,44,249,197,135,57,246, +195,187,30,232,216,55,245,198,155,111,98,100,224,40,235,123,164,227,123,29,65, +220,35,42,85,220,116,163,11,44,230,158,94,186,238,88,203,105,224,251,126,212, +156,101,157,95,69,47,170,158,246,177,14,111,126,252,201,155,120,189,201,149, +186,152,79,252,76,24,216,112,155,206,88,11,103,34,117,170,1,199,218,113,227, +39,195,38,124,204,190,179,254,240,5,120,228,197,53,192,195,78,127,137,239,241, +250,56,159,245,180,237,118,180,182,142,167,76,111,208,96,175,79,72,48,6,62, +247,87,216,86,63,240,64,24,15,65,244,193,57,234,135,177,218,2,23,189,213,134, +154,222,47,248,226,83,253,10,77,228,198,37,96,250,88,177,136,17,164,117,226, +90,250,197,42,215,2,86,115,130,235,79,6,28,108,33,39,140,81,253,81,108,206,11, +56,112,90,111,226,212,166,227,166,190,0,14,132,254,236,251,4,76,123,136,209, +99,14,123,189,30,88,15,113,2,115,90,87,235,4,142,156,62,239,91,114,237,63,204, +163,143,154,239,222,47,61,135,176,11,251,245,133,20,125,133,252,217,158,95,28, +125,243,28,151,123,129,204,152,249,121,46,215,184,85,78,221,111,46,246,94,65, +188,245,92,156,109,62,145,59,153,246,129,30,100,136,162,223,35,248,197,179,50, +244,32,200,17,79,244,23,123,31,249,2,155,212,236,168,109,214,149,251,166,247, +6,114,206,103,205,44,71,238,32,199,11,73,215,147,187,132,210,166,49,167,14, +148,176,209,35,248,137,117,115,93,216,123,238,91,254,210,162,230,66,251,155, +57,64,159,178,183,181,167,57,47,114,174,54,185,94,228,93,123,146,243,194,166, +174,23,126,178,255,40,245,216,32,39,114,190,7,208,255,243,53,230,212,121,190, +7,127,97,49,112,95,94,156,251,7,107,241,10,235,195,103,196,133,121,244,79,115, +2,102,206,208,31,245,30,9,198,92,236,217,220,83,25,19,92,37,121,20,92,37,252, +243,231,23,255,227,98,212,156,26,197,128,111,183,111,93,252,223,77,174,204,63, +127,120,241,15,236,107,240,183,217,207,61,82,195,187,61,135,205,28,87,193,181, +144,96,223,116,89,218,177,81,152,224,90,140,9,227,246,179,52,143,148,117,93, +54,111,108,126,109,236,71,54,170,95,224,171,113,98,110,158,175,218,110,91,55, +229,99,28,214,238,15,182,192,101,201,204,147,159,170,119,174,235,214,145,242, +85,155,224,138,197,88,245,206,125,253,110,87,49,147,29,93,43,122,128,15,45, +185,7,174,231,225,10,238,132,81,126,75,187,47,197,196,149,223,92,112,40,70, +239,241,227,88,80,237,205,24,43,142,57,70,127,230,131,223,57,251,0,242,131, +188,98,185,199,106,141,10,126,60,175,136,227,30,217,24,144,161,92,207,195,254, +186,159,224,105,109,106,230,253,120,202,81,88,142,94,84,61,237,99,29,172,7,76, +60,44,214,189,83,234,98,62,241,51,97,226,91,244,208,98,30,234,207,30,208,121, +224,136,25,55,90,127,57,128,6,63,33,207,190,179,254,243,249,168,177,168,52, +199,235,82,92,159,94,198,172,174,133,225,15,108,247,223,60,245,57,240,131,121, +87,108,228,34,247,67,217,55,150,99,142,194,142,105,236,227,56,80,210,203,188, +222,47,241,240,17,181,38,135,13,151,128,59,214,235,1,214,220,179,22,243,67,30, +243,69,198,117,206,7,113,181,54,248,137,241,248,155,192,251,72,115,222,207, +224,218,31,97,211,37,96,174,15,158,115,0,158,239,29,92,91,99,6,135,61,231,9, +167,122,248,133,126,96,252,213,30,115,3,189,214,235,180,71,97,131,125,114,194, +173,145,228,48,108,247,117,177,158,246,233,156,31,173,1,57,252,80,156,175,203, +207,115,185,250,166,114,112,206,49,215,87,137,235,115,239,156,229,107,164,100, +218,7,122,144,33,138,126,143,230,62,155,242,130,156,151,60,155,29,181,77,12, +242,59,245,6,108,66,247,232,69,243,43,109,30,217,175,114,223,240,163,184,30, +188,80,194,254,142,253,137,120,248,133,33,198,170,103,44,200,79,223,179,212, +133,47,90,163,58,143,159,58,15,189,153,251,152,186,200,239,35,157,174,199,62, +65,14,225,11,214,197,56,214,247,158,171,125,196,223,46,194,166,227,129,123,92, +95,206,243,61,228,115,122,143,242,12,2,102,162,83,191,249,217,235,177,128,32, +131,63,158,235,184,31,199,108,231,239,94,252,199,77,122,187,253,219,226,31, +219,163,224,60,2,225,207,127,88,252,125,54,186,221,190,121,241,9,215,229,202, +183,219,175,217,159,164,95,89,12,233,191,47,254,38,199,168,1,75,52,200,164,33, +7,225,79,77,228,244,235,99,16,48,254,48,227,212,55,97,52,18,154,222,41,63,228, +16,131,66,84,202,47,154,113,163,81,255,88,92,109,136,110,43,214,155,109,160, +49,185,65,92,235,220,227,68,28,249,175,6,16,247,78,127,117,118,49,214,161,237, +140,235,7,56,229,110,23,135,152,147,111,16,167,233,219,55,95,23,243,188,38, +204,161,226,230,60,209,191,107,54,249,48,51,247,195,243,90,131,185,54,106,3, +91,240,49,242,64,59,234,91,254,107,76,125,141,156,67,173,11,37,113,160,101,28, +242,201,252,100,92,248,219,109,97,109,198,31,227,186,62,236,42,6,177,228,58, +244,181,29,167,107,99,62,236,40,209,174,99,34,43,240,195,237,193,14,248,233, +11,205,226,152,151,113,145,179,45,85,90,146,106,87,215,39,134,154,147,253,132, +55,174,251,142,56,238,17,149,230,243,160,249,153,120,182,217,215,38,115,45, +149,128,53,103,89,231,87,209,35,170,15,223,176,119,80,183,240,145,31,197,166, +186,88,254,206,24,216,209,26,130,145,35,200,249,83,231,129,115,204,209,31,180, +9,249,195,51,204,9,215,139,35,231,121,206,84,139,158,211,130,115,194,245,102, +248,54,157,111,181,23,34,142,124,62,192,247,156,111,112,206,167,174,25,245, +235,56,80,210,203,188,30,27,250,45,226,131,222,53,196,246,47,92,106,206,176, +22,30,82,240,133,0,228,208,71,45,52,39,113,142,99,46,244,96,218,209,124,100, +28,108,194,94,172,153,207,136,184,162,62,206,49,126,168,161,95,240,83,123,48, +242,228,18,242,51,189,97,156,182,36,114,88,251,32,226,1,71,254,116,175,7,198, +115,135,223,96,16,215,251,10,24,61,103,129,59,253,45,12,196,12,189,83,183,151, +71,152,211,123,20,28,47,235,172,3,123,100,250,82,174,246,125,244,131,226,214, +44,203,31,63,207,229,90,67,149,131,35,127,145,95,213,107,125,178,28,53,70,46, +71,223,156,48,22,93,211,131,12,33,122,65,51,103,61,79,222,215,209,95,121,63, +90,158,155,109,212,207,109,214,90,114,126,191,143,184,220,185,214,150,236,87, +225,23,165,29,203,26,79,52,229,151,123,200,125,86,61,99,97,31,65,162,107,69, +46,88,115,141,149,243,162,87,117,30,117,209,115,125,30,124,130,205,199,47,154, +170,139,252,97,77,167,56,107,232,127,127,63,209,216,226,154,121,8,84,175,7, +253,192,243,43,176,156,95,49,209,243,192,226,217,20,185,2,158,62,213,30,208, +124,169,221,240,9,215,196,196,28,191,250,206,197,127,184,248,239,23,255,248, +93,234,124,187,125,126,241,31,217,149,190,112,118,220,143,44,254,171,61,250, +179,197,191,106,215,29,199,171,42,87,190,221,254,103,241,183,239,209,31,64, +176,232,119,23,223,231,169,1,219,72,32,147,134,28,132,160,189,32,209,56,138, +33,14,73,226,139,7,37,248,217,15,15,202,129,139,34,247,98,196,92,74,176,46, +198,121,3,177,41,189,113,92,202,130,233,129,194,195,25,182,216,188,170,11,27, +216,212,104,18,31,51,22,199,57,247,56,49,158,30,6,222,229,69,51,252,153,55, +205,244,96,139,121,190,41,32,65,126,65,192,99,12,253,84,15,207,173,199,239, +227,233,48,98,172,33,197,26,192,78,177,168,77,72,35,166,140,13,191,40,241,56, +114,173,137,197,218,92,207,165,161,131,47,186,94,62,20,162,7,152,251,94,175, +208,81,2,59,176,87,111,150,208,123,157,32,137,121,129,193,92,30,204,148,248, +203,177,247,60,226,200,118,233,31,228,200,19,230,245,131,246,202,218,249,102, +22,120,181,19,135,163,175,135,235,168,101,223,143,176,3,157,82,255,102,84,115, +182,36,149,12,157,241,169,102,134,161,166,199,21,120,165,211,30,69,76,74,140, +43,244,201,207,205,200,133,211,212,123,117,109,165,105,63,70,238,179,206,175, +78,49,186,111,32,248,100,26,203,77,207,95,234,135,11,24,228,197,109,198,250, +148,229,126,228,92,173,15,240,200,55,100,152,3,121,245,189,249,3,194,245,102, +246,155,74,122,45,96,131,123,229,1,78,9,227,197,140,109,62,47,149,124,157,156, +43,158,111,208,129,216,47,208,228,7,11,93,79,243,151,109,129,139,94,230,209, +79,197,198,126,196,250,158,111,48,207,144,26,19,207,10,173,37,174,193,88,139, +117,225,250,60,67,242,126,246,43,207,231,189,199,246,167,226,96,11,113,224, +139,15,218,123,140,101,237,66,19,218,176,101,253,177,57,242,228,18,242,51,189, +98,156,17,11,243,87,207,48,230,216,235,11,162,143,138,227,217,169,125,22,215, +181,6,196,42,99,237,233,57,0,117,209,231,5,216,205,231,17,217,175,162,238,148, +102,123,113,159,80,154,94,160,176,78,93,119,58,47,217,155,117,157,147,92,253, +83,57,56,231,111,250,210,39,116,89,14,31,145,147,108,179,230,88,107,69,54,31, +149,12,33,250,125,21,61,84,109,176,39,225,83,212,35,239,199,121,127,240,188, +128,110,252,210,96,240,229,46,119,50,109,214,107,204,225,23,198,61,246,30,188, +80,194,62,203,99,244,20,226,165,87,174,203,207,10,57,86,230,32,114,164,243, +168,139,253,174,243,184,30,230,33,190,233,183,150,81,47,237,107,234,188,135, +160,7,107,143,195,143,211,47,83,208,95,32,204,197,23,114,196,6,245,58,50,6, +216,198,26,92,167,98,34,183,136,7,140,181,96,27,126,78,47,175,88,211,113,81, +95,202,152,71,174,249,21,153,243,19,139,127,127,49,98,248,185,197,212,184,62, +112,126,245,29,139,255,124,241,223,44,254,98,194,128,111,183,63,93,252,179, +123,244,189,139,241,79,167,190,110,192,241,170,202,149,187,228,235,239,215,91, +162,6,118,123,142,7,11,254,244,100,59,77,15,37,94,56,149,66,86,31,24,128,241, +132,158,214,76,152,205,180,175,146,104,186,74,108,96,199,69,195,240,70,169, +205,18,54,80,104,151,198,6,113,137,115,143,19,243,242,122,196,189,246,69,19, +62,210,30,52,115,163,158,94,52,105,151,146,136,161,142,243,188,138,3,79,185, +158,112,145,187,231,88,200,128,173,113,95,171,53,184,231,94,235,8,251,216,136, +188,137,67,170,7,88,244,0,252,154,254,189,91,232,40,153,99,139,67,217,125,166, +79,122,32,18,3,63,193,176,7,140,31,110,115,30,232,159,199,16,135,167,214,63, +236,250,218,188,214,181,227,42,247,181,218,225,225,232,107,121,223,199,56,219, +3,65,167,245,116,219,15,95,26,42,45,76,181,27,123,103,227,241,51,201,31,224, +141,181,198,129,211,28,145,21,87,252,44,204,122,86,233,180,54,153,107,169,4, +172,57,203,58,191,138,126,83,125,248,230,191,157,138,56,248,81,108,170,139, +229,239,49,6,140,26,227,39,227,36,10,215,211,153,94,99,6,30,243,127,106,49, +228,167,51,236,238,15,8,215,139,35,231,121,142,203,149,250,77,95,231,47,137, +19,174,55,51,158,62,79,123,193,253,135,159,57,87,241,64,229,56,80,251,171,149, +178,38,98,100,253,76,99,31,199,129,146,94,230,209,31,197,198,76,205,95,228, +190,246,56,207,10,96,112,175,192,156,120,49,241,90,146,25,183,238,253,136,19, +126,248,189,198,114,154,112,121,69,207,7,113,212,78,54,177,158,231,154,49,43, +142,53,84,95,193,145,39,151,144,159,233,117,93,228,0,117,189,175,93,98,169, +245,5,211,87,173,111,63,95,163,231,234,153,184,70,78,91,50,251,153,237,129, +231,125,16,254,69,221,49,230,39,112,212,71,15,115,93,238,105,197,177,71,188, +110,32,228,157,185,87,220,142,3,63,69,118,150,107,13,85,14,142,53,25,111,173, +1,239,59,253,204,62,201,163,174,78,245,140,50,31,149,32,187,235,35,167,103, +159,184,6,242,173,117,243,171,208,81,26,26,198,10,155,111,251,162,153,107,166, +212,238,73,219,204,72,5,187,165,36,140,69,7,202,251,50,235,253,10,126,229,243, +149,57,136,115,70,231,81,135,188,241,60,211,121,92,135,123,5,18,173,187,247, +130,238,3,151,112,127,98,45,248,226,82,239,127,124,17,70,155,167,254,34,123, +77,113,15,131,45,196,14,27,136,63,63,111,228,61,9,61,158,203,234,253,11,115, +245,221,72,233,227,161,223,216,51,186,38,53,204,47,175,153,211,152,243,235, +246,39,34,9,75,217,46,56,143,190,127,241,63,45,254,235,36,5,223,110,63,36,35, +240,15,46,254,134,36,1,251,85,149,43,207,82,242,190,82,3,187,5,199,38,68,81, +88,112,50,174,167,135,146,218,0,51,150,24,54,166,115,63,96,58,198,237,171,68, +215,200,216,233,191,76,142,194,230,166,159,108,196,6,113,137,115,143,19,243, +152,159,140,123,205,139,38,54,12,190,93,136,27,73,111,84,230,70,101,148,135, +93,74,34,134,58,206,243,42,14,60,229,122,194,157,106,60,97,195,191,140,189,86, +107,112,207,125,228,134,135,16,24,235,96,227,231,154,68,15,208,7,237,1,176, +234,40,153,99,203,118,226,129,91,123,56,247,27,94,24,224,51,236,210,30,190, +173,170,15,46,156,3,12,106,63,191,104,242,192,244,181,127,116,49,236,95,249, +109,37,244,129,137,7,170,137,114,222,192,244,11,107,210,39,50,235,166,184,176, +91,235,73,238,251,60,246,142,226,220,247,154,163,130,31,207,43,226,238,62,56, +25,202,245,131,159,134,225,53,215,246,145,243,180,54,53,61,15,96,205,89,214, +249,149,247,71,205,117,244,93,244,3,214,56,61,36,221,235,98,62,105,156,3,102, +49,226,139,127,26,16,178,233,76,175,245,113,223,156,243,94,102,94,153,191,144, +58,99,45,196,82,207,31,141,55,52,53,214,199,189,229,121,122,246,111,52,125, +173,158,79,238,45,229,169,126,204,49,71,136,7,122,224,96,167,174,91,243,238, +76,127,84,146,103,122,254,34,143,53,23,244,213,237,35,111,192,122,141,48,199, +231,51,167,234,91,156,77,172,5,49,184,174,15,104,199,88,77,222,109,134,157, +141,1,37,220,92,107,92,67,150,247,65,204,138,181,179,94,207,67,143,197,52,109, +221,192,42,119,187,244,29,182,38,202,53,187,98,15,204,248,188,255,192,145,3, +197,209,94,207,79,141,67,251,130,60,219,139,251,128,51,252,235,231,205,178, +254,48,95,248,169,114,174,199,251,142,202,193,156,227,189,215,109,174,209,139, +214,114,185,115,213,175,81,37,67,184,158,243,243,62,84,61,152,122,228,79,235, +166,136,200,119,63,47,184,199,14,126,153,116,144,59,153,54,235,53,230,240,11, +227,190,6,8,126,77,84,239,95,123,69,18,198,162,211,115,155,125,167,250,232,35, +234,245,89,35,246,125,175,55,117,145,123,157,199,245,98,223,107,108,140,63, +246,18,176,174,211,222,163,196,25,182,64,189,78,100,29,121,156,176,129,251,32, +100,176,11,121,222,187,81,11,224,97,155,177,42,134,177,196,252,192,18,81,125, +161,14,28,185,225,53,206,29,216,232,251,153,127,242,223,101,222,110,255,188, +248,139,38,115,125,198,225,37,242,47,23,255,237,226,159,52,217,140,235,92,37, +39,185,242,44,37,239,43,53,176,91,112,104,66,38,0,201,195,8,63,65,211,67,9, +146,116,191,209,44,6,150,227,140,67,98,33,247,102,193,207,47,23,12,230,198, +195,54,127,98,156,55,16,155,25,69,99,195,82,138,185,249,155,4,226,96,131,7, +109,111,122,248,174,54,96,147,235,59,206,153,216,104,36,174,199,185,25,247,46, +127,117,54,114,167,190,18,135,181,167,7,219,176,75,137,218,203,227,60,175,226, +192,140,81,113,145,39,176,75,79,53,134,77,200,21,203,185,122,112,16,123,173, +214,196,210,47,149,134,142,255,35,24,71,248,201,92,184,62,122,128,242,238,135, +251,12,127,32,193,79,208,163,7,2,124,41,192,24,251,77,200,243,10,140,251,5,44, +198,253,55,47,145,95,196,135,181,217,83,122,8,231,67,31,220,49,140,19,54,180, +159,243,141,42,252,167,239,193,240,147,123,83,165,17,139,199,225,243,115,141, +34,238,90,123,224,49,174,125,18,113,134,116,142,235,132,175,24,226,184,71,214, +200,201,80,174,63,251,9,198,120,234,189,180,182,217,164,230,180,31,35,103,42, +231,218,96,206,235,125,232,185,197,122,144,32,231,216,15,211,111,249,106,93, +122,62,58,198,237,105,220,184,158,206,244,169,62,62,31,185,203,245,100,108, +174,71,124,174,241,92,63,250,235,116,22,175,147,161,20,119,174,153,207,167, +108,190,177,43,30,254,193,70,253,150,29,235,43,110,170,31,125,227,8,118,160,7, +142,222,6,238,116,95,137,181,21,155,237,194,15,96,136,51,173,125,2,223,207, +129,26,31,214,196,189,174,251,22,249,242,250,68,254,114,47,170,79,41,86,147, +103,155,94,23,239,217,96,237,71,158,77,218,83,190,246,248,91,161,125,21,107, +103,125,61,51,179,182,239,3,172,171,56,230,77,99,102,143,41,135,127,125,159, +34,102,232,21,55,253,213,237,154,27,175,111,142,135,185,1,22,118,230,60,131, +117,62,37,115,79,229,88,206,121,118,220,156,175,238,39,115,254,65,203,7,184, +230,175,238,197,243,90,115,12,11,165,132,177,232,154,30,100,8,215,247,126,203, +122,176,230,60,228,180,197,17,124,227,115,163,250,77,219,228,26,143,207,231, +167,201,157,76,155,245,134,217,87,169,23,246,71,113,61,120,161,130,221,82,18, +198,162,243,88,98,31,169,158,53,155,251,39,242,203,243,71,231,81,7,223,121, +134,246,121,145,215,171,186,216,239,92,143,236,190,129,40,175,245,136,243,50, +124,213,53,244,218,145,96,230,3,115,192,184,230,218,138,97,126,16,39,116,176, +133,151,87,216,155,115,173,57,161,93,16,122,31,191,180,192,79,80,190,79,198, +108,240,231,22,255,201,226,233,55,149,248,13,230,223,45,254,233,197,161,81,12, +56,143,130,171,228,36,87,158,165,228,125,165,6,44,41,32,147,134,28,132,4,59, +161,24,108,56,197,16,135,68,251,191,69,3,225,97,35,55,24,152,141,228,9,6,193, +94,46,48,49,186,46,48,88,59,63,0,230,27,174,19,27,73,15,57,54,67,52,147,54,98, +222,72,78,241,141,191,227,156,105,159,27,146,140,88,122,12,239,254,159,1,121, +252,57,102,202,255,239,95,52,231,60,241,70,84,107,28,54,241,159,38,57,49,71, +154,123,240,213,90,131,123,238,195,86,247,45,31,138,221,255,156,195,238,199, +220,235,249,208,98,143,99,204,79,197,192,95,198,93,231,212,60,100,172,251,89, +255,7,53,191,242,253,131,159,185,215,233,15,214,80,226,154,25,195,27,251,146, +216,190,167,6,12,63,114,110,88,79,223,215,78,253,165,33,226,174,181,152,207, +130,136,67,41,234,171,113,61,194,43,134,56,238,145,53,114,90,242,176,21,126, +130,129,83,98,79,43,2,204,181,239,181,52,155,212,112,45,197,130,117,95,101, +185,247,24,215,233,125,224,185,99,109,201,30,119,61,11,166,186,124,117,192, +232,254,158,236,35,7,87,95,52,193,192,247,60,69,94,39,191,184,94,175,105,242, +199,201,80,138,59,247,22,40,246,97,207,231,189,23,132,49,102,92,46,233,251,31, +84,31,204,233,27,71,88,15,121,69,172,244,54,112,167,243,18,52,190,84,137,93, +159,67,255,76,107,159,132,223,87,222,23,90,203,199,243,181,118,49,7,177,32, +135,218,3,234,83,138,213,228,221,230,68,185,71,162,134,138,71,206,123,95,196, +40,214,206,122,208,148,95,16,99,87,44,235,171,235,18,83,206,87,167,45,113,251, +211,111,202,107,143,195,118,143,131,235,122,126,65,243,89,200,126,73,251,205, +252,224,167,218,211,62,61,157,173,213,191,211,254,131,111,124,46,202,114,224, +115,253,40,119,187,253,188,96,125,225,27,99,232,107,33,46,172,85,207,68,248,0, +155,89,190,102,43,97,44,186,166,7,25,194,245,241,98,194,30,179,25,246,241,17, +8,241,192,95,141,147,182,56,10,159,53,199,148,99,222,39,83,239,218,124,126, +154,220,201,180,89,111,152,125,21,126,81,218,176,219,204,72,5,187,165,36,140, +69,231,61,133,122,247,30,166,46,124,209,125,80,231,169,221,152,199,123,143, +230,142,186,232,187,71,58,93,143,123,196,243,174,4,31,84,158,239,147,236,75, +216,140,243,154,236,251,104,222,67,244,69,207,140,254,69,18,109,143,252,36, +215,32,252,84,109,176,214,160,234,200,159,111,146,219,237,183,101,20,92,37, +121,20,92,37,39,185,242,44,37,239,43,53,96,73,1,153,52,228,32,29,145,235,161, +11,102,19,116,174,155,112,42,76,181,119,42,94,95,55,143,148,249,225,168,218, +83,159,102,191,163,41,171,230,20,103,245,13,227,44,243,171,217,246,235,237, +134,60,75,102,158,236,169,222,185,226,78,53,1,107,62,193,122,192,40,14,92,177, +179,93,222,28,170,116,242,213,175,38,157,174,85,215,185,26,95,197,213,81,72, +85,147,117,19,215,60,76,254,131,231,24,112,64,225,80,197,225,202,149,93,115, +178,163,113,20,140,211,93,86,99,190,226,27,57,143,42,95,141,121,177,249,195, +79,72,39,124,245,21,44,56,167,53,82,28,101,62,170,252,196,38,56,205,127,132, +175,186,98,231,37,57,121,106,11,124,5,51,113,157,7,46,115,83,204,224,62,39, +143,38,230,39,36,195,26,160,53,202,184,58,202,140,115,6,15,11,124,96,80,141, +216,55,187,161,201,254,199,222,202,156,235,211,109,220,53,246,9,201,201,30, +184,214,252,145,93,112,181,93,71,207,88,231,151,124,39,206,245,60,250,100,242, +87,218,76,58,101,181,231,18,29,101,59,228,235,235,190,168,190,160,132,1,215, +154,157,214,230,39,36,215,214,29,113,230,199,107,237,93,245,143,247,146,254, +207,20,124,126,205,227,73,14,174,190,85,159,248,92,128,123,123,126,169,61,219, +180,28,56,153,246,129,30,100,8,215,235,179,214,146,52,61,49,208,241,37,42,228, +196,6,10,47,36,231,223,126,215,56,125,62,63,77,238,100,218,172,55,76,147,80, +218,52,219,204,72,5,187,165,36,140,69,231,177,204,47,212,124,89,71,252,124,89, +215,88,227,165,137,47,154,90,63,206,139,231,64,181,201,245,34,239,154,87,206, +11,155,186,94,237,175,19,215,62,186,58,175,214,49,230,113,143,76,152,53,122, +68,134,86,124,216,68,252,250,69,144,19,214,202,243,98,118,230,42,201,163,224, +42,201,163,224,42,57,201,149,103,41,121,95,169,129,157,150,158,152,45,78,84, +49,155,183,54,19,228,130,25,113,134,120,130,1,25,234,2,14,100,200,3,46,233,88, +120,20,151,5,38,163,201,251,95,107,35,111,43,153,32,23,140,225,246,135,227,56, +152,250,161,69,222,150,50,25,170,224,246,71,101,38,191,66,192,201,156,227,60, +67,93,192,129,12,169,88,61,96,150,68,169,97,215,72,105,75,231,23,77,193,134, +164,235,156,76,123,208,23,221,56,31,100,168,151,227,182,244,76,5,127,205,46, +15,246,248,38,245,62,211,62,215,237,28,48,78,5,123,213,230,17,231,100,232,55, +198,27,34,99,174,224,182,116,166,130,125,58,7,58,193,37,60,126,138,236,46,119, +50,237,3,189,146,33,159,96,13,241,4,51,145,205,202,243,158,206,133,94,176,79, +241,32,155,113,97,142,161,174,224,20,1,174,15,25,135,121,32,67,62,193,93,193, +128,10,238,205,176,32,67,191,0,95,201,102,95,152,123,21,7,186,138,125,37,174, +97,77,155,245,13,163,4,157,224,142,88,67,189,63,123,159,125,156,255,85,191, +195,190,49,233,53,249,93,231,132,177,232,64,124,96,215,151,14,242,140,223,114, +39,211,170,62,158,169,130,53,14,127,214,218,186,209,134,190,240,132,220,176, +160,45,113,76,188,38,40,166,218,220,58,147,14,114,39,211,102,125,195,56,65,46, +24,227,173,26,169,96,183,148,132,177,232,52,170,254,75,16,214,12,177,159,190, +212,134,30,148,127,251,29,114,126,249,167,117,137,245,80,27,218,118,9,125,192, +28,62,143,235,122,235,234,10,149,57,239,52,47,141,40,105,152,71,100,232,130, +79,163,19,235,188,170,115,174,146,60,10,174,146,60,10,174,146,147,92,121,150, +146,247,149,26,216,105,233,137,217,226,68,21,179,121,107,51,65,46,152,17,103, +136,39,24,144,161,46,224,64,134,60,224,146,238,11,247,43,52,189,19,155,191,31, +136,224,109,37,19,228,130,49,220,254,112,204,67,15,196,13,121,56,108,43,25, +170,224,246,71,101,38,191,66,192,201,156,227,60,67,93,192,129,12,169,88,30, +204,95,123,209,124,64,5,127,205,110,28,222,143,110,158,38,171,116,5,227,84, +176,87,109,30,113,78,134,126,99,188,33,50,230,10,110,75,103,42,216,167,115, +160,19,92,194,227,167,200,238,114,39,211,62,208,43,25,242,9,214,16,79,48,19, +217,172,60,239,233,92,232,5,251,20,15,178,25,23,230,24,234,2,174,146,205,186, +56,207,144,79,112,87,48,160,130,123,51,44,200,208,47,192,87,178,217,23,230,94, +197,129,174,98,95,137,107,88,211,102,125,195,40,65,39,184,35,214,80,239,207, +222,103,31,199,47,47,63,176,231,32,149,239,249,38,189,38,191,235,156,48,22, +221,171,215,114,50,173,234,243,51,155,83,252,51,6,95,111,177,211,26,85,27,87, +94,52,201,249,153,109,35,206,126,155,116,144,59,153,54,235,27,198,9,114,193, +24,111,213,72,5,187,165,36,140,69,103,250,52,210,56,37,135,198,58,55,158,157, +201,143,230,229,154,103,221,213,245,214,213,21,42,115,222,116,158,33,158,96, +148,12,253,2,188,147,205,242,57,58,91,185,74,242,40,184,74,242,40,184,74,78, +114,229,89,74,182,63,111,183,255,5,75,238,218,119,32,100,170,216,0,0,0,0,73, +69,78,68,174,66,96,130 }; +static const char* +default_charset = R"( abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.!?;:-_/|\!'"+=*()[]{}&%$#@<>^`~)"; +#include "libjin/jin.h" + +static const JinEngine::Graphics::Color default_font_split(255, 0, 255, 255); |