diff options
| author | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-07-07 13:22:53 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi92@disroot.org> | 2025-07-25 14:16:41 +0200 |
| commit | 14f60e4fd65c42f126eaee7e09cb4251c167c6ed (patch) | |
| tree | 313b5e16d7d99cf1518c953e2efe5e5fc920dfbf /src/drv/tty | |
| parent | 48a61c16eaa6dcfc75d00dba302537ce1492db98 (diff) | |
| download | wnix-tty.tar.gz | |
wiptty
Diffstat (limited to 'src/drv/tty')
| -rw-r--r-- | src/drv/tty/CMakeLists.txt | 20 | ||||
| -rw-r--r-- | src/drv/tty/include/drv/tty.h | 28 | ||||
| -rw-r--r-- | src/drv/tty/private_include/drv/tty/font.h | 29 | ||||
| -rw-r--r-- | src/drv/tty/private_include/drv/tty/ops.h | 30 | ||||
| -rw-r--r-- | src/drv/tty/private_include/drv/tty/types.h | 39 | ||||
| -rw-r--r-- | src/drv/tty/src/CMakeLists.txt | 27 | ||||
| -rw-r--r-- | src/drv/tty/src/free.c | 39 | ||||
| -rw-r--r-- | src/drv/tty/src/init.c | 58 | ||||
| -rw-r--r-- | src/drv/tty/src/ps1/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | src/drv/tty/src/ps1/ttyfont_tim.c | 705 | ||||
| -rw-r--r-- | src/drv/tty/src/setdim.c | 62 | ||||
| -rw-r--r-- | src/drv/tty/src/update.c | 104 | ||||
| -rw-r--r-- | src/drv/tty/src/write.c | 62 |
13 files changed, 1222 insertions, 0 deletions
diff --git a/src/drv/tty/CMakeLists.txt b/src/drv/tty/CMakeLists.txt new file mode 100644 index 0000000..9661134 --- /dev/null +++ b/src/drv/tty/CMakeLists.txt @@ -0,0 +1,20 @@ +# wanix, a Unix-like operating system for WebAssembly applications. +# Copyright (C) 2025 Xavier Del Campo Romero +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +add_library(drv_tty) +add_subdirectory(src) +target_include_directories(drv_tty PUBLIC include PRIVATE private_include) +target_link_libraries(drv_tty PUBLIC c PRIVATE gfx drv_event) diff --git a/src/drv/tty/include/drv/tty.h b/src/drv/tty/include/drv/tty.h new file mode 100644 index 0000000..49115f5 --- /dev/null +++ b/src/drv/tty/include/drv/tty.h @@ -0,0 +1,28 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef DRV_TTY_H +#define DRV_TTY_H + +#include <drv/event.h> + +struct drv_port *drv_tty_init(const struct drv_event *ev); +int drv_tty_update(struct drv_port *p); +void drv_tty_free(struct drv_port *p); + +#endif diff --git a/src/drv/tty/private_include/drv/tty/font.h b/src/drv/tty/private_include/drv/tty/font.h new file mode 100644 index 0000000..60d9740 --- /dev/null +++ b/src/drv/tty/private_include/drv/tty/font.h @@ -0,0 +1,29 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef DRV_TTY_FONT_H +#define DRV_TTY_FONT_H + +#include <gfx/sprite.h> +#include <stddef.h> + +struct gfx_sprite ttyfont_spr; +extern const unsigned char ttyfont[]; +extern const size_t ttyfont_size; + +#endif diff --git a/src/drv/tty/private_include/drv/tty/ops.h b/src/drv/tty/private_include/drv/tty/ops.h new file mode 100644 index 0000000..1d7cbd2 --- /dev/null +++ b/src/drv/tty/private_include/drv/tty/ops.h @@ -0,0 +1,30 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef DRV_TTY_OPS_H +#define DRV_TTY_OPS_H + +#include <drv/event.h> +#include <drv/tty/types.h> +#include <stddef.h> + +int drv_tty_write(const void *buf, size_t n, const struct drv_event_done *done, + void *args); +int drv_tty_setdim(struct drv_port *p, unsigned x, unsigned y); + +#endif diff --git a/src/drv/tty/private_include/drv/tty/types.h b/src/drv/tty/private_include/drv/tty/types.h new file mode 100644 index 0000000..e8fdd40 --- /dev/null +++ b/src/drv/tty/private_include/drv/tty/types.h @@ -0,0 +1,39 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#ifndef DRV_TTY_TYPES_H +#define DRV_TTY_TYPES_H + +#include <drv/event.h> +#include <stdbool.h> +#include <stddef.h> + +struct row +{ + char *columns; +}; + +struct drv_port +{ + bool init; + struct row *rows, *first_row, *last_row; + size_t nrows, ncolumns, last_column; + struct drv_event ev; +}; + +#endif diff --git a/src/drv/tty/src/CMakeLists.txt b/src/drv/tty/src/CMakeLists.txt new file mode 100644 index 0000000..d0690c8 --- /dev/null +++ b/src/drv/tty/src/CMakeLists.txt @@ -0,0 +1,27 @@ +# wanix, a Unix-like operating system for WebAssembly applications. +# Copyright (C) 2025 Xavier Del Campo Romero +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +target_sources(drv_tty PRIVATE + free.c + init.c + setdim.c + update.c + write.c +) + +if(PS1_BUILD) + add_subdirectory(ps1) +endif() diff --git a/src/drv/tty/src/free.c b/src/drv/tty/src/free.c new file mode 100644 index 0000000..346e706 --- /dev/null +++ b/src/drv/tty/src/free.c @@ -0,0 +1,39 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <drv/event.h> +#include <drv/tty.h> +#include <drv/tty/font.h> +#include <drv/tty/ops.h> +#include <drv/tty/types.h> +#include <gfx/gfx.h> +#include <gfx/sprite.h> +#include <stddef.h> +#include <stdlib.h> + +void drv_tty_free(struct drv_port *const p) +{ + if (!p) + return; + + for (size_t i = 0; i < p->nrows; i++) + free(p->rows[i].columns); + + free(p->rows); + free(p); +} diff --git a/src/drv/tty/src/init.c b/src/drv/tty/src/init.c new file mode 100644 index 0000000..b436cef --- /dev/null +++ b/src/drv/tty/src/init.c @@ -0,0 +1,58 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <drv/event.h> +#include <drv/tty.h> +#include <drv/tty/font.h> +#include <drv/tty/ops.h> +#include <drv/tty/types.h> +#include <gfx/gfx.h> +#include <gfx/sprite.h> +#include <stddef.h> +#include <stdlib.h> +#include <string.h> + +static int load(void *const buf, const size_t n, void *const args) +{ + size_t *const off = args; + + memcpy(buf, ttyfont + *off, n); + *off += n; + return 0; +} + +struct drv_port *drv_tty_init(const struct drv_event *const ev) +{ + size_t off = 0; + struct drv_port *ret = NULL; + + if (!(ret = malloc(sizeof *ret))) + goto failure; + + *ret = (const struct drv_port){.ev = *ev}; + gfx_sprite_load(&ttyfont_spr, load, &off); + + if (drv_tty_setdim(ret, screen_w, screen_h)) + goto failure; + + return ret; + +failure: + drv_tty_free(ret); + return NULL; +} diff --git a/src/drv/tty/src/ps1/CMakeLists.txt b/src/drv/tty/src/ps1/CMakeLists.txt new file mode 100644 index 0000000..0dbe9ef --- /dev/null +++ b/src/drv/tty/src/ps1/CMakeLists.txt @@ -0,0 +1,19 @@ +# wanix, a Unix-like operating system for WebAssembly applications. +# Copyright (C) 2025 Xavier Del Campo Romero +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +target_sources(drv_tty PRIVATE + ttyfont_tim.c +) diff --git a/src/drv/tty/src/ps1/ttyfont_tim.c b/src/drv/tty/src/ps1/ttyfont_tim.c new file mode 100644 index 0000000..ebf22d4 --- /dev/null +++ b/src/drv/tty/src/ps1/ttyfont_tim.c @@ -0,0 +1,705 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +/* Derived from res/font.bmp. See res/orig/LICENSE for details. */ + +#include <drv/tty/font.h> +#include <stddef.h> + +const unsigned char ttyfont[] = { + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x80, 0x02, 0xf2, 0x01, 0x10, 0x00, 0x01, 0x00, 0xe7, 0x18, 0x00, 0x00, + 0x8e, 0x31, 0x18, 0x7b, 0xff, 0x7f, 0x80, 0x08, 0x42, 0x08, 0x42, 0x08, + 0x44, 0x08, 0x42, 0x00, 0x02, 0x10, 0x80, 0x08, 0x42, 0x08, 0x42, 0x08, + 0x42, 0x08, 0x42, 0x08, 0x8c, 0x1f, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, + 0x18, 0x00, 0xa8, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x32, + 0x24, 0x43, 0x10, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x22, + 0x32, 0x20, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x32, 0x24, 0x11, 0x11, 0x11, 0x21, + 0x32, 0x34, 0x10, 0x11, 0x11, 0x21, 0x32, 0x03, 0x12, 0x11, 0x11, 0x21, + 0x03, 0x32, 0x10, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x21, 0x32, + 0x44, 0x34, 0x20, 0x11, 0x21, 0x22, 0x12, 0x21, 0x22, 0x11, 0x21, 0x32, + 0x44, 0x03, 0x12, 0x11, 0x11, 0x11, 0x21, 0x03, 0x11, 0x11, 0x11, 0x21, + 0x43, 0x03, 0x10, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x00, 0x01, 0x10, 0x11, 0x21, 0x42, 0x04, 0x42, 0x04, 0x12, 0x21, 0x43, + 0x40, 0x30, 0x03, 0x11, 0x21, 0x44, 0x10, 0x22, 0x03, 0x11, 0x21, 0x43, + 0x00, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x00, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x21, 0x44, + 0x40, 0x00, 0x00, 0x11, 0x21, 0x33, 0x20, 0x42, 0x00, 0x11, 0x21, 0x44, + 0x20, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x21, 0x40, 0x04, 0x40, 0x04, 0x10, 0x21, 0x43, + 0x40, 0x20, 0x12, 0x11, 0x21, 0x00, 0x22, 0x04, 0x10, 0x11, 0x21, 0x43, + 0x22, 0x04, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x21, 0x30, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x11, 0x21, 0x42, + 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x42, 0x04, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x24, 0x42, 0x04, 0x12, 0x11, 0x02, + 0x40, 0x40, 0x03, 0x11, 0x11, 0x22, 0x04, 0x20, 0x22, 0x11, 0x21, 0x43, + 0x00, 0x40, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x21, 0x22, + 0x42, 0x40, 0x04, 0x11, 0x21, 0x42, 0x00, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x21, 0x40, 0x04, 0x40, 0x04, 0x10, 0x21, 0x33, + 0x40, 0x40, 0x03, 0x11, 0x21, 0x03, 0x10, 0x32, 0x03, 0x11, 0x21, 0x43, + 0x22, 0x42, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x21, 0x30, + 0x44, 0x34, 0x00, 0x11, 0x21, 0x00, 0x11, 0x02, 0x00, 0x11, 0x21, 0x30, + 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x44, 0x20, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x02, 0x00, 0x11, 0x11, 0x02, + 0x30, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, + 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x43, 0x03, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x30, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x00, 0x10, 0x11, 0x11, 0x21, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x12, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x22, 0x22, 0x11, 0x11, 0x11, 0x21, 0x30, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x11, 0x11, 0x22, + 0x43, 0x03, 0x12, 0x11, 0x11, 0x11, 0x02, 0x44, 0x10, 0x11, 0x11, 0x22, + 0x12, 0x22, 0x12, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x03, 0x11, 0x21, 0x32, + 0x00, 0x34, 0x20, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x32, + 0x20, 0x32, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x21, 0x43, + 0x00, 0x44, 0x03, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x02, + 0x24, 0x04, 0x10, 0x11, 0x21, 0x22, 0x42, 0x24, 0x22, 0x12, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x04, 0x10, 0x11, 0x21, 0x44, + 0x30, 0x44, 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21, + 0x42, 0x00, 0x11, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x11, 0x21, 0x44, + 0x10, 0x40, 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x22, + 0x04, 0x04, 0x10, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x04, 0x10, 0x11, 0x11, 0x21, 0x44, + 0x34, 0x40, 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x32, + 0x20, 0x30, 0x10, 0x11, 0x21, 0x00, 0x40, 0x04, 0x00, 0x10, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x11, 0x11, 0x21, 0x43, + 0x04, 0x40, 0x03, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x02, + 0x10, 0x02, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x11, 0x11, 0x21, 0x03, 0x10, 0x11, 0x11, 0x11, 0x21, 0x30, + 0x04, 0x30, 0x00, 0x11, 0x11, 0x11, 0x22, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, + 0x43, 0x03, 0x10, 0x11, 0x11, 0x21, 0x32, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x00, 0x00, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x32, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, + 0x21, 0x22, 0x12, 0x11, 0x21, 0x22, 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x21, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x21, 0x32, 0x03, 0x11, 0x11, 0x21, 0x32, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, + 0x22, 0x33, 0x10, 0x11, 0x21, 0x43, 0x44, 0x34, 0x10, 0x11, 0x21, 0x32, + 0x44, 0x34, 0x10, 0x11, 0x21, 0x43, 0x44, 0x44, 0x03, 0x11, 0x21, 0x32, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x21, 0x43, 0x04, 0x11, 0x11, 0x21, 0x33, + 0x00, 0x40, 0x03, 0x11, 0x11, 0x02, 0x00, 0x40, 0x03, 0x11, 0x11, 0x21, + 0x32, 0x44, 0x10, 0x11, 0x21, 0x44, 0x00, 0x00, 0x10, 0x11, 0x21, 0x43, + 0x00, 0x00, 0x10, 0x11, 0x21, 0x33, 0x00, 0x40, 0x03, 0x11, 0x21, 0x43, + 0x00, 0x40, 0x03, 0x11, 0x11, 0x21, 0x40, 0x04, 0x11, 0x11, 0x21, 0x00, + 0x20, 0x42, 0x03, 0x11, 0x11, 0x21, 0x22, 0x33, 0x00, 0x11, 0x11, 0x22, + 0x43, 0x44, 0x10, 0x11, 0x21, 0x44, 0x20, 0x22, 0x12, 0x11, 0x21, 0x44, + 0x20, 0x22, 0x12, 0x11, 0x21, 0x00, 0x20, 0x43, 0x00, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x33, 0x00, 0x11, 0x11, 0x21, 0x43, 0x04, 0x10, 0x11, 0x21, 0x32, + 0x03, 0x44, 0x10, 0x11, 0x21, 0x43, 0x44, 0x34, 0x20, 0x11, 0x21, 0x44, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x11, 0x22, 0x34, 0x10, 0x11, 0x21, 0x43, + 0x22, 0x42, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x21, + 0x32, 0x03, 0x10, 0x11, 0x11, 0x21, 0x00, 0x33, 0x20, 0x11, 0x21, 0x43, + 0x20, 0x44, 0x20, 0x11, 0x21, 0x00, 0x00, 0x40, 0x03, 0x11, 0x21, 0x44, + 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, 0x32, 0x04, 0x10, 0x11, 0x21, 0x42, + 0x44, 0x44, 0x00, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x22, + 0x33, 0x00, 0x11, 0x11, 0x11, 0x11, 0x21, 0x40, 0x03, 0x11, 0x21, 0x43, + 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x11, 0x21, 0x42, 0x03, 0x11, 0x11, 0x21, 0x43, + 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x32, + 0x03, 0x10, 0x11, 0x11, 0x21, 0x22, 0x12, 0x40, 0x04, 0x11, 0x21, 0x00, + 0x00, 0x44, 0x00, 0x11, 0x21, 0x22, 0x12, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x11, 0x21, 0x43, 0x00, 0x11, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x11, 0x22, 0x42, 0x04, 0x22, 0x11, 0x21, 0x43, + 0x20, 0x22, 0x22, 0x11, 0x21, 0x33, 0x20, 0x42, 0x03, 0x11, 0x11, 0x11, + 0x21, 0x44, 0x10, 0x11, 0x21, 0x43, 0x20, 0x42, 0x03, 0x11, 0x21, 0x43, + 0x22, 0x42, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21, 0x43, + 0x22, 0x42, 0x03, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x21, 0x43, + 0x44, 0x44, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, + 0x21, 0x33, 0x10, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x21, 0x30, + 0x44, 0x34, 0x00, 0x11, 0x11, 0x21, 0x33, 0x10, 0x11, 0x11, 0x21, 0x30, + 0x44, 0x34, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x21, 0x00, 0x10, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x02, + 0x00, 0x00, 0x10, 0x11, 0x11, 0x21, 0x00, 0x10, 0x11, 0x11, 0x11, 0x02, + 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22, + 0x22, 0x22, 0x22, 0x12, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x21, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x03, 0x12, 0x11, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x22, 0x43, + 0x44, 0x44, 0x34, 0x20, 0x21, 0x43, 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x43, 0x04, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x32, + 0x34, 0x20, 0x11, 0x11, 0x21, 0x43, 0x03, 0x40, 0x03, 0x11, 0x32, 0x24, + 0x22, 0x22, 0x42, 0x03, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x11, 0x11, + 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x21, + 0x32, 0x44, 0x00, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x02, + 0x43, 0x03, 0x12, 0x11, 0x21, 0x33, 0x20, 0x42, 0x03, 0x11, 0x42, 0x22, + 0x43, 0x34, 0x20, 0x04, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x11, 0x11, + 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x22, + 0x43, 0x04, 0x10, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, + 0x30, 0x34, 0x20, 0x11, 0x21, 0x00, 0x20, 0x43, 0x00, 0x11, 0x42, 0x42, + 0x04, 0x40, 0x03, 0x04, 0x21, 0x43, 0x22, 0x42, 0x04, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x44, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x44, 0x03, 0x11, 0x11, 0x11, 0x22, 0x34, 0x10, 0x11, 0x42, 0x42, + 0x04, 0x42, 0x04, 0x04, 0x21, 0x30, 0x44, 0x44, 0x04, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x44, 0x20, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, + 0x22, 0x44, 0x03, 0x11, 0x11, 0x11, 0x32, 0x04, 0x10, 0x11, 0x42, 0x32, + 0x24, 0x42, 0x04, 0x04, 0x11, 0x02, 0x00, 0x40, 0x04, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x02, + 0x43, 0x04, 0x12, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, + 0x32, 0x34, 0x00, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x42, 0x02, + 0x43, 0x44, 0x44, 0x04, 0x11, 0x22, 0x22, 0x42, 0x03, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x21, + 0x30, 0x44, 0x20, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x22, + 0x43, 0x03, 0x10, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x32, 0x24, + 0x00, 0x00, 0x20, 0x03, 0x11, 0x32, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, + 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x42, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x43, 0x04, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x34, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x02, 0x43, + 0x44, 0x44, 0x34, 0x00, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x21, 0x30, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x03, 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, + 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x11, 0x11, 0x21, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22, + 0x22, 0x22, 0x11, 0x11, 0x21, 0x22, 0x22, 0x22, 0x22, 0x11, 0x21, 0x22, + 0x22, 0x22, 0x22, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x21, 0x22, + 0x12, 0x22, 0x22, 0x11, 0x11, 0x22, 0x43, 0x03, 0x12, 0x11, 0x21, 0x43, + 0x44, 0x34, 0x20, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x21, 0x43, + 0x44, 0x03, 0x12, 0x11, 0x21, 0x43, 0x44, 0x44, 0x03, 0x11, 0x21, 0x43, + 0x44, 0x44, 0x03, 0x11, 0x21, 0x32, 0x44, 0x44, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x21, 0x32, 0x03, 0x33, 0x20, 0x11, 0x21, 0x44, + 0x00, 0x40, 0x03, 0x11, 0x21, 0x43, 0x03, 0x30, 0x03, 0x11, 0x21, 0x44, + 0x00, 0x33, 0x20, 0x11, 0x21, 0x44, 0x00, 0x00, 0x00, 0x11, 0x21, 0x44, + 0x00, 0x00, 0x00, 0x11, 0x21, 0x43, 0x03, 0x00, 0x00, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x43, 0x00, 0x40, 0x03, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x02, 0x00, 0x11, 0x21, 0x44, + 0x10, 0x40, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, + 0x00, 0x00, 0x10, 0x11, 0x21, 0x44, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x22, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x00, 0x10, 0x11, 0x21, 0x44, + 0x44, 0x34, 0x10, 0x11, 0x21, 0x44, 0x20, 0x22, 0x22, 0x11, 0x21, 0x44, + 0x00, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x44, 0x44, 0x00, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x44, 0x34, 0x10, 0x11, 0x21, 0x44, + 0x00, 0x00, 0x10, 0x11, 0x21, 0x44, 0x20, 0x43, 0x03, 0x11, 0x21, 0x44, + 0x44, 0x44, 0x04, 0x11, 0x21, 0x44, 0x22, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x00, 0x40, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x00, 0x10, 0x11, 0x21, 0x44, + 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x20, 0x40, 0x04, 0x11, 0x21, 0x44, + 0x00, 0x40, 0x04, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x02, 0x22, 0x22, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, + 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x00, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x40, 0x04, 0x11, 0x21, 0x44, + 0x22, 0x42, 0x03, 0x11, 0x21, 0x43, 0x23, 0x32, 0x03, 0x11, 0x21, 0x44, + 0x20, 0x33, 0x00, 0x11, 0x21, 0x44, 0x00, 0x00, 0x00, 0x11, 0x21, 0x44, + 0x10, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x40, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x43, + 0x44, 0x34, 0x00, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x21, 0x43, + 0x44, 0x03, 0x10, 0x11, 0x21, 0x43, 0x44, 0x44, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x11, 0x11, 0x11, 0x21, 0x30, 0x44, 0x44, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x21, 0x00, 0x10, 0x02, 0x00, 0x11, 0x21, 0x00, + 0x00, 0x00, 0x10, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x21, 0x00, + 0x00, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, + 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, + 0x10, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, + 0x11, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x11, 0x22, + 0x22, 0x11, 0x11, 0x11, 0x21, 0x22, 0x11, 0x21, 0x22, 0x11, 0x21, 0x22, + 0x12, 0x22, 0x22, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, + 0x11, 0x32, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x11, 0x32, + 0x03, 0x11, 0x11, 0x11, 0x21, 0x03, 0x12, 0x22, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x21, 0x43, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x02, 0x40, 0x04, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x42, 0x03, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x21, 0x34, 0x20, 0x32, 0x04, 0x11, 0x21, 0x44, + 0x20, 0x42, 0x04, 0x11, 0x21, 0x43, 0x00, 0x40, 0x03, 0x11, 0x21, 0x44, + 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x33, 0x00, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x23, 0x43, 0x04, 0x11, 0x21, 0x44, + 0x03, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x44, 0x04, 0x12, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x21, 0x44, + 0x34, 0x40, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x22, 0x42, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x33, 0x20, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x30, 0x40, 0x04, 0x11, 0x21, 0x44, + 0x44, 0x44, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x22, + 0x12, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x40, 0x03, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x00, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x30, 0x44, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x33, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x40, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x00, 0x43, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x11, 0x11, 0x11, 0x11, 0x22, 0x42, 0x04, 0x22, 0x11, 0x21, 0x43, + 0x20, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x40, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x22, 0x22, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x20, 0x40, 0x04, 0x11, 0x21, 0x43, 0x22, 0x42, 0x03, 0x11, 0x21, 0x44, + 0x10, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x21, 0x30, + 0x44, 0x34, 0x00, 0x11, 0x21, 0x33, 0x10, 0x30, 0x03, 0x11, 0x11, 0x42, + 0x44, 0x44, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x21, 0x33, + 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x02, + 0x00, 0x00, 0x10, 0x11, 0x21, 0x00, 0x10, 0x00, 0x00, 0x11, 0x11, 0x02, + 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x10, 0x02, 0x00, 0x11, 0x21, 0x00, + 0x10, 0x02, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x21, 0x00, + 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x21, 0x22, + 0x12, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x21, 0x22, + 0x12, 0x22, 0x22, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x21, 0x43, + 0x44, 0x34, 0x20, 0x11, 0x21, 0x32, 0x44, 0x03, 0x12, 0x11, 0x11, 0x32, + 0x44, 0x44, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x21, 0x43, 0x00, 0x42, 0x03, 0x11, 0x21, 0x44, + 0x00, 0x42, 0x03, 0x11, 0x21, 0x43, 0x00, 0x33, 0x10, 0x11, 0x11, 0x02, + 0x40, 0x04, 0x00, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x42, 0x04, 0x11, 0x21, 0x43, + 0x00, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x43, 0x20, 0x22, 0x12, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x30, 0x42, 0x04, 0x11, 0x21, 0x30, + 0x23, 0x33, 0x00, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x22, 0x43, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x20, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x00, 0x42, 0x04, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x11, 0x02, + 0x44, 0x04, 0x10, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, + 0x44, 0x24, 0x00, 0x11, 0x11, 0x02, 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x43, + 0x23, 0x43, 0x03, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x21, 0x32, + 0x03, 0x33, 0x00, 0x11, 0x21, 0x44, 0x20, 0x42, 0x03, 0x11, 0x21, 0x44, + 0x30, 0x34, 0x02, 0x11, 0x21, 0x22, 0x12, 0x40, 0x04, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x30, + 0x44, 0x34, 0x00, 0x11, 0x21, 0x44, 0x03, 0x43, 0x04, 0x11, 0x21, 0x43, + 0x00, 0x40, 0x03, 0x11, 0x21, 0x43, 0x32, 0x44, 0x02, 0x11, 0x21, 0x44, + 0x00, 0x43, 0x23, 0x11, 0x21, 0x33, 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x43, 0x00, 0x42, 0x03, 0x11, 0x11, 0x02, + 0x43, 0x03, 0x10, 0x11, 0x21, 0x44, 0x00, 0x40, 0x04, 0x11, 0x21, 0x44, + 0x10, 0x42, 0x04, 0x11, 0x21, 0x30, 0x34, 0x30, 0x23, 0x11, 0x21, 0x33, + 0x20, 0x30, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, + 0x32, 0x03, 0x11, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x11, 0x21, + 0x30, 0x00, 0x11, 0x11, 0x21, 0x33, 0x10, 0x30, 0x03, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x11, 0x02, 0x00, 0x02, 0x00, 0x11, 0x21, 0x00, + 0x10, 0x02, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x02, 0x00, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x02, 0x10, 0x11, 0x11, 0x21, 0x00, 0x10, 0x00, 0x00, 0x11, 0x21, 0x00, + 0x10, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, + 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x21, 0x22, + 0x22, 0x22, 0x22, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x21, + 0x42, 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x03, 0x12, 0x11, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x21, 0x43, + 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x00, 0x10, 0x11, 0x21, 0x22, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x44, 0x10, 0x11, 0x11, 0x22, + 0x04, 0x04, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x40, 0x20, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x21, 0x00, + 0x00, 0x40, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21, 0x03, + 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x42, + 0x20, 0x30, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x04, 0x12, 0x11, 0x11, 0x32, 0x04, 0x42, 0x03, 0x11, 0x11, 0x11, + 0x22, 0x43, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21, 0x40, + 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x02, + 0x10, 0x02, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x21, 0x30, 0x10, 0x11, 0x11, 0x02, 0x43, 0x34, 0x00, 0x11, 0x11, 0x21, + 0x32, 0x34, 0x00, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x02, + 0x04, 0x12, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x02, 0x10, 0x11, 0x11, 0x21, 0x40, 0x04, 0x10, 0x11, 0x11, 0x22, + 0x43, 0x03, 0x10, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, + 0x40, 0x20, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x32, + 0x34, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x04, 0x12, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x43, + 0x03, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x21, 0x40, 0x20, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, + 0x20, 0x22, 0x22, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x02, 0x03, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x21, 0x43, + 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x21, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, 0x44, 0x20, 0x12, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x44, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x32, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x43, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x21, + 0x22, 0x42, 0x04, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, + 0x44, 0x20, 0x12, 0x11, 0x11, 0x21, 0x22, 0x22, 0x22, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x42, + 0x04, 0x22, 0x12, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x22, + 0x43, 0x44, 0x04, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x32, + 0x44, 0x34, 0x10, 0x11, 0x11, 0x22, 0x43, 0x44, 0x03, 0x11, 0x11, 0x42, + 0x04, 0x22, 0x12, 0x11, 0x11, 0x42, 0x04, 0x40, 0x03, 0x11, 0x11, 0x42, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x32, 0x04, 0x30, 0x03, 0x11, 0x11, 0x32, + 0x04, 0x40, 0x04, 0x11, 0x11, 0x32, 0x04, 0x40, 0x03, 0x11, 0x11, 0x02, + 0x44, 0x00, 0x10, 0x11, 0x11, 0x32, 0x04, 0x40, 0x04, 0x11, 0x11, 0x42, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x40, 0x03, 0x11, 0x11, 0x42, 0x04, 0x22, 0x22, 0x11, 0x11, 0x42, + 0x04, 0x40, 0x04, 0x11, 0x11, 0x42, 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x40, 0x03, 0x11, 0x11, 0x32, 0x24, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x03, 0x11, 0x11, 0x32, 0x24, 0x32, 0x03, 0x11, 0x11, 0x32, + 0x04, 0x40, 0x04, 0x11, 0x11, 0x32, 0x04, 0x00, 0x00, 0x11, 0x11, 0x21, + 0x44, 0x10, 0x11, 0x11, 0x11, 0x32, 0x24, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x04, 0x11, 0x11, 0x02, 0x43, 0x44, 0x03, 0x11, 0x11, 0x32, + 0x44, 0x34, 0x00, 0x11, 0x11, 0x02, 0x43, 0x34, 0x00, 0x11, 0x11, 0x02, + 0x43, 0x44, 0x03, 0x11, 0x11, 0x02, 0x43, 0x34, 0x10, 0x11, 0x11, 0x21, + 0x33, 0x10, 0x11, 0x11, 0x11, 0x22, 0x43, 0x44, 0x04, 0x11, 0x11, 0x32, + 0x03, 0x32, 0x03, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x11, 0x11, 0x02, + 0x00, 0x00, 0x10, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x21, + 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x21, + 0x00, 0x10, 0x11, 0x11, 0x11, 0x22, 0x22, 0x42, 0x03, 0x11, 0x11, 0x02, + 0x00, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x22, 0x22, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x43, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x32, 0x03, 0x11, 0x11, 0x42, 0x04, 0x22, 0x22, 0x11, 0x11, 0x21, + 0x40, 0x04, 0x11, 0x11, 0x21, 0x22, 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x22, 0x22, 0x11, 0x11, 0x42, 0x04, 0x32, 0x03, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x43, 0x44, 0x34, 0x20, 0x11, 0x11, 0x32, + 0x44, 0x34, 0x20, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x21, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x32, 0x03, 0x11, 0x11, 0x42, 0x24, 0x33, 0x00, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x40, 0x42, 0x03, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x03, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x22, + 0x43, 0x34, 0x20, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x11, 0x42, 0x44, 0x04, 0x10, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x40, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x04, 0x11, 0x11, 0x32, 0x04, 0x40, 0x03, 0x11, 0x11, 0x32, + 0x04, 0x40, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x11, 0x42, 0x04, 0x33, 0x20, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x30, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x42, 0x04, 0x11, 0x11, 0x42, 0x04, 0x42, 0x03, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x00, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x04, 0x11, 0x11, 0x32, 0x24, 0x42, 0x03, 0x11, 0x11, 0x42, + 0x24, 0x42, 0x03, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x42, 0x04, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x11, 0x11, + 0x32, 0x03, 0x11, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x11, 0x32, + 0x03, 0x32, 0x03, 0x11, 0x11, 0x02, 0x43, 0x34, 0x00, 0x11, 0x11, 0x42, + 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x32, + 0x03, 0x42, 0x03, 0x11, 0x11, 0x02, 0x00, 0x02, 0x00, 0x11, 0x11, 0x11, + 0x02, 0x00, 0x11, 0x11, 0x21, 0x00, 0x10, 0x02, 0x00, 0x11, 0x11, 0x02, + 0x00, 0x02, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x42, + 0x04, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, + 0x43, 0x34, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, + 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, + 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, + 0x12, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x12, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x21, + 0x32, 0x03, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x32, + 0x23, 0x34, 0x10, 0x11, 0x11, 0x22, 0x43, 0x34, 0x10, 0x11, 0x11, 0x21, + 0x43, 0x34, 0x10, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x11, 0x32, + 0x03, 0x32, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x43, + 0x20, 0x42, 0x03, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x42, + 0x34, 0x00, 0x10, 0x11, 0x11, 0x32, 0x04, 0x00, 0x10, 0x11, 0x11, 0x21, + 0x40, 0x04, 0x10, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x42, 0x04, 0x11, 0x21, 0x30, + 0x23, 0x33, 0x00, 0x11, 0x11, 0x32, 0x04, 0x40, 0x03, 0x11, 0x11, 0x42, + 0x04, 0x10, 0x11, 0x11, 0x11, 0x32, 0x44, 0x03, 0x12, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x42, 0x04, 0x11, 0x21, 0x44, 0x30, 0x42, 0x04, 0x11, 0x11, 0x22, + 0x44, 0x04, 0x10, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x11, 0x02, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x24, 0x42, 0x03, 0x11, 0x21, 0x44, 0x40, 0x42, 0x04, 0x11, 0x21, 0x32, + 0x03, 0x33, 0x00, 0x11, 0x11, 0x32, 0x24, 0x42, 0x04, 0x11, 0x11, 0x42, + 0x04, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x42, 0x04, 0x10, 0x11, 0x11, 0x32, 0x04, 0x42, 0x04, 0x11, 0x11, 0x32, + 0x24, 0x33, 0x00, 0x11, 0x21, 0x44, 0x30, 0x42, 0x03, 0x11, 0x21, 0x43, + 0x00, 0x40, 0x03, 0x11, 0x11, 0x02, 0x43, 0x44, 0x04, 0x11, 0x11, 0x32, + 0x03, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x03, 0x10, 0x11, 0x11, 0x11, + 0x32, 0x34, 0x10, 0x11, 0x11, 0x02, 0x43, 0x44, 0x03, 0x11, 0x11, 0x02, + 0x43, 0x03, 0x10, 0x11, 0x21, 0x43, 0x03, 0x33, 0x00, 0x11, 0x21, 0x33, + 0x10, 0x32, 0x03, 0x11, 0x11, 0x21, 0x00, 0x40, 0x04, 0x11, 0x11, 0x02, + 0x00, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x00, 0x10, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, + 0x00, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x10, 0x11, 0x21, 0x00, + 0x10, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, + 0x22, 0x12, 0x11, 0x11, 0x11, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x32, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x32, 0x10, 0x11, 0x11, 0x11, 0x32, 0x34, 0x20, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x10, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x02, 0x43, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, + 0x22, 0x22, 0x22, 0x11, 0x11, 0x21, 0x44, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x21, 0x40, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x32, + 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x11, 0x02, + 0x00, 0x42, 0x03, 0x11, 0x11, 0x22, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x12, 0x11, 0x11, 0x21, + 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x11, + 0x22, 0x33, 0x00, 0x11, 0x11, 0x42, 0x04, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x44, 0x10, 0x11, 0x11, 0x22, + 0x34, 0x20, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x21, + 0x32, 0x03, 0x10, 0x11, 0x11, 0x42, 0x04, 0x12, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x22, 0x44, 0x10, 0x11, 0x11, 0x32, + 0x00, 0x43, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x04, 0x42, 0x04, 0x11, 0x11, 0x22, + 0x33, 0x00, 0x11, 0x11, 0x11, 0x02, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x10, 0x11, 0x11, 0x02, + 0x20, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x43, 0x44, 0x04, 0x11, 0x11, 0x32, + 0x04, 0x22, 0x22, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x42, 0x03, 0x11, 0x11, 0x32, + 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x20, 0x11, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x21, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x33, 0x00, 0x11, 0x11, 0x02, + 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, 0x43, 0x03, 0x12, 0x11, 0x11, 0x11, + 0x42, 0x10, 0x11, 0x11, 0x11, 0x22, 0x43, 0x03, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x03, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x30, 0x34, 0x10, 0x11, 0x11, 0x11, + 0x32, 0x10, 0x11, 0x11, 0x11, 0x32, 0x34, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x10, 0x11, 0x11, 0x11, + 0x02, 0x10, 0x11, 0x11, 0x11, 0x02, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11 +}; + +const size_t ttyfont_size = sizeof ttyfont; diff --git a/src/drv/tty/src/setdim.c b/src/drv/tty/src/setdim.c new file mode 100644 index 0000000..3170197 --- /dev/null +++ b/src/drv/tty/src/setdim.c @@ -0,0 +1,62 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <drv/event.h> +#include <drv/tty.h> +#include <drv/tty/font.h> +#include <drv/tty/ops.h> +#include <drv/tty/types.h> +#include <gfx/gfx.h> +#include <gfx/sprite.h> +#include <stddef.h> +#include <stdlib.h> + +int drv_tty_setdim(struct drv_port *const p, const unsigned w, const unsigned h) +{ + const unsigned columns = w / 8, rows = h / 14; + struct row *const prs = malloc(rows * sizeof *prs); + + if (!prs) + goto failure; + + for (unsigned i = 0; i < rows; i++) + *(prs + i) = (const struct row){0}; + + for (unsigned i = 0; i < rows; i++) + { + struct row *const p = &prs[i]; + char *const c = malloc(columns); + + if (!c) + goto failure; + + p->columns = c; + } + + p->first_row = p->last_row = p->rows = prs; + p->nrows = rows; + p->ncolumns = columns; + return 0; + +failure: + for (unsigned i = 0; i < rows; i++) + free(prs[i].columns); + + free(prs); + return -1; +} diff --git a/src/drv/tty/src/update.c b/src/drv/tty/src/update.c new file mode 100644 index 0000000..b65f3f0 --- /dev/null +++ b/src/drv/tty/src/update.c @@ -0,0 +1,104 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <drv/event.h> +#include <drv/tty.h> +#include <drv/tty/font.h> +#include <drv/tty/ops.h> +#include <drv/tty/types.h> +#include <gfx/gfx.h> +#include <gfx/sprite.h> +#include <stdbool.h> + +static int init(struct drv_port *const p) +{ + const struct drv_event *const ev = &p->ev; + const struct drv_event_ops ops = + { + .write = drv_tty_write, + .args = p + }; + + if (p->init) + return 0; + else if (ev->status("tty", &ops, true, ev->args)) + return -1; + + p->init = true; + return 0; +} + +static int draw(struct drv_port *const p) +{ + short y = 0; + const struct row *r = p->first_row, *last = p->last_row + 1; + + if (last - p->rows >= p->nrows) + last = p->rows; + + for (;;) + { + short x = 0; + + for (const char *c = r->columns; + *c && c - r->columns < p->ncolumns; c++, x += 8) + { + if (*c == ' ') + continue; + + struct gfx_sprite *const s = gfx_sprite_get(); + const char ch = *c - '!'; + const short u = (12 * ch) % ttyfont_spr.w; + const short v = 14 * ((12 * ch) / ttyfont_spr.w); + + if (!s || gfx_sprite_clone(&ttyfont_spr, s)) + return -1; + + /* TODO: replace hardcoded values */ + s->x = x; + s->y = y; + s->w = 12; + s->h = 14; + s->u += u; + s->v += v; + + if (gfx_sprite_sort(s)) + return -1; + } + + if (++r - p->rows >= p->nrows) + r = p->rows; + + if (r == last) + break; + + y += 14; + } + + return gfx_draw(); +} + +int drv_tty_update(struct drv_port *const p) +{ + if (init(p)) + return -1; + else if (!gfx_ready()) + return 0; + + return draw(p); +} diff --git a/src/drv/tty/src/write.c b/src/drv/tty/src/write.c new file mode 100644 index 0000000..6af6113 --- /dev/null +++ b/src/drv/tty/src/write.c @@ -0,0 +1,62 @@ +/* + * wanix, a Unix-like operating system for WebAssembly applications. + * Copyright (C) 2025 Xavier Del Campo Romero + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <drv/event.h> +#include <drv/tty.h> +#include <drv/tty/types.h> +#include <drv/tty/ops.h> +#include <errno.h> +#include <stddef.h> + +int drv_tty_write(const void *const buf, const size_t n, + const struct drv_event_done *const d, void *const args) +{ + struct drv_port *const p = args; + + for (const char *s = buf; s - (const char *)buf < n; s++) + { + char *const col = &p->last_row->columns[p->last_column]; + + if (*s == '\r') + { + *col = '\0'; + p->last_column = 0; + } + else + { + if (*s != '\n') + *col = *s; + + if (*s == '\n' || ++p->last_column >= p->ncolumns - 1) + { + if (++p->last_row - p->rows >= p->nrows) + { + p->last_row = p->rows; + + if (++p->first_row - p->rows >= p->nrows) + p->first_row = p->rows; + } + + col[p->last_column] = '\0'; + p->last_column = 0; + } + } + } + + return d->f(SUCCESS, d->args); +} |
